(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.mapboxgl = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0) { area += Math.abs(ringArea(coords[0])); for (var i = 1; i < coords.length; i++) { area -= Math.abs(ringArea(coords[i])); } } return area; } /** * Calculate the approximate area of the polygon were it projected onto * the earth. Note that this area will be positive if ring is oriented * clockwise, otherwise it will be negative. * * Reference: * Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for * Polygons on a Sphere", JPL Publication 07-03, Jet Propulsion * Laboratory, Pasadena, CA, June 2007 http://trs-new.jpl.nasa.gov/dspace/handle/2014/40409 * * Returns: * {float} The approximate signed geodesic area of the polygon in square * meters. */ function ringArea(coords) { var p1, p2, p3, lowerIndex, middleIndex, upperIndex, i, area = 0, coordsLength = coords.length; if (coordsLength > 2) { for (i = 0; i < coordsLength; i++) { if (i === coordsLength - 2) {// i = N-2 lowerIndex = coordsLength - 2; middleIndex = coordsLength -1; upperIndex = 0; } else if (i === coordsLength - 1) {// i = N-1 lowerIndex = coordsLength - 1; middleIndex = 0; upperIndex = 1; } else { // i = 0 to N-3 lowerIndex = i; middleIndex = i+1; upperIndex = i+2; } p1 = coords[lowerIndex]; p2 = coords[middleIndex]; p3 = coords[upperIndex]; area += ( rad(p3[0]) - rad(p1[0]) ) * Math.sin( rad(p2[1])); } area = area * wgs84.RADIUS * wgs84.RADIUS / 2; } return area; } function rad(_) { return _ * Math.PI / 180; } },{"wgs84":42}],2:[function(require,module,exports){ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global.glMatrix = factory()); }(this, (function () { 'use strict'; function create() { var out = new Float32Array(3); out[0] = 0; out[1] = 0; out[2] = 0; return out; } function transformMat3(out, a, m) { var x = a[0], y = a[1], z = a[2]; out[0] = x * m[0] + y * m[3] + z * m[6]; out[1] = x * m[1] + y * m[4] + z * m[7]; out[2] = x * m[2] + y * m[5] + z * m[8]; return out; } var vec = create(); function create$1() { var out = new Float32Array(4); out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 0; return out; } function scale$1(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; return out; } function normalize$1(out, a) { var x = a[0], y = a[1], z = a[2], w = a[3]; var len = x * x + y * y + z * z + w * w; if (len > 0) { len = 1 / Math.sqrt(len); out[0] = x * len; out[1] = y * len; out[2] = z * len; out[3] = w * len; } return out; } function transformMat4$1(out, a, m) { var x = a[0], y = a[1], z = a[2], w = a[3]; out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w; out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w; out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w; out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w; return out; } var vec$1 = create$1(); function create$2() { var out = new Float32Array(4); out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 1; return out; } function rotate(out, a, rad) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], s = Math.sin(rad), c = Math.cos(rad); out[0] = a0 * c + a2 * s; out[1] = a1 * c + a3 * s; out[2] = a0 * -s + a2 * c; out[3] = a1 * -s + a3 * c; return out; } function scale$2(out, a, v) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], v0 = v[0], v1 = v[1]; out[0] = a0 * v0; out[1] = a1 * v0; out[2] = a2 * v1; out[3] = a3 * v1; return out; } function create$3() { var out = new Float32Array(9); out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 1; out[5] = 0; out[6] = 0; out[7] = 0; out[8] = 1; return out; } function fromRotation$1(out, rad) { var s = Math.sin(rad), c = Math.cos(rad); out[0] = c; out[1] = s; out[2] = 0; out[3] = -s; out[4] = c; out[5] = 0; out[6] = 0; out[7] = 0; out[8] = 1; return out; } function create$4() { var out = new Float32Array(16); out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } function identity$2(out) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } function invert$2(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], b00 = a00 * a11 - a01 * a10, b01 = a00 * a12 - a02 * a10, b02 = a00 * a13 - a03 * a10, b03 = a01 * a12 - a02 * a11, b04 = a01 * a13 - a03 * a11, b05 = a02 * a13 - a03 * a12, b06 = a20 * a31 - a21 * a30, b07 = a20 * a32 - a22 * a30, b08 = a20 * a33 - a23 * a30, b09 = a21 * a32 - a22 * a31, b10 = a21 * a33 - a23 * a31, b11 = a22 * a33 - a23 * a32, det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; if (!det) { return null; } det = 1.0 / det; out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; return out; } function multiply$4(out, a, b) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7]; out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11]; out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15]; out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; return out; } function translate$1(out, a, v) { var x = v[0], y = v[1], z = v[2], a00, a01, a02, a03, a10, a11, a12, a13, a20, a21, a22, a23; if (a === out) { out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]; } else { a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03; out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13; out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23; out[12] = a00 * x + a10 * y + a20 * z + a[12]; out[13] = a01 * x + a11 * y + a21 * z + a[13]; out[14] = a02 * x + a12 * y + a22 * z + a[14]; out[15] = a03 * x + a13 * y + a23 * z + a[15]; } return out; } function scale$4(out, a, v) { var x = v[0], y = v[1], z = v[2]; out[0] = a[0] * x; out[1] = a[1] * x; out[2] = a[2] * x; out[3] = a[3] * x; out[4] = a[4] * y; out[5] = a[5] * y; out[6] = a[6] * y; out[7] = a[7] * y; out[8] = a[8] * z; out[9] = a[9] * z; out[10] = a[10] * z; out[11] = a[11] * z; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; return out; } function rotateX$1(out, a, rad) { var s = Math.sin(rad), c = Math.cos(rad), a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; if (a !== out) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; } out[4] = a10 * c + a20 * s; out[5] = a11 * c + a21 * s; out[6] = a12 * c + a22 * s; out[7] = a13 * c + a23 * s; out[8] = a20 * c - a10 * s; out[9] = a21 * c - a11 * s; out[10] = a22 * c - a12 * s; out[11] = a23 * c - a13 * s; return out; } function rotateZ$1(out, a, rad) { var s = Math.sin(rad), c = Math.cos(rad), a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; if (a !== out) { out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; } out[0] = a00 * c + a10 * s; out[1] = a01 * c + a11 * s; out[2] = a02 * c + a12 * s; out[3] = a03 * c + a13 * s; out[4] = a10 * c - a00 * s; out[5] = a11 * c - a01 * s; out[6] = a12 * c - a02 * s; out[7] = a13 * c - a03 * s; return out; } function perspective(out, fovy, aspect, near, far) { var f = 1.0 / Math.tan(fovy / 2), nf = 1 / (near - far); out[0] = f / aspect; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = f; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = (far + near) * nf; out[11] = -1; out[12] = 0; out[13] = 0; out[14] = (2 * far * near) * nf; out[15] = 0; return out; } function ortho(out, left, right, bottom, top, near, far) { var lr = 1 / (left - right), bt = 1 / (bottom - top), nf = 1 / (near - far); out[0] = -2 * lr; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = -2 * bt; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 2 * nf; out[11] = 0; out[12] = (left + right) * lr; out[13] = (top + bottom) * bt; out[14] = (far + near) * nf; out[15] = 1; return out; } var mapboxBuild = { vec3: { transformMat3: transformMat3 }, vec4: { transformMat4: transformMat4$1 }, mat2: { create: create$2, rotate: rotate, scale: scale$2 }, mat3: { create: create$3, fromRotation: fromRotation$1 }, mat4: { create: create$4, identity: identity$2, translate: translate$1, scale: scale$4, multiply: multiply$4, perspective: perspective, rotateX: rotateX$1, rotateZ: rotateZ$1, invert: invert$2, ortho: ortho } }; return mapboxBuild; }))); },{}],3:[function(require,module,exports){ 'use strict'; if (typeof module !== 'undefined' && module.exports) { module.exports = isSupported; } else if (window) { window.mapboxgl = window.mapboxgl || {}; window.mapboxgl.supported = isSupported; } /** * Test whether the current browser supports Mapbox GL JS * @param {Object} options * @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false` * if the performance of Mapbox GL JS would be dramatically worse than * expected (i.e. a software renderer is would be used) * @return {boolean} */ function isSupported(options) { return !!( isBrowser() && isArraySupported() && isFunctionSupported() && isObjectSupported() && isJSONSupported() && isWorkerSupported() && isUint8ClampedArraySupported() && isWebGLSupportedCached(options && options.failIfMajorPerformanceCaveat) ); } function isBrowser() { return typeof window !== 'undefined' && typeof document !== 'undefined'; } function isArraySupported() { return ( Array.prototype && Array.prototype.every && Array.prototype.filter && Array.prototype.forEach && Array.prototype.indexOf && Array.prototype.lastIndexOf && Array.prototype.map && Array.prototype.some && Array.prototype.reduce && Array.prototype.reduceRight && Array.isArray ); } function isFunctionSupported() { return Function.prototype && Function.prototype.bind; } function isObjectSupported() { return ( Object.keys && Object.create && Object.getPrototypeOf && Object.getOwnPropertyNames && Object.isSealed && Object.isFrozen && Object.isExtensible && Object.getOwnPropertyDescriptor && Object.defineProperty && Object.defineProperties && Object.seal && Object.freeze && Object.preventExtensions ); } function isJSONSupported() { return 'JSON' in window && 'parse' in JSON && 'stringify' in JSON; } function isWorkerSupported() { if (!('Worker' in window && 'Blob' in window)) { return false; } var blob = new Blob([''], { type: 'text/javascript' }); var workerURL = URL.createObjectURL(blob); var supported; var worker; try { worker = new Worker(workerURL); supported = true; } catch (e) { supported = false; } if (worker) { worker.terminate(); } URL.revokeObjectURL(workerURL); return supported; } // IE11 only supports `Uint8ClampedArray` as of version // [KB2929437](https://support.microsoft.com/en-us/kb/2929437) function isUint8ClampedArraySupported() { return 'Uint8ClampedArray' in window; } var isWebGLSupportedCache = {}; function isWebGLSupportedCached(failIfMajorPerformanceCaveat) { if (isWebGLSupportedCache[failIfMajorPerformanceCaveat] === undefined) { isWebGLSupportedCache[failIfMajorPerformanceCaveat] = isWebGLSupported(failIfMajorPerformanceCaveat); } return isWebGLSupportedCache[failIfMajorPerformanceCaveat]; } isSupported.webGLContextAttributes = { antialias: false, alpha: true, stencil: true, depth: true }; function isWebGLSupported(failIfMajorPerformanceCaveat) { var canvas = document.createElement('canvas'); var attributes = Object.create(isSupported.webGLContextAttributes); attributes.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat; if (canvas.probablySupportsContext) { return ( canvas.probablySupportsContext('webgl', attributes) || canvas.probablySupportsContext('experimental-webgl', attributes) ); } else if (canvas.supportsContext) { return ( canvas.supportsContext('webgl', attributes) || canvas.supportsContext('experimental-webgl', attributes) ); } else { return ( canvas.getContext('webgl', attributes) || canvas.getContext('experimental-webgl', attributes) ); } } },{}],4:[function(require,module,exports){ 'use strict'; module.exports = Point; /** * A standalone point geometry with useful accessor, comparison, and * modification methods. * * @class Point * @param {Number} x the x-coordinate. this could be longitude or screen * pixels, or any other sort of unit. * @param {Number} y the y-coordinate. this could be latitude or screen * pixels, or any other sort of unit. * @example * var point = new Point(-77, 38); */ function Point(x, y) { this.x = x; this.y = y; } Point.prototype = { /** * Clone this point, returning a new point that can be modified * without affecting the old one. * @return {Point} the clone */ clone: function() { return new Point(this.x, this.y); }, /** * Add this point's x & y coordinates to another point, * yielding a new point. * @param {Point} p the other point * @return {Point} output point */ add: function(p) { return this.clone()._add(p); }, /** * Subtract this point's x & y coordinates to from point, * yielding a new point. * @param {Point} p the other point * @return {Point} output point */ sub: function(p) { return this.clone()._sub(p); }, /** * Multiply this point's x & y coordinates by point, * yielding a new point. * @param {Point} p the other point * @return {Point} output point */ multByPoint: function(p) { return this.clone()._multByPoint(p); }, /** * Divide this point's x & y coordinates by point, * yielding a new point. * @param {Point} p the other point * @return {Point} output point */ divByPoint: function(p) { return this.clone()._divByPoint(p); }, /** * Multiply this point's x & y coordinates by a factor, * yielding a new point. * @param {Point} k factor * @return {Point} output point */ mult: function(k) { return this.clone()._mult(k); }, /** * Divide this point's x & y coordinates by a factor, * yielding a new point. * @param {Point} k factor * @return {Point} output point */ div: function(k) { return this.clone()._div(k); }, /** * Rotate this point around the 0, 0 origin by an angle a, * given in radians * @param {Number} a angle to rotate around, in radians * @return {Point} output point */ rotate: function(a) { return this.clone()._rotate(a); }, /** * Rotate this point around p point by an angle a, * given in radians * @param {Number} a angle to rotate around, in radians * @param {Point} p Point to rotate around * @return {Point} output point */ rotateAround: function(a,p) { return this.clone()._rotateAround(a,p); }, /** * Multiply this point by a 4x1 transformation matrix * @param {Array} m transformation matrix * @return {Point} output point */ matMult: function(m) { return this.clone()._matMult(m); }, /** * Calculate this point but as a unit vector from 0, 0, meaning * that the distance from the resulting point to the 0, 0 * coordinate will be equal to 1 and the angle from the resulting * point to the 0, 0 coordinate will be the same as before. * @return {Point} unit vector point */ unit: function() { return this.clone()._unit(); }, /** * Compute a perpendicular point, where the new y coordinate * is the old x coordinate and the new x coordinate is the old y * coordinate multiplied by -1 * @return {Point} perpendicular point */ perp: function() { return this.clone()._perp(); }, /** * Return a version of this point with the x & y coordinates * rounded to integers. * @return {Point} rounded point */ round: function() { return this.clone()._round(); }, /** * Return the magitude of this point: this is the Euclidean * distance from the 0, 0 coordinate to this point's x and y * coordinates. * @return {Number} magnitude */ mag: function() { return Math.sqrt(this.x * this.x + this.y * this.y); }, /** * Judge whether this point is equal to another point, returning * true or false. * @param {Point} other the other point * @return {boolean} whether the points are equal */ equals: function(other) { return this.x === other.x && this.y === other.y; }, /** * Calculate the distance from this point to another point * @param {Point} p the other point * @return {Number} distance */ dist: function(p) { return Math.sqrt(this.distSqr(p)); }, /** * Calculate the distance from this point to another point, * without the square root step. Useful if you're comparing * relative distances. * @param {Point} p the other point * @return {Number} distance */ distSqr: function(p) { var dx = p.x - this.x, dy = p.y - this.y; return dx * dx + dy * dy; }, /** * Get the angle from the 0, 0 coordinate to this point, in radians * coordinates. * @return {Number} angle */ angle: function() { return Math.atan2(this.y, this.x); }, /** * Get the angle from this point to another point, in radians * @param {Point} b the other point * @return {Number} angle */ angleTo: function(b) { return Math.atan2(this.y - b.y, this.x - b.x); }, /** * Get the angle between this point and another point, in radians * @param {Point} b the other point * @return {Number} angle */ angleWith: function(b) { return this.angleWithSep(b.x, b.y); }, /* * Find the angle of the two vectors, solving the formula for * the cross product a x b = |a||b|sin(θ) for θ. * @param {Number} x the x-coordinate * @param {Number} y the y-coordinate * @return {Number} the angle in radians */ angleWithSep: function(x, y) { return Math.atan2( this.x * y - this.y * x, this.x * x + this.y * y); }, _matMult: function(m) { var x = m[0] * this.x + m[1] * this.y, y = m[2] * this.x + m[3] * this.y; this.x = x; this.y = y; return this; }, _add: function(p) { this.x += p.x; this.y += p.y; return this; }, _sub: function(p) { this.x -= p.x; this.y -= p.y; return this; }, _mult: function(k) { this.x *= k; this.y *= k; return this; }, _div: function(k) { this.x /= k; this.y /= k; return this; }, _multByPoint: function(p) { this.x *= p.x; this.y *= p.y; return this; }, _divByPoint: function(p) { this.x /= p.x; this.y /= p.y; return this; }, _unit: function() { this._div(this.mag()); return this; }, _perp: function() { var y = this.y; this.y = this.x; this.x = -y; return this; }, _rotate: function(angle) { var cos = Math.cos(angle), sin = Math.sin(angle), x = cos * this.x - sin * this.y, y = sin * this.x + cos * this.y; this.x = x; this.y = y; return this; }, _rotateAround: function(angle, p) { var cos = Math.cos(angle), sin = Math.sin(angle), x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y), y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y); this.x = x; this.y = y; return this; }, _round: function() { this.x = Math.round(this.x); this.y = Math.round(this.y); return this; } }; /** * Construct a point from an array if necessary, otherwise if the input * is already a Point, or an unknown type, return it unchanged * @param {Array|Point|*} a any kind of input value * @return {Point} constructed point, or passed-through value. * @example * // this * var point = Point.convert([0, 1]); * // is equivalent to * var point = new Point(0, 1); */ Point.convert = function (a) { if (a instanceof Point) { return a; } if (Array.isArray(a)) { return new Point(a[0], a[1]); } return a; }; },{}],5:[function(require,module,exports){ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global.ShelfPack = factory()); }(this, (function () { /** * Create a new ShelfPack bin allocator. * * Uses the Shelf Best Height Fit algorithm from * http://clb.demon.fi/files/RectangleBinPack.pdf * * @class ShelfPack * @param {number} [w=64] Initial width of the sprite * @param {number} [h=64] Initial width of the sprite * @param {Object} [options] * @param {boolean} [options.autoResize=false] If `true`, the sprite will automatically grow * @example * var sprite = new ShelfPack(64, 64, { autoResize: false }); */ function ShelfPack$1(w, h, options) { options = options || {}; this.w = w || 64; this.h = h || 64; this.autoResize = !!options.autoResize; this.shelves = []; this.freebins = []; this.stats = {}; this.bins = {}; this.maxId = 0; } /** * Batch pack multiple bins into the sprite. * * @param {Object[]} bins Array of requested bins - each object should have `width`, `height` (or `w`, `h`) properties * @param {number} bins[].w Requested bin width * @param {number} bins[].h Requested bin height * @param {Object} [options] * @param {boolean} [options.inPlace=false] If `true`, the supplied bin objects will be updated inplace with `x` and `y` properties * @returns {Bin[]} Array of allocated Bins - each Bin is an object with `id`, `x`, `y`, `w`, `h` properties * @example * var bins = [ * { id: 1, w: 12, h: 12 }, * { id: 2, w: 12, h: 16 }, * { id: 3, w: 12, h: 24 } * ]; * var results = sprite.pack(bins, { inPlace: false }); */ ShelfPack$1.prototype.pack = function(bins, options) { bins = [].concat(bins); options = options || {}; var results = [], w, h, id, allocation; for (var i = 0; i < bins.length; i++) { w = bins[i].w || bins[i].width; h = bins[i].h || bins[i].height; id = bins[i].id; if (w && h) { allocation = this.packOne(w, h, id); if (!allocation) { continue; } if (options.inPlace) { bins[i].x = allocation.x; bins[i].y = allocation.y; bins[i].id = allocation.id; } results.push(allocation); } } this.shrink(); return results; }; /** * Pack a single bin into the sprite. * * Each bin will have a unique identitifer. * If no identifier is supplied in the `id` parameter, one will be created. * Note: The supplied `id` is used as an object index, so numeric values are fastest! * * Bins are automatically refcounted (i.e. a newly packed Bin will have a refcount of 1). * When a bin is no longer needed, use the `ShelfPack.unref` function to mark it * as unused. When a Bin's refcount decrements to 0, the Bin will be marked * as free and its space may be reused by the packing code. * * @param {number} w Width of the bin to allocate * @param {number} h Height of the bin to allocate * @param {number|string} [id] Unique identifier for this bin, (if unsupplied, assume it's a new bin and create an id) * @returns {Bin} Bin object with `id`, `x`, `y`, `w`, `h` properties, or `null` if allocation failed * @example * var results = sprite.packOne(12, 16, 'a'); */ ShelfPack$1.prototype.packOne = function(w, h, id) { var best = { freebin: -1, shelf: -1, waste: Infinity }, y = 0, bin, shelf, waste, i; // if id was supplied, attempt a lookup.. if (typeof id === 'string' || typeof id === 'number') { bin = this.getBin(id); if (bin) { // we packed this bin already this.ref(bin); return bin; } if (typeof id === 'number') { this.maxId = Math.max(id, this.maxId); } } else { id = ++this.maxId; } // First try to reuse a free bin.. for (i = 0; i < this.freebins.length; i++) { bin = this.freebins[i]; // exactly the right height and width, use it.. if (h === bin.maxh && w === bin.maxw) { return this.allocFreebin(i, w, h, id); } // not enough height or width, skip it.. if (h > bin.maxh || w > bin.maxw) { continue; } // extra height or width, minimize wasted area.. if (h <= bin.maxh && w <= bin.maxw) { waste = (bin.maxw * bin.maxh) - (w * h); if (waste < best.waste) { best.waste = waste; best.freebin = i; } } } // Next find the best shelf.. for (i = 0; i < this.shelves.length; i++) { shelf = this.shelves[i]; y += shelf.h; // not enough width on this shelf, skip it.. if (w > shelf.free) { continue; } // exactly the right height, pack it.. if (h === shelf.h) { return this.allocShelf(i, w, h, id); } // not enough height, skip it.. if (h > shelf.h) { continue; } // extra height, minimize wasted area.. if (h < shelf.h) { waste = (shelf.h - h) * w; if (waste < best.waste) { best.freebin = -1; best.waste = waste; best.shelf = i; } } } if (best.freebin !== -1) { return this.allocFreebin(best.freebin, w, h, id); } if (best.shelf !== -1) { return this.allocShelf(best.shelf, w, h, id); } // No free bins or shelves.. add shelf.. if (h <= (this.h - y) && w <= this.w) { shelf = new Shelf(y, this.w, h); return this.allocShelf(this.shelves.push(shelf) - 1, w, h, id); } // No room for more shelves.. // If `autoResize` option is set, grow the sprite as follows: // * double whichever sprite dimension is smaller (`w1` or `h1`) // * if sprite dimensions are equal, grow width before height // * accomodate very large bin requests (big `w` or `h`) if (this.autoResize) { var h1, h2, w1, w2; h1 = h2 = this.h; w1 = w2 = this.w; if (w1 <= h1 || w > w1) { // grow width.. w2 = Math.max(w, w1) * 2; } if (h1 < w1 || h > h1) { // grow height.. h2 = Math.max(h, h1) * 2; } this.resize(w2, h2); return this.packOne(w, h, id); // retry } return null; }; /** * Called by packOne() to allocate a bin by reusing an existing freebin * * @private * @param {number} index Index into the `this.freebins` array * @param {number} w Width of the bin to allocate * @param {number} h Height of the bin to allocate * @param {number|string} id Unique identifier for this bin * @returns {Bin} Bin object with `id`, `x`, `y`, `w`, `h` properties * @example * var bin = sprite.allocFreebin(0, 12, 16, 'a'); */ ShelfPack$1.prototype.allocFreebin = function (index, w, h, id) { var bin = this.freebins.splice(index, 1)[0]; bin.id = id; bin.w = w; bin.h = h; bin.refcount = 0; this.bins[id] = bin; this.ref(bin); return bin; }; /** * Called by `packOne() to allocate bin on an existing shelf * * @private * @param {number} index Index into the `this.shelves` array * @param {number} w Width of the bin to allocate * @param {number} h Height of the bin to allocate * @param {number|string} id Unique identifier for this bin * @returns {Bin} Bin object with `id`, `x`, `y`, `w`, `h` properties * @example * var results = sprite.allocShelf(0, 12, 16, 'a'); */ ShelfPack$1.prototype.allocShelf = function(index, w, h, id) { var shelf = this.shelves[index]; var bin = shelf.alloc(w, h, id); this.bins[id] = bin; this.ref(bin); return bin; }; /** * Shrink the width/height of the sprite to the bare minimum. * Since shelf-pack doubles first width, then height when running out of shelf space * this can result in fairly large unused space both in width and height if that happens * towards the end of bin packing. */ ShelfPack$1.prototype.shrink = function() { if (this.shelves.length > 0) { var w2 = 0; var h2 = 0; for (var j = 0; j < this.shelves.length; j++) { var shelf = this.shelves[j]; h2 += shelf.h; w2 = Math.max(shelf.w - shelf.free, w2); } this.resize(w2, h2); } }; /** * Return a packed bin given its id, or undefined if the id is not found * * @param {number|string} id Unique identifier for this bin, * @returns {Bin} The requested bin, or undefined if not yet packed * @example * var b = sprite.getBin('a'); */ ShelfPack$1.prototype.getBin = function(id) { return this.bins[id]; }; /** * Increment the ref count of a bin and update statistics. * * @param {Bin} bin Bin instance * @returns {number} New refcount of the bin * @example * var bin = sprite.getBin('a'); * sprite.ref(bin); */ ShelfPack$1.prototype.ref = function(bin) { if (++bin.refcount === 1) { // a new Bin.. record height in stats historgram.. var h = bin.h; this.stats[h] = (this.stats[h] | 0) + 1; } return bin.refcount; }; /** * Decrement the ref count of a bin and update statistics. * The bin will be automatically marked as free space once the refcount reaches 0. * * @param {Bin} bin Bin instance * @returns {number} New refcount of the bin * @example * var bin = sprite.getBin('a'); * sprite.unref(bin); */ ShelfPack$1.prototype.unref = function(bin) { if (bin.refcount === 0) { return 0; } if (--bin.refcount === 0) { this.stats[bin.h]--; delete this.bins[bin.id]; this.freebins.push(bin); } return bin.refcount; }; /** * Clear the sprite. Resets everything and resets statistics. * * @example * sprite.clear(); */ ShelfPack$1.prototype.clear = function() { this.shelves = []; this.freebins = []; this.stats = {}; this.bins = {}; this.maxId = 0; }; /** * Resize the sprite. * * @param {number} w Requested new sprite width * @param {number} h Requested new sprite height * @returns {boolean} `true` if resize succeeded, `false` if failed * @example * sprite.resize(256, 256); */ ShelfPack$1.prototype.resize = function(w, h) { this.w = w; this.h = h; for (var i = 0; i < this.shelves.length; i++) { this.shelves[i].resize(w); } return true; }; /** * Create a new Shelf. * * @private * @class Shelf * @param {number} y Top coordinate of the new shelf * @param {number} w Width of the new shelf * @param {number} h Height of the new shelf * @example * var shelf = new Shelf(64, 512, 24); */ function Shelf(y, w, h) { this.x = 0; this.y = y; this.w = this.free = w; this.h = h; } /** * Allocate a single bin into the shelf. * * @private * @param {number} w Width of the bin to allocate * @param {number} h Height of the bin to allocate * @param {number|string} id Unique id of the bin to allocate * @returns {Bin} Bin object with `id`, `x`, `y`, `w`, `h` properties, or `null` if allocation failed * @example * shelf.alloc(12, 16, 'a'); */ Shelf.prototype.alloc = function(w, h, id) { if (w > this.free || h > this.h) { return null; } var x = this.x; this.x += w; this.free -= w; return new Bin(id, x, this.y, w, h, w, this.h); }; /** * Resize the shelf. * * @private * @param {number} w Requested new width of the shelf * @returns {boolean} true * @example * shelf.resize(512); */ Shelf.prototype.resize = function(w) { this.free += (w - this.w); this.w = w; return true; }; /** * Create a new Bin object. * * @class Bin * @param {number|string} id Unique id of the bin * @param {number} x Left coordinate of the bin * @param {number} y Top coordinate of the bin * @param {number} w Width of the bin * @param {number} h Height of the bin * @param {number} [maxw] Max width of the bin (defaults to `w` if not provided) * @param {number} [maxh] Max height of the bin (defaults to `h` if not provided) * @example * var bin = new Bin('a', 0, 0, 12, 16); */ function Bin(id, x, y, w, h, maxw, maxh) { this.id = id; this.x = x; this.y = y; this.w = w; this.h = h; this.maxw = maxw || w; this.maxh = maxh || h; this.refcount = 0; } return ShelfPack$1; }))); },{}],6:[function(require,module,exports){ 'use strict'; module.exports = TinySDF; var INF = 1e20; function TinySDF(fontSize, buffer, radius, cutoff, fontFamily, fontWeight) { this.fontSize = fontSize || 24; this.buffer = buffer === undefined ? 3 : buffer; this.cutoff = cutoff || 0.25; this.fontFamily = fontFamily || 'sans-serif'; this.fontWeight = fontWeight || 'normal'; this.radius = radius || 8; var size = this.size = this.fontSize + this.buffer * 2; this.canvas = document.createElement('canvas'); this.canvas.width = this.canvas.height = size; this.ctx = this.canvas.getContext('2d'); this.ctx.font = this.fontWeight + ' ' + this.fontSize + 'px ' + this.fontFamily; this.ctx.textBaseline = 'middle'; this.ctx.fillStyle = 'black'; // temporary arrays for the distance transform this.gridOuter = new Float64Array(size * size); this.gridInner = new Float64Array(size * size); this.f = new Float64Array(size); this.d = new Float64Array(size); this.z = new Float64Array(size + 1); this.v = new Int16Array(size); // hack around https://bugzilla.mozilla.org/show_bug.cgi?id=737852 this.middle = Math.round((size / 2) * (navigator.userAgent.indexOf('Gecko/') >= 0 ? 1.2 : 1)); } TinySDF.prototype.draw = function (char) { this.ctx.clearRect(0, 0, this.size, this.size); this.ctx.fillText(char, this.buffer, this.middle); var imgData = this.ctx.getImageData(0, 0, this.size, this.size); var alphaChannel = new Uint8ClampedArray(this.size * this.size); for (var i = 0; i < this.size * this.size; i++) { var a = imgData.data[i * 4 + 3] / 255; // alpha value this.gridOuter[i] = a === 1 ? 0 : a === 0 ? INF : Math.pow(Math.max(0, 0.5 - a), 2); this.gridInner[i] = a === 1 ? INF : a === 0 ? 0 : Math.pow(Math.max(0, a - 0.5), 2); } edt(this.gridOuter, this.size, this.size, this.f, this.d, this.v, this.z); edt(this.gridInner, this.size, this.size, this.f, this.d, this.v, this.z); for (i = 0; i < this.size * this.size; i++) { var d = this.gridOuter[i] - this.gridInner[i]; alphaChannel[i] = Math.max(0, Math.min(255, Math.round(255 - 255 * (d / this.radius + this.cutoff)))); } return alphaChannel; }; // 2D Euclidean distance transform by Felzenszwalb & Huttenlocher https://cs.brown.edu/~pff/dt/ function edt(data, width, height, f, d, v, z) { for (var x = 0; x < width; x++) { for (var y = 0; y < height; y++) { f[y] = data[y * width + x]; } edt1d(f, d, v, z, height); for (y = 0; y < height; y++) { data[y * width + x] = d[y]; } } for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { f[x] = data[y * width + x]; } edt1d(f, d, v, z, width); for (x = 0; x < width; x++) { data[y * width + x] = Math.sqrt(d[x]); } } } // 1D squared distance transform function edt1d(f, d, v, z, n) { v[0] = 0; z[0] = -INF; z[1] = +INF; for (var q = 1, k = 0; q < n; q++) { var s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]); while (s <= z[k]) { k--; s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]); } k++; v[k] = q; z[k] = s; z[k + 1] = +INF; } for (q = 0, k = 0; q < n; q++) { while (z[k + 1] < q) k++; d[q] = (q - v[k]) * (q - v[k]) + f[v[k]]; } } },{}],7:[function(require,module,exports){ /* * Copyright (C) 2008 Apple 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. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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. * * Ported from Webkit * http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/UnitBezier.h */ module.exports = UnitBezier; function UnitBezier(p1x, p1y, p2x, p2y) { // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1). this.cx = 3.0 * p1x; this.bx = 3.0 * (p2x - p1x) - this.cx; this.ax = 1.0 - this.cx - this.bx; this.cy = 3.0 * p1y; this.by = 3.0 * (p2y - p1y) - this.cy; this.ay = 1.0 - this.cy - this.by; this.p1x = p1x; this.p1y = p2y; this.p2x = p2x; this.p2y = p2y; } UnitBezier.prototype.sampleCurveX = function(t) { // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule. return ((this.ax * t + this.bx) * t + this.cx) * t; }; UnitBezier.prototype.sampleCurveY = function(t) { return ((this.ay * t + this.by) * t + this.cy) * t; }; UnitBezier.prototype.sampleCurveDerivativeX = function(t) { return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx; }; UnitBezier.prototype.solveCurveX = function(x, epsilon) { if (typeof epsilon === 'undefined') epsilon = 1e-6; var t0, t1, t2, x2, i; // First try a few iterations of Newton's method -- normally very fast. for (t2 = x, i = 0; i < 8; i++) { x2 = this.sampleCurveX(t2) - x; if (Math.abs(x2) < epsilon) return t2; var d2 = this.sampleCurveDerivativeX(t2); if (Math.abs(d2) < 1e-6) break; t2 = t2 - x2 / d2; } // Fall back to the bisection method for reliability. t0 = 0.0; t1 = 1.0; t2 = x; if (t2 < t0) return t0; if (t2 > t1) return t1; while (t0 < t1) { x2 = this.sampleCurveX(t2); if (Math.abs(x2 - x) < epsilon) return t2; if (x > x2) { t0 = t2; } else { t1 = t2; } t2 = (t1 - t0) * 0.5 + t0; } // Failure. return t2; }; UnitBezier.prototype.solve = function(x, epsilon) { return this.sampleCurveY(this.solveCurveX(x, epsilon)); }; },{}],8:[function(require,module,exports){ module.exports.VectorTile = require('./lib/vectortile.js'); module.exports.VectorTileFeature = require('./lib/vectortilefeature.js'); module.exports.VectorTileLayer = require('./lib/vectortilelayer.js'); },{"./lib/vectortile.js":9,"./lib/vectortilefeature.js":10,"./lib/vectortilelayer.js":11}],9:[function(require,module,exports){ 'use strict'; var VectorTileLayer = require('./vectortilelayer'); module.exports = VectorTile; function VectorTile(pbf, end) { this.layers = pbf.readFields(readTile, {}, end); } function readTile(tag, layers, pbf) { if (tag === 3) { var layer = new VectorTileLayer(pbf, pbf.readVarint() + pbf.pos); if (layer.length) layers[layer.name] = layer; } } },{"./vectortilelayer":11}],10:[function(require,module,exports){ 'use strict'; var Point = require('@mapbox/point-geometry'); module.exports = VectorTileFeature; function VectorTileFeature(pbf, end, extent, keys, values) { // Public this.properties = {}; this.extent = extent; this.type = 0; // Private this._pbf = pbf; this._geometry = -1; this._keys = keys; this._values = values; pbf.readFields(readFeature, this, end); } function readFeature(tag, feature, pbf) { if (tag == 1) feature.id = pbf.readVarint(); else if (tag == 2) readTag(pbf, feature); else if (tag == 3) feature.type = pbf.readVarint(); else if (tag == 4) feature._geometry = pbf.pos; } function readTag(pbf, feature) { var end = pbf.readVarint() + pbf.pos; while (pbf.pos < end) { var key = feature._keys[pbf.readVarint()], value = feature._values[pbf.readVarint()]; feature.properties[key] = value; } } VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon']; VectorTileFeature.prototype.loadGeometry = function() { var pbf = this._pbf; pbf.pos = this._geometry; var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x = 0, y = 0, lines = [], line; while (pbf.pos < end) { if (!length) { var cmdLen = pbf.readVarint(); cmd = cmdLen & 0x7; length = cmdLen >> 3; } length--; if (cmd === 1 || cmd === 2) { x += pbf.readSVarint(); y += pbf.readSVarint(); if (cmd === 1) { // moveTo if (line) lines.push(line); line = []; } line.push(new Point(x, y)); } else if (cmd === 7) { // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90 if (line) { line.push(line[0].clone()); // closePolygon } } else { throw new Error('unknown command ' + cmd); } } if (line) lines.push(line); return lines; }; VectorTileFeature.prototype.bbox = function() { var pbf = this._pbf; pbf.pos = this._geometry; var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x = 0, y = 0, x1 = Infinity, x2 = -Infinity, y1 = Infinity, y2 = -Infinity; while (pbf.pos < end) { if (!length) { var cmdLen = pbf.readVarint(); cmd = cmdLen & 0x7; length = cmdLen >> 3; } length--; if (cmd === 1 || cmd === 2) { x += pbf.readSVarint(); y += pbf.readSVarint(); if (x < x1) x1 = x; if (x > x2) x2 = x; if (y < y1) y1 = y; if (y > y2) y2 = y; } else if (cmd !== 7) { throw new Error('unknown command ' + cmd); } } return [x1, y1, x2, y2]; }; VectorTileFeature.prototype.toGeoJSON = function(x, y, z) { var size = this.extent * Math.pow(2, z), x0 = this.extent * x, y0 = this.extent * y, coords = this.loadGeometry(), type = VectorTileFeature.types[this.type], i, j; function project(line) { for (var j = 0; j < line.length; j++) { var p = line[j], y2 = 180 - (p.y + y0) * 360 / size; line[j] = [ (p.x + x0) * 360 / size - 180, 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90 ]; } } switch (this.type) { case 1: var points = []; for (i = 0; i < coords.length; i++) { points[i] = coords[i][0]; } coords = points; project(coords); break; case 2: for (i = 0; i < coords.length; i++) { project(coords[i]); } break; case 3: coords = classifyRings(coords); for (i = 0; i < coords.length; i++) { for (j = 0; j < coords[i].length; j++) { project(coords[i][j]); } } break; } if (coords.length === 1) { coords = coords[0]; } else { type = 'Multi' + type; } var result = { type: "Feature", geometry: { type: type, coordinates: coords }, properties: this.properties }; if ('id' in this) { result.id = this.id; } return result; }; // classifies an array of rings into polygons with outer rings and holes function classifyRings(rings) { var len = rings.length; if (len <= 1) return [rings]; var polygons = [], polygon, ccw; for (var i = 0; i < len; i++) { var area = signedArea(rings[i]); if (area === 0) continue; if (ccw === undefined) ccw = area < 0; if (ccw === area < 0) { if (polygon) polygons.push(polygon); polygon = [rings[i]]; } else { polygon.push(rings[i]); } } if (polygon) polygons.push(polygon); return polygons; } function signedArea(ring) { var sum = 0; for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) { p1 = ring[i]; p2 = ring[j]; sum += (p2.x - p1.x) * (p1.y + p2.y); } return sum; } },{"@mapbox/point-geometry":4}],11:[function(require,module,exports){ 'use strict'; var VectorTileFeature = require('./vectortilefeature.js'); module.exports = VectorTileLayer; function VectorTileLayer(pbf, end) { // Public this.version = 1; this.name = null; this.extent = 4096; this.length = 0; // Private this._pbf = pbf; this._keys = []; this._values = []; this._features = []; pbf.readFields(readLayer, this, end); this.length = this._features.length; } function readLayer(tag, layer, pbf) { if (tag === 15) layer.version = pbf.readVarint(); else if (tag === 1) layer.name = pbf.readString(); else if (tag === 5) layer.extent = pbf.readVarint(); else if (tag === 2) layer._features.push(pbf.pos); else if (tag === 3) layer._keys.push(pbf.readString()); else if (tag === 4) layer._values.push(readValueMessage(pbf)); } function readValueMessage(pbf) { var value = null, end = pbf.readVarint() + pbf.pos; while (pbf.pos < end) { var tag = pbf.readVarint() >> 3; value = tag === 1 ? pbf.readString() : tag === 2 ? pbf.readFloat() : tag === 3 ? pbf.readDouble() : tag === 4 ? pbf.readVarint64() : tag === 5 ? pbf.readVarint() : tag === 6 ? pbf.readSVarint() : tag === 7 ? pbf.readBoolean() : null; } return value; } // return feature `i` from this layer as a `VectorTileFeature` VectorTileLayer.prototype.feature = function(i) { if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds'); this._pbf.pos = this._features[i]; var end = this._pbf.readVarint() + this._pbf.pos; return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values); }; },{"./vectortilefeature.js":10}],12:[function(require,module,exports){ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (factory((global.WhooTS = global.WhooTS || {}))); }(this, (function (exports) { /** * getURL * * @param {String} baseUrl Base url of the WMS server * @param {String} layer Layer name * @param {Number} x Tile coordinate x * @param {Number} y Tile coordinate y * @param {Number} z Tile zoom * @param {Object} [options] * @param {String} [options.format='image/png'] * @param {String} [options.service='WMS'] * @param {String} [options.version='1.1.1'] * @param {String} [options.request='GetMap'] * @param {String} [options.srs='EPSG:3857'] * @param {Number} [options.width='256'] * @param {Number} [options.height='256'] * @returns {String} url * @example * var baseUrl = 'http://geodata.state.nj.us/imagerywms/Natural2015'; * var layer = 'Natural2015'; * var url = whoots.getURL(baseUrl, layer, 154308, 197167, 19); */ function getURL(baseUrl, layer, x, y, z, options) { options = options || {}; var url = baseUrl + '?' + [ 'bbox=' + getTileBBox(x, y, z), 'format=' + (options.format || 'image/png'), 'service=' + (options.service || 'WMS'), 'version=' + (options.version || '1.1.1'), 'request=' + (options.request || 'GetMap'), 'srs=' + (options.srs || 'EPSG:3857'), 'width=' + (options.width || 256), 'height=' + (options.height || 256), 'layers=' + layer ].join('&'); return url; } /** * getTileBBox * * @param {Number} x Tile coordinate x * @param {Number} y Tile coordinate y * @param {Number} z Tile zoom * @returns {String} String of the bounding box */ function getTileBBox(x, y, z) { // for Google/OSM tile scheme we need to alter the y y = (Math.pow(2, z) - y - 1); var min = getMercCoords(x * 256, y * 256, z), max = getMercCoords((x + 1) * 256, (y + 1) * 256, z); return min[0] + ',' + min[1] + ',' + max[0] + ',' + max[1]; } /** * getMercCoords * * @param {Number} x Pixel coordinate x * @param {Number} y Pixel coordinate y * @param {Number} z Tile zoom * @returns {Array} [x, y] */ function getMercCoords(x, y, z) { var resolution = (2 * Math.PI * 6378137 / 256) / Math.pow(2, z), merc_x = (x * resolution - 2 * Math.PI * 6378137 / 2.0), merc_y = (y * resolution - 2 * Math.PI * 6378137 / 2.0); return [merc_x, merc_y]; } exports.getURL = getURL; exports.getTileBBox = getTileBBox; exports.getMercCoords = getMercCoords; Object.defineProperty(exports, '__esModule', { value: true }); }))); },{}],13:[function(require,module,exports){ (function (global){ 'use strict'; // compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js // original notice: /*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT */ function compare(a, b) { if (a === b) { return 0; } var x = a.length; var y = b.length; for (var i = 0, len = Math.min(x, y); i < len; ++i) { if (a[i] !== b[i]) { x = a[i]; y = b[i]; break; } } if (x < y) { return -1; } if (y < x) { return 1; } return 0; } function isBuffer(b) { if (global.Buffer && typeof global.Buffer.isBuffer === 'function') { return global.Buffer.isBuffer(b); } return !!(b != null && b._isBuffer); } // based on node assert, original notice: // http://wiki.commonjs.org/wiki/Unit_Testing/1.0 // // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! // // Originally from narwhal.js (http://narwhaljs.org) // Copyright (c) 2009 Thomas Robinson <280north.com> // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the 'Software'), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. var util = require('util/'); var hasOwn = Object.prototype.hasOwnProperty; var pSlice = Array.prototype.slice; var functionsHaveNames = (function () { return function foo() {}.name === 'foo'; }()); function pToString (obj) { return Object.prototype.toString.call(obj); } function isView(arrbuf) { if (isBuffer(arrbuf)) { return false; } if (typeof global.ArrayBuffer !== 'function') { return false; } if (typeof ArrayBuffer.isView === 'function') { return ArrayBuffer.isView(arrbuf); } if (!arrbuf) { return false; } if (arrbuf instanceof DataView) { return true; } if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) { return true; } return false; } // 1. The assert module provides functions that throw // AssertionError's when particular conditions are not met. The // assert module must conform to the following interface. var assert = module.exports = ok; // 2. The AssertionError is defined in assert. // new assert.AssertionError({ message: message, // actual: actual, // expected: expected }) var regex = /\s*function\s+([^\(\s]*)\s*/; // based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js function getName(func) { if (!util.isFunction(func)) { return; } if (functionsHaveNames) { return func.name; } var str = func.toString(); var match = str.match(regex); return match && match[1]; } assert.AssertionError = function AssertionError(options) { this.name = 'AssertionError'; this.actual = options.actual; this.expected = options.expected; this.operator = options.operator; if (options.message) { this.message = options.message; this.generatedMessage = false; } else { this.message = getMessage(this); this.generatedMessage = true; } var stackStartFunction = options.stackStartFunction || fail; if (Error.captureStackTrace) { Error.captureStackTrace(this, stackStartFunction); } else { // non v8 browsers so we can have a stacktrace var err = new Error(); if (err.stack) { var out = err.stack; // try to strip useless frames var fn_name = getName(stackStartFunction); var idx = out.indexOf('\n' + fn_name); if (idx >= 0) { // once we have located the function frame // we need to strip out everything before it (and its line) var next_line = out.indexOf('\n', idx + 1); out = out.substring(next_line + 1); } this.stack = out; } } }; // assert.AssertionError instanceof Error util.inherits(assert.AssertionError, Error); function truncate(s, n) { if (typeof s === 'string') { return s.length < n ? s : s.slice(0, n); } else { return s; } } function inspect(something) { if (functionsHaveNames || !util.isFunction(something)) { return util.inspect(something); } var rawname = getName(something); var name = rawname ? ': ' + rawname : ''; return '[Function' + name + ']'; } function getMessage(self) { return truncate(inspect(self.actual), 128) + ' ' + self.operator + ' ' + truncate(inspect(self.expected), 128); } // At present only the three keys mentioned above are used and // understood by the spec. Implementations or sub modules can pass // other keys to the AssertionError's constructor - they will be // ignored. // 3. All of the following functions must throw an AssertionError // when a corresponding condition is not met, with a message that // may be undefined if not provided. All assertion methods provide // both the actual and expected values to the assertion error for // display purposes. function fail(actual, expected, message, operator, stackStartFunction) { throw new assert.AssertionError({ message: message, actual: actual, expected: expected, operator: operator, stackStartFunction: stackStartFunction }); } // EXTENSION! allows for well behaved errors defined elsewhere. assert.fail = fail; // 4. Pure assertion tests whether a value is truthy, as determined // by !!guard. // assert.ok(guard, message_opt); // This statement is equivalent to assert.equal(true, !!guard, // message_opt);. To test strictly for the value true, use // assert.strictEqual(true, guard, message_opt);. function ok(value, message) { if (!value) fail(value, true, message, '==', assert.ok); } assert.ok = ok; // 5. The equality assertion tests shallow, coercive equality with // ==. // assert.equal(actual, expected, message_opt); assert.equal = function equal(actual, expected, message) { if (actual != expected) fail(actual, expected, message, '==', assert.equal); }; // 6. The non-equality assertion tests for whether two objects are not equal // with != assert.notEqual(actual, expected, message_opt); assert.notEqual = function notEqual(actual, expected, message) { if (actual == expected) { fail(actual, expected, message, '!=', assert.notEqual); } }; // 7. The equivalence assertion tests a deep equality relation. // assert.deepEqual(actual, expected, message_opt); assert.deepEqual = function deepEqual(actual, expected, message) { if (!_deepEqual(actual, expected, false)) { fail(actual, expected, message, 'deepEqual', assert.deepEqual); } }; assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) { if (!_deepEqual(actual, expected, true)) { fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual); } }; function _deepEqual(actual, expected, strict, memos) { // 7.1. All identical values are equivalent, as determined by ===. if (actual === expected) { return true; } else if (isBuffer(actual) && isBuffer(expected)) { return compare(actual, expected) === 0; // 7.2. If the expected value is a Date object, the actual value is // equivalent if it is also a Date object that refers to the same time. } else if (util.isDate(actual) && util.isDate(expected)) { return actual.getTime() === expected.getTime(); // 7.3 If the expected value is a RegExp object, the actual value is // equivalent if it is also a RegExp object with the same source and // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). } else if (util.isRegExp(actual) && util.isRegExp(expected)) { return actual.source === expected.source && actual.global === expected.global && actual.multiline === expected.multiline && actual.lastIndex === expected.lastIndex && actual.ignoreCase === expected.ignoreCase; // 7.4. Other pairs that do not both pass typeof value == 'object', // equivalence is determined by ==. } else if ((actual === null || typeof actual !== 'object') && (expected === null || typeof expected !== 'object')) { return strict ? actual === expected : actual == expected; // If both values are instances of typed arrays, wrap their underlying // ArrayBuffers in a Buffer each to increase performance // This optimization requires the arrays to have the same type as checked by // Object.prototype.toString (aka pToString). Never perform binary // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their // bit patterns are not identical. } else if (isView(actual) && isView(expected) && pToString(actual) === pToString(expected) && !(actual instanceof Float32Array || actual instanceof Float64Array)) { return compare(new Uint8Array(actual.buffer), new Uint8Array(expected.buffer)) === 0; // 7.5 For all other Object pairs, including Array objects, equivalence is // determined by having the same number of owned properties (as verified // with Object.prototype.hasOwnProperty.call), the same set of keys // (although not necessarily the same order), equivalent values for every // corresponding key, and an identical 'prototype' property. Note: this // accounts for both named and indexed properties on Arrays. } else if (isBuffer(actual) !== isBuffer(expected)) { return false; } else { memos = memos || {actual: [], expected: []}; var actualIndex = memos.actual.indexOf(actual); if (actualIndex !== -1) { if (actualIndex === memos.expected.indexOf(expected)) { return true; } } memos.actual.push(actual); memos.expected.push(expected); return objEquiv(actual, expected, strict, memos); } } function isArguments(object) { return Object.prototype.toString.call(object) == '[object Arguments]'; } function objEquiv(a, b, strict, actualVisitedObjects) { if (a === null || a === undefined || b === null || b === undefined) return false; // if one is a primitive, the other must be same if (util.isPrimitive(a) || util.isPrimitive(b)) return a === b; if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) return false; var aIsArgs = isArguments(a); var bIsArgs = isArguments(b); if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) return false; if (aIsArgs) { a = pSlice.call(a); b = pSlice.call(b); return _deepEqual(a, b, strict); } var ka = objectKeys(a); var kb = objectKeys(b); var key, i; // having the same number of owned properties (keys incorporates // hasOwnProperty) if (ka.length !== kb.length) return false; //the same set of keys (although not necessarily the same order), ka.sort(); kb.sort(); //~~~cheap key test for (i = ka.length - 1; i >= 0; i--) { if (ka[i] !== kb[i]) return false; } //equivalent values for every corresponding key, and //~~~possibly expensive deep test for (i = ka.length - 1; i >= 0; i--) { key = ka[i]; if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects)) return false; } return true; } // 8. The non-equivalence assertion tests for any deep inequality. // assert.notDeepEqual(actual, expected, message_opt); assert.notDeepEqual = function notDeepEqual(actual, expected, message) { if (_deepEqual(actual, expected, false)) { fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); } }; assert.notDeepStrictEqual = notDeepStrictEqual; function notDeepStrictEqual(actual, expected, message) { if (_deepEqual(actual, expected, true)) { fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual); } } // 9. The strict equality assertion tests strict equality, as determined by ===. // assert.strictEqual(actual, expected, message_opt); assert.strictEqual = function strictEqual(actual, expected, message) { if (actual !== expected) { fail(actual, expected, message, '===', assert.strictEqual); } }; // 10. The strict non-equality assertion tests for strict inequality, as // determined by !==. assert.notStrictEqual(actual, expected, message_opt); assert.notStrictEqual = function notStrictEqual(actual, expected, message) { if (actual === expected) { fail(actual, expected, message, '!==', assert.notStrictEqual); } }; function expectedException(actual, expected) { if (!actual || !expected) { return false; } if (Object.prototype.toString.call(expected) == '[object RegExp]') { return expected.test(actual); } try { if (actual instanceof expected) { return true; } } catch (e) { // Ignore. The instanceof check doesn't work for arrow functions. } if (Error.isPrototypeOf(expected)) { return false; } return expected.call({}, actual) === true; } function _tryBlock(block) { var error; try { block(); } catch (e) { error = e; } return error; } function _throws(shouldThrow, block, expected, message) { var actual; if (typeof block !== 'function') { throw new TypeError('"block" argument must be a function'); } if (typeof expected === 'string') { message = expected; expected = null; } actual = _tryBlock(block); message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + (message ? ' ' + message : '.'); if (shouldThrow && !actual) { fail(actual, expected, 'Missing expected exception' + message); } var userProvidedMessage = typeof message === 'string'; var isUnwantedException = !shouldThrow && util.isError(actual); var isUnexpectedException = !shouldThrow && actual && !expected; if ((isUnwantedException && userProvidedMessage && expectedException(actual, expected)) || isUnexpectedException) { fail(actual, expected, 'Got unwanted exception' + message); } if ((shouldThrow && actual && expected && !expectedException(actual, expected)) || (!shouldThrow && actual)) { throw actual; } } // 11. Expected to throw an error: // assert.throws(block, Error_opt, message_opt); assert.throws = function(block, /*optional*/error, /*optional*/message) { _throws(true, block, error, message); }; // EXTENSION! This is annoying to write outside this module. assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) { _throws(false, block, error, message); }; assert.ifError = function(err) { if (err) throw err; }; var objectKeys = Object.keys || function (obj) { var keys = []; for (var key in obj) { if (hasOwn.call(obj, key)) keys.push(key); } return keys; }; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"util/":38}],14:[function(require,module,exports){ // (c) Dean McNamee , 2012. // // https://github.com/deanm/css-color-parser-js // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. // http://www.w3.org/TR/css3-color/ var kCSSColorTable = { "transparent": [0,0,0,0], "aliceblue": [240,248,255,1], "antiquewhite": [250,235,215,1], "aqua": [0,255,255,1], "aquamarine": [127,255,212,1], "azure": [240,255,255,1], "beige": [245,245,220,1], "bisque": [255,228,196,1], "black": [0,0,0,1], "blanchedalmond": [255,235,205,1], "blue": [0,0,255,1], "blueviolet": [138,43,226,1], "brown": [165,42,42,1], "burlywood": [222,184,135,1], "cadetblue": [95,158,160,1], "chartreuse": [127,255,0,1], "chocolate": [210,105,30,1], "coral": [255,127,80,1], "cornflowerblue": [100,149,237,1], "cornsilk": [255,248,220,1], "crimson": [220,20,60,1], "cyan": [0,255,255,1], "darkblue": [0,0,139,1], "darkcyan": [0,139,139,1], "darkgoldenrod": [184,134,11,1], "darkgray": [169,169,169,1], "darkgreen": [0,100,0,1], "darkgrey": [169,169,169,1], "darkkhaki": [189,183,107,1], "darkmagenta": [139,0,139,1], "darkolivegreen": [85,107,47,1], "darkorange": [255,140,0,1], "darkorchid": [153,50,204,1], "darkred": [139,0,0,1], "darksalmon": [233,150,122,1], "darkseagreen": [143,188,143,1], "darkslateblue": [72,61,139,1], "darkslategray": [47,79,79,1], "darkslategrey": [47,79,79,1], "darkturquoise": [0,206,209,1], "darkviolet": [148,0,211,1], "deeppink": [255,20,147,1], "deepskyblue": [0,191,255,1], "dimgray": [105,105,105,1], "dimgrey": [105,105,105,1], "dodgerblue": [30,144,255,1], "firebrick": [178,34,34,1], "floralwhite": [255,250,240,1], "forestgreen": [34,139,34,1], "fuchsia": [255,0,255,1], "gainsboro": [220,220,220,1], "ghostwhite": [248,248,255,1], "gold": [255,215,0,1], "goldenrod": [218,165,32,1], "gray": [128,128,128,1], "green": [0,128,0,1], "greenyellow": [173,255,47,1], "grey": [128,128,128,1], "honeydew": [240,255,240,1], "hotpink": [255,105,180,1], "indianred": [205,92,92,1], "indigo": [75,0,130,1], "ivory": [255,255,240,1], "khaki": [240,230,140,1], "lavender": [230,230,250,1], "lavenderblush": [255,240,245,1], "lawngreen": [124,252,0,1], "lemonchiffon": [255,250,205,1], "lightblue": [173,216,230,1], "lightcoral": [240,128,128,1], "lightcyan": [224,255,255,1], "lightgoldenrodyellow": [250,250,210,1], "lightgray": [211,211,211,1], "lightgreen": [144,238,144,1], "lightgrey": [211,211,211,1], "lightpink": [255,182,193,1], "lightsalmon": [255,160,122,1], "lightseagreen": [32,178,170,1], "lightskyblue": [135,206,250,1], "lightslategray": [119,136,153,1], "lightslategrey": [119,136,153,1], "lightsteelblue": [176,196,222,1], "lightyellow": [255,255,224,1], "lime": [0,255,0,1], "limegreen": [50,205,50,1], "linen": [250,240,230,1], "magenta": [255,0,255,1], "maroon": [128,0,0,1], "mediumaquamarine": [102,205,170,1], "mediumblue": [0,0,205,1], "mediumorchid": [186,85,211,1], "mediumpurple": [147,112,219,1], "mediumseagreen": [60,179,113,1], "mediumslateblue": [123,104,238,1], "mediumspringgreen": [0,250,154,1], "mediumturquoise": [72,209,204,1], "mediumvioletred": [199,21,133,1], "midnightblue": [25,25,112,1], "mintcream": [245,255,250,1], "mistyrose": [255,228,225,1], "moccasin": [255,228,181,1], "navajowhite": [255,222,173,1], "navy": [0,0,128,1], "oldlace": [253,245,230,1], "olive": [128,128,0,1], "olivedrab": [107,142,35,1], "orange": [255,165,0,1], "orangered": [255,69,0,1], "orchid": [218,112,214,1], "palegoldenrod": [238,232,170,1], "palegreen": [152,251,152,1], "paleturquoise": [175,238,238,1], "palevioletred": [219,112,147,1], "papayawhip": [255,239,213,1], "peachpuff": [255,218,185,1], "peru": [205,133,63,1], "pink": [255,192,203,1], "plum": [221,160,221,1], "powderblue": [176,224,230,1], "purple": [128,0,128,1], "rebeccapurple": [102,51,153,1], "red": [255,0,0,1], "rosybrown": [188,143,143,1], "royalblue": [65,105,225,1], "saddlebrown": [139,69,19,1], "salmon": [250,128,114,1], "sandybrown": [244,164,96,1], "seagreen": [46,139,87,1], "seashell": [255,245,238,1], "sienna": [160,82,45,1], "silver": [192,192,192,1], "skyblue": [135,206,235,1], "slateblue": [106,90,205,1], "slategray": [112,128,144,1], "slategrey": [112,128,144,1], "snow": [255,250,250,1], "springgreen": [0,255,127,1], "steelblue": [70,130,180,1], "tan": [210,180,140,1], "teal": [0,128,128,1], "thistle": [216,191,216,1], "tomato": [255,99,71,1], "turquoise": [64,224,208,1], "violet": [238,130,238,1], "wheat": [245,222,179,1], "white": [255,255,255,1], "whitesmoke": [245,245,245,1], "yellow": [255,255,0,1], "yellowgreen": [154,205,50,1]} function clamp_css_byte(i) { // Clamp to integer 0 .. 255. i = Math.round(i); // Seems to be what Chrome does (vs truncation). return i < 0 ? 0 : i > 255 ? 255 : i; } function clamp_css_float(f) { // Clamp to float 0.0 .. 1.0. return f < 0 ? 0 : f > 1 ? 1 : f; } function parse_css_int(str) { // int or percentage. if (str[str.length - 1] === '%') return clamp_css_byte(parseFloat(str) / 100 * 255); return clamp_css_byte(parseInt(str)); } function parse_css_float(str) { // float or percentage. if (str[str.length - 1] === '%') return clamp_css_float(parseFloat(str) / 100); return clamp_css_float(parseFloat(str)); } function css_hue_to_rgb(m1, m2, h) { if (h < 0) h += 1; else if (h > 1) h -= 1; if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; if (h * 2 < 1) return m2; if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; return m1; } function parseCSSColor(css_str) { // Remove all whitespace, not compliant, but should just be more accepting. var str = css_str.replace(/ /g, '').toLowerCase(); // Color keywords (and transparent) lookup. if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup. // #abc and #abc123 syntax. if (str[0] === '#') { if (str.length === 4) { var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN. return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), (iv & 0xf0) | ((iv & 0xf0) >> 4), (iv & 0xf) | ((iv & 0xf) << 4), 1]; } else if (str.length === 7) { var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN. return [(iv & 0xff0000) >> 16, (iv & 0xff00) >> 8, iv & 0xff, 1]; } return null; } var op = str.indexOf('('), ep = str.indexOf(')'); if (op !== -1 && ep + 1 === str.length) { var fname = str.substr(0, op); var params = str.substr(op+1, ep-(op+1)).split(','); var alpha = 1; // To allow case fallthrough. switch (fname) { case 'rgba': if (params.length !== 4) return null; alpha = parse_css_float(params.pop()); // Fall through. case 'rgb': if (params.length !== 3) return null; return [parse_css_int(params[0]), parse_css_int(params[1]), parse_css_int(params[2]), alpha]; case 'hsla': if (params.length !== 4) return null; alpha = parse_css_float(params.pop()); // Fall through. case 'hsl': if (params.length !== 3) return null; var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1 // NOTE(deanm): According to the CSS spec s/l should only be // percentages, but we don't bother and let float or percentage. var s = parse_css_float(params[1]); var l = parse_css_float(params[2]); var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; var m1 = l * 2 - m2; return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255), clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255), clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255), alpha]; default: return null; } } return null; } try { exports.parseCSSColor = parseCSSColor } catch(e) { } },{}],15:[function(require,module,exports){ 'use strict'; module.exports = earcut; module.exports.default = earcut; function earcut(data, holeIndices, dim) { dim = dim || 2; var hasHoles = holeIndices && holeIndices.length, outerLen = hasHoles ? holeIndices[0] * dim : data.length, outerNode = linkedList(data, 0, outerLen, dim, true), triangles = []; if (!outerNode) return triangles; var minX, minY, maxX, maxY, x, y, invSize; if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim); // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox if (data.length > 80 * dim) { minX = maxX = data[0]; minY = maxY = data[1]; for (var i = dim; i < outerLen; i += dim) { x = data[i]; y = data[i + 1]; if (x < minX) minX = x; if (y < minY) minY = y; if (x > maxX) maxX = x; if (y > maxY) maxY = y; } // minX, minY and invSize are later used to transform coords into integers for z-order calculation invSize = Math.max(maxX - minX, maxY - minY); invSize = invSize !== 0 ? 1 / invSize : 0; } earcutLinked(outerNode, triangles, dim, minX, minY, invSize); return triangles; } // create a circular doubly linked list from polygon points in the specified winding order function linkedList(data, start, end, dim, clockwise) { var i, last; if (clockwise === (signedArea(data, start, end, dim) > 0)) { for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last); } else { for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last); } if (last && equals(last, last.next)) { removeNode(last); last = last.next; } return last; } // eliminate colinear or duplicate points function filterPoints(start, end) { if (!start) return start; if (!end) end = start; var p = start, again; do { again = false; if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) { removeNode(p); p = end = p.prev; if (p === p.next) break; again = true; } else { p = p.next; } } while (again || p !== end); return end; } // main ear slicing loop which triangulates a polygon (given as a linked list) function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) { if (!ear) return; // interlink polygon nodes in z-order if (!pass && invSize) indexCurve(ear, minX, minY, invSize); var stop = ear, prev, next; // iterate through ears, slicing them one by one while (ear.prev !== ear.next) { prev = ear.prev; next = ear.next; if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) { // cut off the triangle triangles.push(prev.i / dim); triangles.push(ear.i / dim); triangles.push(next.i / dim); removeNode(ear); // skipping the next vertice leads to less sliver triangles ear = next.next; stop = next.next; continue; } ear = next; // if we looped through the whole remaining polygon and can't find any more ears if (ear === stop) { // try filtering points and slicing again if (!pass) { earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1); // if this didn't work, try curing all small self-intersections locally } else if (pass === 1) { ear = cureLocalIntersections(ear, triangles, dim); earcutLinked(ear, triangles, dim, minX, minY, invSize, 2); // as a last resort, try splitting the remaining polygon into two } else if (pass === 2) { splitEarcut(ear, triangles, dim, minX, minY, invSize); } break; } } } // check whether a polygon node forms a valid ear with adjacent nodes function isEar(ear) { var a = ear.prev, b = ear, c = ear.next; if (area(a, b, c) >= 0) return false; // reflex, can't be an ear // now make sure we don't have other points inside the potential ear var p = ear.next.next; while (p !== ear.prev) { if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; p = p.next; } return true; } function isEarHashed(ear, minX, minY, invSize) { var a = ear.prev, b = ear, c = ear.next; if (area(a, b, c) >= 0) return false; // reflex, can't be an ear // triangle bbox; min & max are calculated like this for speed var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x), minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y), maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x), maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y); // z-order range for the current triangle bbox; var minZ = zOrder(minTX, minTY, minX, minY, invSize), maxZ = zOrder(maxTX, maxTY, minX, minY, invSize); var p = ear.prevZ, n = ear.nextZ; // look for points inside the triangle in both directions while (p && p.z >= minZ && n && n.z <= maxZ) { if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; p = p.prevZ; if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; n = n.nextZ; } // look for remaining points in decreasing z-order while (p && p.z >= minZ) { if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; p = p.prevZ; } // look for remaining points in increasing z-order while (n && n.z <= maxZ) { if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; n = n.nextZ; } return true; } // go through all polygon nodes and cure small local self-intersections function cureLocalIntersections(start, triangles, dim) { var p = start; do { var a = p.prev, b = p.next.next; if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) { triangles.push(a.i / dim); triangles.push(p.i / dim); triangles.push(b.i / dim); // remove two nodes involved removeNode(p); removeNode(p.next); p = start = b; } p = p.next; } while (p !== start); return p; } // try splitting polygon into two and triangulate them independently function splitEarcut(start, triangles, dim, minX, minY, invSize) { // look for a valid diagonal that divides the polygon into two var a = start; do { var b = a.next.next; while (b !== a.prev) { if (a.i !== b.i && isValidDiagonal(a, b)) { // split the polygon in two by the diagonal var c = splitPolygon(a, b); // filter colinear points around the cuts a = filterPoints(a, a.next); c = filterPoints(c, c.next); // run earcut on each half earcutLinked(a, triangles, dim, minX, minY, invSize); earcutLinked(c, triangles, dim, minX, minY, invSize); return; } b = b.next; } a = a.next; } while (a !== start); } // link every hole into the outer loop, producing a single-ring polygon without holes function eliminateHoles(data, holeIndices, outerNode, dim) { var queue = [], i, len, start, end, list; for (i = 0, len = holeIndices.length; i < len; i++) { start = holeIndices[i] * dim; end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; list = linkedList(data, start, end, dim, false); if (list === list.next) list.steiner = true; queue.push(getLeftmost(list)); } queue.sort(compareX); // process holes from left to right for (i = 0; i < queue.length; i++) { eliminateHole(queue[i], outerNode); outerNode = filterPoints(outerNode, outerNode.next); } return outerNode; } function compareX(a, b) { return a.x - b.x; } // find a bridge between vertices that connects hole with an outer ring and and link it function eliminateHole(hole, outerNode) { outerNode = findHoleBridge(hole, outerNode); if (outerNode) { var b = splitPolygon(outerNode, hole); filterPoints(b, b.next); } } // David Eberly's algorithm for finding a bridge between hole and outer polygon function findHoleBridge(hole, outerNode) { var p = outerNode, hx = hole.x, hy = hole.y, qx = -Infinity, m; // find a segment intersected by a ray from the hole's leftmost point to the left; // segment's endpoint with lesser x will be potential connection point do { if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) { var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); if (x <= hx && x > qx) { qx = x; if (x === hx) { if (hy === p.y) return p; if (hy === p.next.y) return p.next; } m = p.x < p.next.x ? p : p.next; } } p = p.next; } while (p !== outerNode); if (!m) return null; if (hx === qx) return m.prev; // hole touches outer segment; pick lower endpoint // look for points inside the triangle of hole point, segment intersection and endpoint; // if there are no points found, we have a valid connection; // otherwise choose the point of the minimum angle with the ray as connection point var stop = m, mx = m.x, my = m.y, tanMin = Infinity, tan; p = m.next; while (p !== stop) { if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) { tan = Math.abs(hy - p.y) / (hx - p.x); // tangential if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) { m = p; tanMin = tan; } } p = p.next; } return m; } // interlink polygon nodes in z-order function indexCurve(start, minX, minY, invSize) { var p = start; do { if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize); p.prevZ = p.prev; p.nextZ = p.next; p = p.next; } while (p !== start); p.prevZ.nextZ = null; p.prevZ = null; sortLinked(p); } // Simon Tatham's linked list merge sort algorithm // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html function sortLinked(list) { var i, p, q, e, tail, numMerges, pSize, qSize, inSize = 1; do { p = list; list = null; tail = null; numMerges = 0; while (p) { numMerges++; q = p; pSize = 0; for (i = 0; i < inSize; i++) { pSize++; q = q.nextZ; if (!q) break; } qSize = inSize; while (pSize > 0 || (qSize > 0 && q)) { if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) { e = p; p = p.nextZ; pSize--; } else { e = q; q = q.nextZ; qSize--; } if (tail) tail.nextZ = e; else list = e; e.prevZ = tail; tail = e; } p = q; } tail.nextZ = null; inSize *= 2; } while (numMerges > 1); return list; } // z-order of a point given coords and inverse of the longer side of data bbox function zOrder(x, y, minX, minY, invSize) { // coords are transformed into non-negative 15-bit integer range x = 32767 * (x - minX) * invSize; y = 32767 * (y - minY) * invSize; x = (x | (x << 8)) & 0x00FF00FF; x = (x | (x << 4)) & 0x0F0F0F0F; x = (x | (x << 2)) & 0x33333333; x = (x | (x << 1)) & 0x55555555; y = (y | (y << 8)) & 0x00FF00FF; y = (y | (y << 4)) & 0x0F0F0F0F; y = (y | (y << 2)) & 0x33333333; y = (y | (y << 1)) & 0x55555555; return x | (y << 1); } // find the leftmost node of a polygon ring function getLeftmost(start) { var p = start, leftmost = start; do { if (p.x < leftmost.x) leftmost = p; p = p.next; } while (p !== start); return leftmost; } // check if a point lies within a convex triangle function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) { return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0; } // check if a diagonal between two polygon nodes is valid (lies in polygon interior) function isValidDiagonal(a, b) { return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b); } // signed area of a triangle function area(p, q, r) { return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); } // check if two points are equal function equals(p1, p2) { return p1.x === p2.x && p1.y === p2.y; } // check if two segments intersect function intersects(p1, q1, p2, q2) { if ((equals(p1, q1) && equals(p2, q2)) || (equals(p1, q2) && equals(p2, q1))) return true; return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 && area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0; } // check if a polygon diagonal intersects any polygon segments function intersectsPolygon(a, b) { var p = a; do { if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) return true; p = p.next; } while (p !== a); return false; } // check if a polygon diagonal is locally inside the polygon function locallyInside(a, b) { return area(a.prev, a, a.next) < 0 ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0; } // check if the middle point of a polygon diagonal is inside the polygon function middleInside(a, b) { var p = a, inside = false, px = (a.x + b.x) / 2, py = (a.y + b.y) / 2; do { if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x)) inside = !inside; p = p.next; } while (p !== a); return inside; } // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; // if one belongs to the outer ring and another to a hole, it merges it into a single ring function splitPolygon(a, b) { var a2 = new Node(a.i, a.x, a.y), b2 = new Node(b.i, b.x, b.y), an = a.next, bp = b.prev; a.next = b; b.prev = a; a2.next = an; an.prev = a2; b2.next = a2; a2.prev = b2; bp.next = b2; b2.prev = bp; return b2; } // create a node and optionally link it with previous one (in a circular doubly linked list) function insertNode(i, x, y, last) { var p = new Node(i, x, y); if (!last) { p.prev = p; p.next = p; } else { p.next = last.next; p.prev = last; last.next.prev = p; last.next = p; } return p; } function removeNode(p) { p.next.prev = p.prev; p.prev.next = p.next; if (p.prevZ) p.prevZ.nextZ = p.nextZ; if (p.nextZ) p.nextZ.prevZ = p.prevZ; } function Node(i, x, y) { // vertice index in coordinates array this.i = i; // vertex coordinates this.x = x; this.y = y; // previous and next vertice nodes in a polygon ring this.prev = null; this.next = null; // z-order curve value this.z = null; // previous and next nodes in z-order this.prevZ = null; this.nextZ = null; // indicates whether this is a steiner point this.steiner = false; } // return a percentage difference between the polygon area and its triangulation area; // used to verify correctness of triangulation earcut.deviation = function (data, holeIndices, dim, triangles) { var hasHoles = holeIndices && holeIndices.length; var outerLen = hasHoles ? holeIndices[0] * dim : data.length; var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim)); if (hasHoles) { for (var i = 0, len = holeIndices.length; i < len; i++) { var start = holeIndices[i] * dim; var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; polygonArea -= Math.abs(signedArea(data, start, end, dim)); } } var trianglesArea = 0; for (i = 0; i < triangles.length; i += 3) { var a = triangles[i] * dim; var b = triangles[i + 1] * dim; var c = triangles[i + 2] * dim; trianglesArea += Math.abs( (data[a] - data[c]) * (data[b + 1] - data[a + 1]) - (data[a] - data[b]) * (data[c + 1] - data[a + 1])); } return polygonArea === 0 && trianglesArea === 0 ? 0 : Math.abs((trianglesArea - polygonArea) / polygonArea); }; function signedArea(data, start, end, dim) { var sum = 0; for (var i = start, j = end - dim; i < end; i += dim) { sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]); j = i; } return sum; } // turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts earcut.flatten = function (data) { var dim = data[0][0].length, result = {vertices: [], holes: [], dimensions: dim}, holeIndex = 0; for (var i = 0; i < data.length; i++) { for (var j = 0; j < data[i].length; j++) { for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]); } if (i > 0) { holeIndex += data[i - 1].length; result.holes.push(holeIndex); } } return result; }; },{}],16:[function(require,module,exports){ var geojsonArea = require('@mapbox/geojson-area'); module.exports = rewind; function rewind(gj, outer) { switch ((gj && gj.type) || null) { case 'FeatureCollection': gj.features = gj.features.map(curryOuter(rewind, outer)); return gj; case 'Feature': gj.geometry = rewind(gj.geometry, outer); return gj; case 'Polygon': case 'MultiPolygon': return correct(gj, outer); default: return gj; } } function curryOuter(a, b) { return function(_) { return a(_, b); }; } function correct(_, outer) { if (_.type === 'Polygon') { _.coordinates = correctRings(_.coordinates, outer); } else if (_.type === 'MultiPolygon') { _.coordinates = _.coordinates.map(curryOuter(correctRings, outer)); } return _; } function correctRings(_, outer) { outer = !!outer; _[0] = wind(_[0], outer); for (var i = 1; i < _.length; i++) { _[i] = wind(_[i], !outer); } return _; } function wind(_, dir) { return cw(_) === dir ? _ : _.reverse(); } function cw(_) { return geojsonArea.ring(_) >= 0; } },{"@mapbox/geojson-area":1}],17:[function(require,module,exports){ 'use strict'; module.exports = clip; var createFeature = require('./feature'); /* clip features between two axis-parallel lines: * | | * ___|___ | / * / | \____|____/ * | | */ function clip(features, scale, k1, k2, axis, minAll, maxAll) { k1 /= scale; k2 /= scale; if (minAll >= k1 && maxAll <= k2) return features; // trivial accept else if (minAll > k2 || maxAll < k1) return null; // trivial reject var clipped = []; for (var i = 0; i < features.length; i++) { var feature = features[i]; var geometry = feature.geometry; var type = feature.type; var min = axis === 0 ? feature.minX : feature.minY; var max = axis === 0 ? feature.maxX : feature.maxY; if (min >= k1 && max <= k2) { // trivial accept clipped.push(feature); continue; } else if (min > k2 || max < k1) { // trivial reject continue; } var newGeometry = []; if (type === 'Point' || type === 'MultiPoint') { clipPoints(geometry, newGeometry, k1, k2, axis); } else if (type === 'LineString') { clipLine(geometry, newGeometry, k1, k2, axis, false); } else if (type === 'MultiLineString') { clipLines(geometry, newGeometry, k1, k2, axis, false); } else if (type === 'Polygon') { clipLines(geometry, newGeometry, k1, k2, axis, true); } else if (type === 'MultiPolygon') { for (var j = 0; j < geometry.length; j++) { var polygon = []; clipLines(geometry[j], polygon, k1, k2, axis, true); if (polygon.length) { newGeometry.push(polygon); } } } if (newGeometry.length) { if (type === 'LineString' || type === 'MultiLineString') { if (newGeometry.length === 1) { type = 'LineString'; newGeometry = newGeometry[0]; } else { type = 'MultiLineString'; } } if (type === 'Point' || type === 'MultiPoint') { type = newGeometry.length === 3 ? 'Point' : 'MultiPoint'; } clipped.push(createFeature(feature.id, type, newGeometry, feature.tags)); } } return clipped.length ? clipped : null; } function clipPoints(geom, newGeom, k1, k2, axis) { for (var i = 0; i < geom.length; i += 3) { var a = geom[i + axis]; if (a >= k1 && a <= k2) { newGeom.push(geom[i]); newGeom.push(geom[i + 1]); newGeom.push(geom[i + 2]); } } } function clipLine(geom, newGeom, k1, k2, axis, isPolygon) { var slice = []; var intersect = axis === 0 ? intersectX : intersectY; for (var i = 0; i < geom.length - 3; i += 3) { var ax = geom[i]; var ay = geom[i + 1]; var az = geom[i + 2]; var bx = geom[i + 3]; var by = geom[i + 4]; var a = axis === 0 ? ax : ay; var b = axis === 0 ? bx : by; var sliced = false; if (a < k1) { // ---|--> | if (b >= k1) intersect(slice, ax, ay, bx, by, k1); } else if (a > k2) { // | <--|--- if (b <= k2) intersect(slice, ax, ay, bx, by, k2); } else { addPoint(slice, ax, ay, az); } if (b < k1 && a >= k1) { // <--|--- | or <--|-----|--- intersect(slice, ax, ay, bx, by, k1); sliced = true; } if (b > k2 && a <= k2) { // | ---|--> or ---|-----|--> intersect(slice, ax, ay, bx, by, k2); sliced = true; } if (!isPolygon && sliced) { slice.size = geom.size; newGeom.push(slice); slice = []; } } // add the last point var last = geom.length - 3; ax = geom[last]; ay = geom[last + 1]; az = geom[last + 2]; a = axis === 0 ? ax : ay; if (a >= k1 && a <= k2) addPoint(slice, ax, ay, az); // close the polygon if its endpoints are not the same after clipping last = slice.length - 3; if (isPolygon && last >= 3 && (slice[last] !== slice[0] || slice[last + 1] !== slice[1])) { addPoint(slice, slice[0], slice[1], slice[2]); } // add the final slice if (slice.length) { slice.size = geom.size; newGeom.push(slice); } } function clipLines(geom, newGeom, k1, k2, axis, isPolygon) { for (var i = 0; i < geom.length; i++) { clipLine(geom[i], newGeom, k1, k2, axis, isPolygon); } } function addPoint(out, x, y, z) { out.push(x); out.push(y); out.push(z); } function intersectX(out, ax, ay, bx, by, x) { out.push(x); out.push(ay + (x - ax) * (by - ay) / (bx - ax)); out.push(1); } function intersectY(out, ax, ay, bx, by, y) { out.push(ax + (y - ay) * (bx - ax) / (by - ay)); out.push(y); out.push(1); } },{"./feature":19}],18:[function(require,module,exports){ 'use strict'; module.exports = convert; var simplify = require('./simplify'); var createFeature = require('./feature'); // converts GeoJSON feature into an intermediate projected JSON vector format with simplification data function convert(data, tolerance) { var features = []; if (data.type === 'FeatureCollection') { for (var i = 0; i < data.features.length; i++) { convertFeature(features, data.features[i], tolerance); } } else if (data.type === 'Feature') { convertFeature(features, data, tolerance); } else { // single geometry or a geometry collection convertFeature(features, {geometry: data}, tolerance); } return features; } function convertFeature(features, geojson, tolerance) { if (!geojson.geometry) return; var coords = geojson.geometry.coordinates; var type = geojson.geometry.type; var tol = tolerance * tolerance; var geometry = []; if (type === 'Point') { convertPoint(coords, geometry); } else if (type === 'MultiPoint') { for (var i = 0; i < coords.length; i++) { convertPoint(coords[i], geometry); } } else if (type === 'LineString') { convertLine(coords, geometry, tol, false); } else if (type === 'MultiLineString') { convertLines(coords, geometry, tol, false); } else if (type === 'Polygon') { convertLines(coords, geometry, tol, true); } else if (type === 'MultiPolygon') { for (i = 0; i < coords.length; i++) { var polygon = []; convertLines(coords[i], polygon, tol, true); geometry.push(polygon); } } else if (type === 'GeometryCollection') { for (i = 0; i < geojson.geometry.geometries.length; i++) { convertFeature(features, { geometry: geojson.geometry.geometries[i], properties: geojson.properties }, tolerance); } return; } else { throw new Error('Input data is not a valid GeoJSON object.'); } features.push(createFeature(geojson.id, type, geometry, geojson.properties)); } function convertPoint(coords, out) { out.push(projectX(coords[0])); out.push(projectY(coords[1])); out.push(0); } function convertLine(ring, out, tol, isPolygon) { var x0, y0; var size = 0; for (var j = 0; j < ring.length; j++) { var x = projectX(ring[j][0]); var y = projectY(ring[j][1]); out.push(x); out.push(y); out.push(0); if (j > 0) { if (isPolygon) { size += (x0 * y - x * y0) / 2; // area } else { size += Math.sqrt(Math.pow(x - x0, 2) + Math.pow(y - y0, 2)); // length } } x0 = x; y0 = y; } var last = out.length - 3; out[2] = 1; simplify(out, 0, last, tol); out[last + 2] = 1; out.size = Math.abs(size); } function convertLines(rings, out, tol, isPolygon) { for (var i = 0; i < rings.length; i++) { var geom = []; convertLine(rings[i], geom, tol, isPolygon); out.push(geom); } } function projectX(x) { return x / 360 + 0.5; } function projectY(y) { var sin = Math.sin(y * Math.PI / 180); var y2 = 0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI; return y2 < 0 ? 0 : y2 > 1 ? 1 : y2; } },{"./feature":19,"./simplify":21}],19:[function(require,module,exports){ 'use strict'; module.exports = createFeature; function createFeature(id, type, geom, tags) { var feature = { id: id || null, type: type, geometry: geom, tags: tags, minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity }; calcBBox(feature); return feature; } function calcBBox(feature) { var geom = feature.geometry; var type = feature.type; if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') { calcLineBBox(feature, geom); } else if (type === 'Polygon' || type === 'MultiLineString') { for (var i = 0; i < geom.length; i++) { calcLineBBox(feature, geom[i]); } } else if (type === 'MultiPolygon') { for (i = 0; i < geom.length; i++) { for (var j = 0; j < geom[i].length; j++) { calcLineBBox(feature, geom[i][j]); } } } } function calcLineBBox(feature, geom) { for (var i = 0; i < geom.length; i += 3) { feature.minX = Math.min(feature.minX, geom[i]); feature.minY = Math.min(feature.minY, geom[i + 1]); feature.maxX = Math.max(feature.maxX, geom[i]); feature.maxY = Math.max(feature.maxY, geom[i + 1]); } } },{}],20:[function(require,module,exports){ 'use strict'; module.exports = geojsonvt; var convert = require('./convert'), // GeoJSON conversion and preprocessing transform = require('./transform'), // coordinate transformation clip = require('./clip'), // stripe clipping algorithm wrap = require('./wrap'), // date line processing createTile = require('./tile'); // final simplified tile generation function geojsonvt(data, options) { return new GeoJSONVT(data, options); } function GeoJSONVT(data, options) { options = this.options = extend(Object.create(this.options), options); var debug = options.debug; if (debug) console.time('preprocess data'); if (options.maxZoom < 0 || options.maxZoom > 24) throw new Error('maxZoom should be in the 0-24 range'); var z2 = 1 << options.maxZoom, // 2^z features = convert(data, options.tolerance / (z2 * options.extent)); this.tiles = {}; this.tileCoords = []; if (debug) { console.timeEnd('preprocess data'); console.log('index: maxZoom: %d, maxPoints: %d', options.indexMaxZoom, options.indexMaxPoints); console.time('generate tiles'); this.stats = {}; this.total = 0; } features = wrap(features, options.buffer / options.extent); // start slicing from the top tile down if (features.length) this.splitTile(features, 0, 0, 0); if (debug) { if (features.length) console.log('features: %d, points: %d', this.tiles[0].numFeatures, this.tiles[0].numPoints); console.timeEnd('generate tiles'); console.log('tiles generated:', this.total, JSON.stringify(this.stats)); } } GeoJSONVT.prototype.options = { maxZoom: 14, // max zoom to preserve detail on indexMaxZoom: 5, // max zoom in the tile index indexMaxPoints: 100000, // max number of points per tile in the tile index tolerance: 3, // simplification tolerance (higher means simpler) extent: 4096, // tile extent buffer: 64, // tile buffer on each side debug: 0 // logging level (0, 1 or 2) }; GeoJSONVT.prototype.splitTile = function (features, z, x, y, cz, cx, cy) { var stack = [features, z, x, y], options = this.options, debug = options.debug; // avoid recursion by using a processing queue while (stack.length) { y = stack.pop(); x = stack.pop(); z = stack.pop(); features = stack.pop(); var z2 = 1 << z, id = toID(z, x, y), tile = this.tiles[id], tileTolerance = z === options.maxZoom ? 0 : options.tolerance / (z2 * options.extent); if (!tile) { if (debug > 1) console.time('creation'); tile = this.tiles[id] = createTile(features, z2, x, y, tileTolerance, z === options.maxZoom); this.tileCoords.push({z: z, x: x, y: y}); if (debug) { if (debug > 1) { console.log('tile z%d-%d-%d (features: %d, points: %d, simplified: %d)', z, x, y, tile.numFeatures, tile.numPoints, tile.numSimplified); console.timeEnd('creation'); } var key = 'z' + z; this.stats[key] = (this.stats[key] || 0) + 1; this.total++; } } // save reference to original geometry in tile so that we can drill down later if we stop now tile.source = features; // if it's the first-pass tiling if (!cz) { // stop tiling if we reached max zoom, or if the tile is too simple if (z === options.indexMaxZoom || tile.numPoints <= options.indexMaxPoints) continue; // if a drilldown to a specific tile } else { // stop tiling if we reached base zoom or our target tile zoom if (z === options.maxZoom || z === cz) continue; // stop tiling if it's not an ancestor of the target tile var m = 1 << (cz - z); if (x !== Math.floor(cx / m) || y !== Math.floor(cy / m)) continue; } // if we slice further down, no need to keep source geometry tile.source = null; if (features.length === 0) continue; if (debug > 1) console.time('clipping'); // values we'll use for clipping var k1 = 0.5 * options.buffer / options.extent, k2 = 0.5 - k1, k3 = 0.5 + k1, k4 = 1 + k1, tl, bl, tr, br, left, right; tl = bl = tr = br = null; left = clip(features, z2, x - k1, x + k3, 0, tile.minX, tile.maxX); right = clip(features, z2, x + k2, x + k4, 0, tile.minX, tile.maxX); features = null; if (left) { tl = clip(left, z2, y - k1, y + k3, 1, tile.minY, tile.maxY); bl = clip(left, z2, y + k2, y + k4, 1, tile.minY, tile.maxY); left = null; } if (right) { tr = clip(right, z2, y - k1, y + k3, 1, tile.minY, tile.maxY); br = clip(right, z2, y + k2, y + k4, 1, tile.minY, tile.maxY); right = null; } if (debug > 1) console.timeEnd('clipping'); stack.push(tl || [], z + 1, x * 2, y * 2); stack.push(bl || [], z + 1, x * 2, y * 2 + 1); stack.push(tr || [], z + 1, x * 2 + 1, y * 2); stack.push(br || [], z + 1, x * 2 + 1, y * 2 + 1); } }; GeoJSONVT.prototype.getTile = function (z, x, y) { var options = this.options, extent = options.extent, debug = options.debug; if (z < 0 || z > 24) return null; var z2 = 1 << z; x = ((x % z2) + z2) % z2; // wrap tile x coordinate var id = toID(z, x, y); if (this.tiles[id]) return transform.tile(this.tiles[id], extent); if (debug > 1) console.log('drilling down to z%d-%d-%d', z, x, y); var z0 = z, x0 = x, y0 = y, parent; while (!parent && z0 > 0) { z0--; x0 = Math.floor(x0 / 2); y0 = Math.floor(y0 / 2); parent = this.tiles[toID(z0, x0, y0)]; } if (!parent || !parent.source) return null; // if we found a parent tile containing the original geometry, we can drill down from it if (debug > 1) console.log('found parent tile z%d-%d-%d', z0, x0, y0); if (debug > 1) console.time('drilling down'); this.splitTile(parent.source, z0, x0, y0, z, x, y); if (debug > 1) console.timeEnd('drilling down'); return this.tiles[id] ? transform.tile(this.tiles[id], extent) : null; }; function toID(z, x, y) { return (((1 << z) * y + x) * 32) + z; } function extend(dest, src) { for (var i in src) dest[i] = src[i]; return dest; } },{"./clip":17,"./convert":18,"./tile":22,"./transform":23,"./wrap":24}],21:[function(require,module,exports){ 'use strict'; module.exports = simplify; // calculate simplification data using optimized Douglas-Peucker algorithm function simplify(coords, first, last, sqTolerance) { var maxSqDist = sqTolerance; var index; var ax = coords[first]; var ay = coords[first + 1]; var bx = coords[last]; var by = coords[last + 1]; for (var i = first + 3; i < last; i += 3) { var d = getSqSegDist(coords[i], coords[i + 1], ax, ay, bx, by); if (d > maxSqDist) { index = i; maxSqDist = d; } } if (maxSqDist > sqTolerance) { if (index - first > 3) simplify(coords, first, index, sqTolerance); coords[index + 2] = maxSqDist; if (last - index > 3) simplify(coords, index, last, sqTolerance); } } // square distance from a point to a segment function getSqSegDist(px, py, x, y, bx, by) { var dx = bx - x; var dy = by - y; if (dx !== 0 || dy !== 0) { var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy); if (t > 1) { x = bx; y = by; } else if (t > 0) { x += dx * t; y += dy * t; } } dx = px - x; dy = py - y; return dx * dx + dy * dy; } },{}],22:[function(require,module,exports){ 'use strict'; module.exports = createTile; function createTile(features, z2, tx, ty, tolerance, noSimplify) { var tile = { features: [], numPoints: 0, numSimplified: 0, numFeatures: 0, source: null, x: tx, y: ty, z2: z2, transformed: false, minX: 2, minY: 1, maxX: -1, maxY: 0 }; for (var i = 0; i < features.length; i++) { tile.numFeatures++; addFeature(tile, features[i], tolerance, noSimplify); var minX = features[i].minX; var minY = features[i].minY; var maxX = features[i].maxX; var maxY = features[i].maxY; if (minX < tile.minX) tile.minX = minX; if (minY < tile.minY) tile.minY = minY; if (maxX > tile.maxX) tile.maxX = maxX; if (maxY > tile.maxY) tile.maxY = maxY; } return tile; } function addFeature(tile, feature, tolerance, noSimplify) { var geom = feature.geometry, type = feature.type, simplified = []; if (type === 'Point' || type === 'MultiPoint') { for (var i = 0; i < geom.length; i += 3) { simplified.push(geom[i]); simplified.push(geom[i + 1]); tile.numPoints++; tile.numSimplified++; } } else if (type === 'LineString') { addLine(simplified, geom, tile, tolerance, noSimplify, false, false); } else if (type === 'MultiLineString' || type === 'Polygon') { for (i = 0; i < geom.length; i++) { addLine(simplified, geom[i], tile, tolerance, noSimplify, type === 'Polygon', i === 0); } } else if (type === 'MultiPolygon') { for (var k = 0; k < geom.length; k++) { var polygon = geom[k]; for (i = 0; i < polygon.length; i++) { addLine(simplified, polygon[i], tile, tolerance, noSimplify, true, i === 0); } } } if (simplified.length) { var tileFeature = { geometry: simplified, type: type === 'Polygon' || type === 'MultiPolygon' ? 3 : type === 'LineString' || type === 'MultiLineString' ? 2 : 1, tags: feature.tags || null }; if (feature.id !== null) { tileFeature.id = feature.id; } tile.features.push(tileFeature); } } function addLine(result, geom, tile, tolerance, noSimplify, isPolygon, isOuter) { var sqTolerance = tolerance * tolerance; if (!noSimplify && (geom.size < (isPolygon ? sqTolerance : tolerance))) { tile.numPoints += geom.length / 3; return; } var ring = []; for (var i = 0; i < geom.length; i += 3) { if (noSimplify || geom[i + 2] > sqTolerance) { tile.numSimplified++; ring.push(geom[i]); ring.push(geom[i + 1]); } tile.numPoints++; } if (isPolygon) rewind(ring, isOuter); result.push(ring); } function rewind(ring, clockwise) { var area = 0; for (var i = 0, len = ring.length, j = len - 2; i < len; j = i, i += 2) { area += (ring[i] - ring[j]) * (ring[i + 1] + ring[j + 1]); } if (area > 0 === clockwise) { for (i = 0, len = ring.length; i < len / 2; i += 2) { var x = ring[i]; var y = ring[i + 1]; ring[i] = ring[len - 2 - i]; ring[i + 1] = ring[len - 1 - i]; ring[len - 2 - i] = x; ring[len - 1 - i] = y; } } } },{}],23:[function(require,module,exports){ 'use strict'; exports.tile = transformTile; exports.point = transformPoint; // Transforms the coordinates of each feature in the given tile from // mercator-projected space into (extent x extent) tile space. function transformTile(tile, extent) { if (tile.transformed) return tile; var z2 = tile.z2, tx = tile.x, ty = tile.y, i, j, k; for (i = 0; i < tile.features.length; i++) { var feature = tile.features[i], geom = feature.geometry, type = feature.type; feature.geometry = []; if (type === 1) { for (j = 0; j < geom.length; j += 2) { feature.geometry.push(transformPoint(geom[j], geom[j + 1], extent, z2, tx, ty)); } } else { for (j = 0; j < geom.length; j++) { var ring = []; for (k = 0; k < geom[j].length; k += 2) { ring.push(transformPoint(geom[j][k], geom[j][k + 1], extent, z2, tx, ty)); } feature.geometry.push(ring); } } } tile.transformed = true; return tile; } function transformPoint(x, y, extent, z2, tx, ty) { return [ Math.round(extent * (x * z2 - tx)), Math.round(extent * (y * z2 - ty))]; } },{}],24:[function(require,module,exports){ 'use strict'; var clip = require('./clip'); var createFeature = require('./feature'); module.exports = wrap; function wrap(features, buffer) { var merged = features, left = clip(features, 1, -1 - buffer, buffer, 0, -1, 2), // left world copy right = clip(features, 1, 1 - buffer, 2 + buffer, 0, -1, 2); // right world copy if (left || right) { merged = clip(features, 1, -buffer, 1 + buffer, 0, -1, 2) || []; // center world copy if (left) merged = shiftFeatureCoords(left, 1).concat(merged); // merge left into center if (right) merged = merged.concat(shiftFeatureCoords(right, -1)); // merge right into center } return merged; } function shiftFeatureCoords(features, offset) { var newFeatures = []; for (var i = 0; i < features.length; i++) { var feature = features[i], type = feature.type; var newGeometry; if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') { newGeometry = shiftCoords(feature.geometry, offset); } else if (type === 'MultiLineString' || type === 'Polygon') { newGeometry = []; for (var j = 0; j < feature.geometry.length; j++) { newGeometry.push(shiftCoords(feature.geometry[j], offset)); } } else if (type === 'MultiPolygon') { newGeometry = []; for (j = 0; j < feature.geometry.length; j++) { var newPolygon = []; for (var k = 0; k < feature.geometry[j].length; k++) { newPolygon.push(shiftCoords(feature.geometry[j][k], offset)); } newGeometry.push(newPolygon); } } newFeatures.push(createFeature(feature.id, type, newGeometry, feature.tags)); } return newFeatures; } function shiftCoords(points, offset) { var newPoints = []; newPoints.size = points.size; for (var i = 0; i < points.length; i += 3) { newPoints.push(points[i] + offset, points[i + 1], points[i + 2]); } return newPoints; } },{"./clip":17,"./feature":19}],25:[function(require,module,exports){ 'use strict'; module.exports = GridIndex; var NUM_PARAMS = 3; function GridIndex(extent, n, padding) { var cells = this.cells = []; if (extent instanceof ArrayBuffer) { this.arrayBuffer = extent; var array = new Int32Array(this.arrayBuffer); extent = array[0]; n = array[1]; padding = array[2]; this.d = n + 2 * padding; for (var k = 0; k < this.d * this.d; k++) { var start = array[NUM_PARAMS + k]; var end = array[NUM_PARAMS + k + 1]; cells.push(start === end ? null : array.subarray(start, end)); } var keysOffset = array[NUM_PARAMS + cells.length]; var bboxesOffset = array[NUM_PARAMS + cells.length + 1]; this.keys = array.subarray(keysOffset, bboxesOffset); this.bboxes = array.subarray(bboxesOffset); this.insert = this._insertReadonly; } else { this.d = n + 2 * padding; for (var i = 0; i < this.d * this.d; i++) { cells.push([]); } this.keys = []; this.bboxes = []; } this.n = n; this.extent = extent; this.padding = padding; this.scale = n / extent; this.uid = 0; var p = (padding / n) * extent; this.min = -p; this.max = extent + p; } GridIndex.prototype.insert = function(key, x1, y1, x2, y2) { this._forEachCell(x1, y1, x2, y2, this._insertCell, this.uid++); this.keys.push(key); this.bboxes.push(x1); this.bboxes.push(y1); this.bboxes.push(x2); this.bboxes.push(y2); }; GridIndex.prototype._insertReadonly = function() { throw 'Cannot insert into a GridIndex created from an ArrayBuffer.'; }; GridIndex.prototype._insertCell = function(x1, y1, x2, y2, cellIndex, uid) { this.cells[cellIndex].push(uid); }; GridIndex.prototype.query = function(x1, y1, x2, y2) { var min = this.min; var max = this.max; if (x1 <= min && y1 <= min && max <= x2 && max <= y2) { // We use `Array#slice` because `this.keys` may be a `Int32Array` and // some browsers (Safari and IE) do not support `TypedArray#slice` // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice#Browser_compatibility return Array.prototype.slice.call(this.keys); } else { var result = []; var seenUids = {}; this._forEachCell(x1, y1, x2, y2, this._queryCell, result, seenUids); return result; } }; GridIndex.prototype._queryCell = function(x1, y1, x2, y2, cellIndex, result, seenUids) { var cell = this.cells[cellIndex]; if (cell !== null) { var keys = this.keys; var bboxes = this.bboxes; for (var u = 0; u < cell.length; u++) { var uid = cell[u]; if (seenUids[uid] === undefined) { var offset = uid * 4; if ((x1 <= bboxes[offset + 2]) && (y1 <= bboxes[offset + 3]) && (x2 >= bboxes[offset + 0]) && (y2 >= bboxes[offset + 1])) { seenUids[uid] = true; result.push(keys[uid]); } else { seenUids[uid] = false; } } } } }; GridIndex.prototype._forEachCell = function(x1, y1, x2, y2, fn, arg1, arg2) { var cx1 = this._convertToCellCoord(x1); var cy1 = this._convertToCellCoord(y1); var cx2 = this._convertToCellCoord(x2); var cy2 = this._convertToCellCoord(y2); for (var x = cx1; x <= cx2; x++) { for (var y = cy1; y <= cy2; y++) { var cellIndex = this.d * y + x; if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2)) return; } } }; GridIndex.prototype._convertToCellCoord = function(x) { return Math.max(0, Math.min(this.d - 1, Math.floor(x * this.scale) + this.padding)); }; GridIndex.prototype.toArrayBuffer = function() { if (this.arrayBuffer) return this.arrayBuffer; var cells = this.cells; var metadataLength = NUM_PARAMS + this.cells.length + 1 + 1; var totalCellLength = 0; for (var i = 0; i < this.cells.length; i++) { totalCellLength += this.cells[i].length; } var array = new Int32Array(metadataLength + totalCellLength + this.keys.length + this.bboxes.length); array[0] = this.extent; array[1] = this.n; array[2] = this.padding; var offset = metadataLength; for (var k = 0; k < cells.length; k++) { var cell = cells[k]; array[NUM_PARAMS + k] = offset; array.set(cell, offset); offset += cell.length; } array[NUM_PARAMS + cells.length] = offset; array.set(this.keys, offset); offset += this.keys.length; array[NUM_PARAMS + cells.length + 1] = offset; array.set(this.bboxes, offset); offset += this.bboxes.length; return array.buffer; }; },{}],26:[function(require,module,exports){ exports.read = function (buffer, offset, isLE, mLen, nBytes) { var e, m var eLen = nBytes * 8 - mLen - 1 var eMax = (1 << eLen) - 1 var eBias = eMax >> 1 var nBits = -7 var i = isLE ? (nBytes - 1) : 0 var d = isLE ? -1 : 1 var s = buffer[offset + i] i += d e = s & ((1 << (-nBits)) - 1) s >>= (-nBits) nBits += eLen for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} m = e & ((1 << (-nBits)) - 1) e >>= (-nBits) nBits += mLen for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} if (e === 0) { e = 1 - eBias } else if (e === eMax) { return m ? NaN : ((s ? -1 : 1) * Infinity) } else { m = m + Math.pow(2, mLen) e = e - eBias } return (s ? -1 : 1) * m * Math.pow(2, e - mLen) } exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { var e, m, c var eLen = nBytes * 8 - mLen - 1 var eMax = (1 << eLen) - 1 var eBias = eMax >> 1 var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) var i = isLE ? 0 : (nBytes - 1) var d = isLE ? 1 : -1 var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 value = Math.abs(value) if (isNaN(value) || value === Infinity) { m = isNaN(value) ? 1 : 0 e = eMax } else { e = Math.floor(Math.log(value) / Math.LN2) if (value * (c = Math.pow(2, -e)) < 1) { e-- c *= 2 } if (e + eBias >= 1) { value += rt / c } else { value += rt * Math.pow(2, 1 - eBias) } if (value * c >= 2) { e++ c /= 2 } if (e + eBias >= eMax) { m = 0 e = eMax } else if (e + eBias >= 1) { m = (value * c - 1) * Math.pow(2, mLen) e = e + eBias } else { m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) e = 0 } } for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} e = (e << mLen) | m eLen += mLen for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} buffer[offset + i - d] |= s * 128 } },{}],27:[function(require,module,exports){ 'use strict'; var sort = require('./sort'); var range = require('./range'); var within = require('./within'); module.exports = kdbush; function kdbush(points, getX, getY, nodeSize, ArrayType) { return new KDBush(points, getX, getY, nodeSize, ArrayType); } function KDBush(points, getX, getY, nodeSize, ArrayType) { getX = getX || defaultGetX; getY = getY || defaultGetY; ArrayType = ArrayType || Array; this.nodeSize = nodeSize || 64; this.points = points; this.ids = new ArrayType(points.length); this.coords = new ArrayType(points.length * 2); for (var i = 0; i < points.length; i++) { this.ids[i] = i; this.coords[2 * i] = getX(points[i]); this.coords[2 * i + 1] = getY(points[i]); } sort(this.ids, this.coords, this.nodeSize, 0, this.ids.length - 1, 0); } KDBush.prototype = { range: function (minX, minY, maxX, maxY) { return range(this.ids, this.coords, minX, minY, maxX, maxY, this.nodeSize); }, within: function (x, y, r) { return within(this.ids, this.coords, x, y, r, this.nodeSize); } }; function defaultGetX(p) { return p[0]; } function defaultGetY(p) { return p[1]; } },{"./range":28,"./sort":29,"./within":30}],28:[function(require,module,exports){ 'use strict'; module.exports = range; function range(ids, coords, minX, minY, maxX, maxY, nodeSize) { var stack = [0, ids.length - 1, 0]; var result = []; var x, y; while (stack.length) { var axis = stack.pop(); var right = stack.pop(); var left = stack.pop(); if (right - left <= nodeSize) { for (var i = left; i <= right; i++) { x = coords[2 * i]; y = coords[2 * i + 1]; if (x >= minX && x <= maxX && y >= minY && y <= maxY) result.push(ids[i]); } continue; } var m = Math.floor((left + right) / 2); x = coords[2 * m]; y = coords[2 * m + 1]; if (x >= minX && x <= maxX && y >= minY && y <= maxY) result.push(ids[m]); var nextAxis = (axis + 1) % 2; if (axis === 0 ? minX <= x : minY <= y) { stack.push(left); stack.push(m - 1); stack.push(nextAxis); } if (axis === 0 ? maxX >= x : maxY >= y) { stack.push(m + 1); stack.push(right); stack.push(nextAxis); } } return result; } },{}],29:[function(require,module,exports){ 'use strict'; module.exports = sortKD; function sortKD(ids, coords, nodeSize, left, right, depth) { if (right - left <= nodeSize) return; var m = Math.floor((left + right) / 2); select(ids, coords, m, left, right, depth % 2); sortKD(ids, coords, nodeSize, left, m - 1, depth + 1); sortKD(ids, coords, nodeSize, m + 1, right, depth + 1); } function select(ids, coords, k, left, right, inc) { while (right > left) { if (right - left > 600) { var n = right - left + 1; var m = k - left + 1; var z = Math.log(n); var s = 0.5 * Math.exp(2 * z / 3); var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); var newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); select(ids, coords, k, newLeft, newRight, inc); } var t = coords[2 * k + inc]; var i = left; var j = right; swapItem(ids, coords, left, k); if (coords[2 * right + inc] > t) swapItem(ids, coords, left, right); while (i < j) { swapItem(ids, coords, i, j); i++; j--; while (coords[2 * i + inc] < t) i++; while (coords[2 * j + inc] > t) j--; } if (coords[2 * left + inc] === t) swapItem(ids, coords, left, j); else { j++; swapItem(ids, coords, j, right); } if (j <= k) left = j + 1; if (k <= j) right = j - 1; } } function swapItem(ids, coords, i, j) { swap(ids, i, j); swap(coords, 2 * i, 2 * j); swap(coords, 2 * i + 1, 2 * j + 1); } function swap(arr, i, j) { var tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } },{}],30:[function(require,module,exports){ 'use strict'; module.exports = within; function within(ids, coords, qx, qy, r, nodeSize) { var stack = [0, ids.length - 1, 0]; var result = []; var r2 = r * r; while (stack.length) { var axis = stack.pop(); var right = stack.pop(); var left = stack.pop(); if (right - left <= nodeSize) { for (var i = left; i <= right; i++) { if (sqDist(coords[2 * i], coords[2 * i + 1], qx, qy) <= r2) result.push(ids[i]); } continue; } var m = Math.floor((left + right) / 2); var x = coords[2 * m]; var y = coords[2 * m + 1]; if (sqDist(x, y, qx, qy) <= r2) result.push(ids[m]); var nextAxis = (axis + 1) % 2; if (axis === 0 ? qx - r <= x : qy - r <= y) { stack.push(left); stack.push(m - 1); stack.push(nextAxis); } if (axis === 0 ? qx + r >= x : qy + r >= y) { stack.push(m + 1); stack.push(right); stack.push(nextAxis); } } return result; } function sqDist(ax, ay, bx, by) { var dx = ax - bx; var dy = ay - by; return dx * dx + dy * dy; } },{}],31:[function(require,module,exports){ 'use strict'; module.exports = Pbf; var ieee754 = require('ieee754'); function Pbf(buf) { this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0); this.pos = 0; this.type = 0; this.length = this.buf.length; } Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64 Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32 var SHIFT_LEFT_32 = (1 << 16) * (1 << 16), SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32; Pbf.prototype = { destroy: function() { this.buf = null; }, // === READING ================================================================= readFields: function(readField, result, end) { end = end || this.length; while (this.pos < end) { var val = this.readVarint(), tag = val >> 3, startPos = this.pos; this.type = val & 0x7; readField(tag, result, this); if (this.pos === startPos) this.skip(val); } return result; }, readMessage: function(readField, result) { return this.readFields(readField, result, this.readVarint() + this.pos); }, readFixed32: function() { var val = readUInt32(this.buf, this.pos); this.pos += 4; return val; }, readSFixed32: function() { var val = readInt32(this.buf, this.pos); this.pos += 4; return val; }, // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) readFixed64: function() { var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; this.pos += 8; return val; }, readSFixed64: function() { var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; this.pos += 8; return val; }, readFloat: function() { var val = ieee754.read(this.buf, this.pos, true, 23, 4); this.pos += 4; return val; }, readDouble: function() { var val = ieee754.read(this.buf, this.pos, true, 52, 8); this.pos += 8; return val; }, readVarint: function(isSigned) { var buf = this.buf, val, b; b = buf[this.pos++]; val = b & 0x7f; if (b < 0x80) return val; b = buf[this.pos++]; val |= (b & 0x7f) << 7; if (b < 0x80) return val; b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val; b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val; b = buf[this.pos]; val |= (b & 0x0f) << 28; return readVarintRemainder(val, isSigned, this); }, readVarint64: function() { // for compatibility with v2.0.1 return this.readVarint(true); }, readSVarint: function() { var num = this.readVarint(); return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding }, readBoolean: function() { return Boolean(this.readVarint()); }, readString: function() { var end = this.readVarint() + this.pos, str = readUtf8(this.buf, this.pos, end); this.pos = end; return str; }, readBytes: function() { var end = this.readVarint() + this.pos, buffer = this.buf.subarray(this.pos, end); this.pos = end; return buffer; }, // verbose for performance reasons; doesn't affect gzipped size readPackedVarint: function(arr, isSigned) { var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) arr.push(this.readVarint(isSigned)); return arr; }, readPackedSVarint: function(arr) { var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) arr.push(this.readSVarint()); return arr; }, readPackedBoolean: function(arr) { var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) arr.push(this.readBoolean()); return arr; }, readPackedFloat: function(arr) { var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) arr.push(this.readFloat()); return arr; }, readPackedDouble: function(arr) { var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) arr.push(this.readDouble()); return arr; }, readPackedFixed32: function(arr) { var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) arr.push(this.readFixed32()); return arr; }, readPackedSFixed32: function(arr) { var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) arr.push(this.readSFixed32()); return arr; }, readPackedFixed64: function(arr) { var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) arr.push(this.readFixed64()); return arr; }, readPackedSFixed64: function(arr) { var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) arr.push(this.readSFixed64()); return arr; }, skip: function(val) { var type = val & 0x7; if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {} else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos; else if (type === Pbf.Fixed32) this.pos += 4; else if (type === Pbf.Fixed64) this.pos += 8; else throw new Error('Unimplemented type: ' + type); }, // === WRITING ================================================================= writeTag: function(tag, type) { this.writeVarint((tag << 3) | type); }, realloc: function(min) { var length = this.length || 16; while (length < this.pos + min) length *= 2; if (length !== this.length) { var buf = new Uint8Array(length); buf.set(this.buf); this.buf = buf; this.length = length; } }, finish: function() { this.length = this.pos; this.pos = 0; return this.buf.subarray(0, this.length); }, writeFixed32: function(val) { this.realloc(4); writeInt32(this.buf, val, this.pos); this.pos += 4; }, writeSFixed32: function(val) { this.realloc(4); writeInt32(this.buf, val, this.pos); this.pos += 4; }, writeFixed64: function(val) { this.realloc(8); writeInt32(this.buf, val & -1, this.pos); writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); this.pos += 8; }, writeSFixed64: function(val) { this.realloc(8); writeInt32(this.buf, val & -1, this.pos); writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); this.pos += 8; }, writeVarint: function(val) { val = +val || 0; if (val > 0xfffffff || val < 0) { writeBigVarint(val, this); return; } this.realloc(4); this.buf[this.pos++] = val & 0x7f | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return; this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return; this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return; this.buf[this.pos++] = (val >>> 7) & 0x7f; }, writeSVarint: function(val) { this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); }, writeBoolean: function(val) { this.writeVarint(Boolean(val)); }, writeString: function(str) { str = String(str); this.realloc(str.length * 4); this.pos++; // reserve 1 byte for short string length var startPos = this.pos; // write the string directly to the buffer and see how much was written this.pos = writeUtf8(this.buf, str, this.pos); var len = this.pos - startPos; if (len >= 0x80) makeRoomForExtraLength(startPos, len, this); // finally, write the message length in the reserved place and restore the position this.pos = startPos - 1; this.writeVarint(len); this.pos += len; }, writeFloat: function(val) { this.realloc(4); ieee754.write(this.buf, val, this.pos, true, 23, 4); this.pos += 4; }, writeDouble: function(val) { this.realloc(8); ieee754.write(this.buf, val, this.pos, true, 52, 8); this.pos += 8; }, writeBytes: function(buffer) { var len = buffer.length; this.writeVarint(len); this.realloc(len); for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i]; }, writeRawMessage: function(fn, obj) { this.pos++; // reserve 1 byte for short message length // write the message directly to the buffer and see how much was written var startPos = this.pos; fn(obj, this); var len = this.pos - startPos; if (len >= 0x80) makeRoomForExtraLength(startPos, len, this); // finally, write the message length in the reserved place and restore the position this.pos = startPos - 1; this.writeVarint(len); this.pos += len; }, writeMessage: function(tag, fn, obj) { this.writeTag(tag, Pbf.Bytes); this.writeRawMessage(fn, obj); }, writePackedVarint: function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr); }, writePackedSVarint: function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr); }, writePackedBoolean: function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr); }, writePackedFloat: function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr); }, writePackedDouble: function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr); }, writePackedFixed32: function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr); }, writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); }, writePackedFixed64: function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr); }, writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); }, writeBytesField: function(tag, buffer) { this.writeTag(tag, Pbf.Bytes); this.writeBytes(buffer); }, writeFixed32Field: function(tag, val) { this.writeTag(tag, Pbf.Fixed32); this.writeFixed32(val); }, writeSFixed32Field: function(tag, val) { this.writeTag(tag, Pbf.Fixed32); this.writeSFixed32(val); }, writeFixed64Field: function(tag, val) { this.writeTag(tag, Pbf.Fixed64); this.writeFixed64(val); }, writeSFixed64Field: function(tag, val) { this.writeTag(tag, Pbf.Fixed64); this.writeSFixed64(val); }, writeVarintField: function(tag, val) { this.writeTag(tag, Pbf.Varint); this.writeVarint(val); }, writeSVarintField: function(tag, val) { this.writeTag(tag, Pbf.Varint); this.writeSVarint(val); }, writeStringField: function(tag, str) { this.writeTag(tag, Pbf.Bytes); this.writeString(str); }, writeFloatField: function(tag, val) { this.writeTag(tag, Pbf.Fixed32); this.writeFloat(val); }, writeDoubleField: function(tag, val) { this.writeTag(tag, Pbf.Fixed64); this.writeDouble(val); }, writeBooleanField: function(tag, val) { this.writeVarintField(tag, Boolean(val)); } }; function readVarintRemainder(l, s, p) { var buf = p.buf, h, b; b = buf[p.pos++]; h = (b & 0x70) >> 4; if (b < 0x80) return toNum(l, h, s); b = buf[p.pos++]; h |= (b & 0x7f) << 3; if (b < 0x80) return toNum(l, h, s); b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s); b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s); b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s); b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s); throw new Error('Expected varint not more than 10 bytes'); } function readPackedEnd(pbf) { return pbf.type === Pbf.Bytes ? pbf.readVarint() + pbf.pos : pbf.pos + 1; } function toNum(low, high, isSigned) { if (isSigned) { return high * 0x100000000 + (low >>> 0); } return ((high >>> 0) * 0x100000000) + (low >>> 0); } function writeBigVarint(val, pbf) { var low, high; if (val >= 0) { low = (val % 0x100000000) | 0; high = (val / 0x100000000) | 0; } else { low = ~(-val % 0x100000000); high = ~(-val / 0x100000000); if (low ^ 0xffffffff) { low = (low + 1) | 0; } else { low = 0; high = (high + 1) | 0; } } if (val >= 0x10000000000000000 || val < -0x10000000000000000) { throw new Error('Given varint doesn\'t fit into 10 bytes'); } pbf.realloc(10); writeBigVarintLow(low, high, pbf); writeBigVarintHigh(high, pbf); } function writeBigVarintLow(low, high, pbf) { pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; pbf.buf[pbf.pos] = low & 0x7f; } function writeBigVarintHigh(high, pbf) { var lsb = (high & 0x07) << 4; pbf.buf[pbf.pos++] |= lsb | ((high >>>= 3) ? 0x80 : 0); if (!high) return; pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return; pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return; pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return; pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return; pbf.buf[pbf.pos++] = high & 0x7f; } function makeRoomForExtraLength(startPos, len, pbf) { var extraLen = len <= 0x3fff ? 1 : len <= 0x1fffff ? 2 : len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7)); // if 1 byte isn't enough for encoding message length, shift the data to the right pbf.realloc(extraLen); for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i]; } function writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]); } function writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]); } function writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]); } function writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]); } function writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]); } function writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]); } function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); } function writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]); } function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); } // Buffer code below from https://github.com/feross/buffer, MIT-licensed function readUInt32(buf, pos) { return ((buf[pos]) | (buf[pos + 1] << 8) | (buf[pos + 2] << 16)) + (buf[pos + 3] * 0x1000000); } function writeInt32(buf, val, pos) { buf[pos] = val; buf[pos + 1] = (val >>> 8); buf[pos + 2] = (val >>> 16); buf[pos + 3] = (val >>> 24); } function readInt32(buf, pos) { return ((buf[pos]) | (buf[pos + 1] << 8) | (buf[pos + 2] << 16)) + (buf[pos + 3] << 24); } function readUtf8(buf, pos, end) { var str = ''; var i = pos; while (i < end) { var b0 = buf[i]; var c = null; // codepoint var bytesPerSequence = b0 > 0xEF ? 4 : b0 > 0xDF ? 3 : b0 > 0xBF ? 2 : 1; if (i + bytesPerSequence > end) break; var b1, b2, b3; if (bytesPerSequence === 1) { if (b0 < 0x80) { c = b0; } } else if (bytesPerSequence === 2) { b1 = buf[i + 1]; if ((b1 & 0xC0) === 0x80) { c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F); if (c <= 0x7F) { c = null; } } } else if (bytesPerSequence === 3) { b1 = buf[i + 1]; b2 = buf[i + 2]; if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) { c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F); if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) { c = null; } } } else if (bytesPerSequence === 4) { b1 = buf[i + 1]; b2 = buf[i + 2]; b3 = buf[i + 3]; if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) { c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F); if (c <= 0xFFFF || c >= 0x110000) { c = null; } } } if (c === null) { c = 0xFFFD; bytesPerSequence = 1; } else if (c > 0xFFFF) { c -= 0x10000; str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800); c = 0xDC00 | c & 0x3FF; } str += String.fromCharCode(c); i += bytesPerSequence; } return str; } function writeUtf8(buf, str, pos) { for (var i = 0, c, lead; i < str.length; i++) { c = str.charCodeAt(i); // code point if (c > 0xD7FF && c < 0xE000) { if (lead) { if (c < 0xDC00) { buf[pos++] = 0xEF; buf[pos++] = 0xBF; buf[pos++] = 0xBD; lead = c; continue; } else { c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000; lead = null; } } else { if (c > 0xDBFF || (i + 1 === str.length)) { buf[pos++] = 0xEF; buf[pos++] = 0xBF; buf[pos++] = 0xBD; } else { lead = c; } continue; } } else if (lead) { buf[pos++] = 0xEF; buf[pos++] = 0xBF; buf[pos++] = 0xBD; lead = null; } if (c < 0x80) { buf[pos++] = c; } else { if (c < 0x800) { buf[pos++] = c >> 0x6 | 0xC0; } else { if (c < 0x10000) { buf[pos++] = c >> 0xC | 0xE0; } else { buf[pos++] = c >> 0x12 | 0xF0; buf[pos++] = c >> 0xC & 0x3F | 0x80; } buf[pos++] = c >> 0x6 & 0x3F | 0x80; } buf[pos++] = c & 0x3F | 0x80; } } return pos; } },{"ieee754":26}],32:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it // don't break things. But we need to wrap it in a try catch in case it is // wrapped in strict mode code which doesn't define any globals. It's inside a // function because try/catches deoptimize in certain engines. var cachedSetTimeout; var cachedClearTimeout; function defaultSetTimout() { throw new Error('setTimeout has not been defined'); } function defaultClearTimeout () { throw new Error('clearTimeout has not been defined'); } (function () { try { if (typeof setTimeout === 'function') { cachedSetTimeout = setTimeout; } else { cachedSetTimeout = defaultSetTimout; } } catch (e) { cachedSetTimeout = defaultSetTimout; } try { if (typeof clearTimeout === 'function') { cachedClearTimeout = clearTimeout; } else { cachedClearTimeout = defaultClearTimeout; } } catch (e) { cachedClearTimeout = defaultClearTimeout; } } ()) function runTimeout(fun) { if (cachedSetTimeout === setTimeout) { //normal enviroments in sane situations return setTimeout(fun, 0); } // if setTimeout wasn't available but was latter defined if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { cachedSetTimeout = setTimeout; return setTimeout(fun, 0); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedSetTimeout(fun, 0); } catch(e){ try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedSetTimeout.call(null, fun, 0); } catch(e){ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error return cachedSetTimeout.call(this, fun, 0); } } } function runClearTimeout(marker) { if (cachedClearTimeout === clearTimeout) { //normal enviroments in sane situations return clearTimeout(marker); } // if clearTimeout wasn't available but was latter defined if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { cachedClearTimeout = clearTimeout; return clearTimeout(marker); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedClearTimeout(marker); } catch (e){ try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedClearTimeout.call(null, marker); } catch (e){ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. // Some versions of I.E. have different rules for clearTimeout vs setTimeout return cachedClearTimeout.call(this, marker); } } } var queue = []; var draining = false; var currentQueue; var queueIndex = -1; function cleanUpNextTick() { if (!draining || !currentQueue) { return; } draining = false; if (currentQueue.length) { queue = currentQueue.concat(queue); } else { queueIndex = -1; } if (queue.length) { drainQueue(); } } function drainQueue() { if (draining) { return; } var timeout = runTimeout(cleanUpNextTick); draining = true; var len = queue.length; while(len) { currentQueue = queue; queue = []; while (++queueIndex < len) { if (currentQueue) { currentQueue[queueIndex].run(); } } queueIndex = -1; len = queue.length; } currentQueue = null; draining = false; runClearTimeout(timeout); } process.nextTick = function (fun) { var args = new Array(arguments.length - 1); if (arguments.length > 1) { for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { runTimeout(drainQueue); } }; // v8 likes predictible objects function Item(fun, array) { this.fun = fun; this.array = array; } Item.prototype.run = function () { this.fun.apply(null, this.array); }; process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.version = ''; // empty string to avoid regexp issues process.versions = {}; function noop() {} process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.prependListener = noop; process.prependOnceListener = noop; process.listeners = function (name) { return [] } process.binding = function (name) { throw new Error('process.binding is not supported'); }; process.cwd = function () { return '/' }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; process.umask = function() { return 0; }; },{}],33:[function(require,module,exports){ 'use strict'; module.exports = partialSort; // Floyd-Rivest selection algorithm: // Rearrange items so that all items in the [left, k] range are smaller than all items in (k, right]; // The k-th element will have the (k - left + 1)th smallest value in [left, right] function partialSort(arr, k, left, right, compare) { left = left || 0; right = right || (arr.length - 1); compare = compare || defaultCompare; while (right > left) { if (right - left > 600) { var n = right - left + 1; var m = k - left + 1; var z = Math.log(n); var s = 0.5 * Math.exp(2 * z / 3); var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); var newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); partialSort(arr, k, newLeft, newRight, compare); } var t = arr[k]; var i = left; var j = right; swap(arr, left, k); if (compare(arr[right], t) > 0) swap(arr, left, right); while (i < j) { swap(arr, i, j); i++; j--; while (compare(arr[i], t) < 0) i++; while (compare(arr[j], t) > 0) j--; } if (compare(arr[left], t) === 0) swap(arr, left, j); else { j++; swap(arr, j, right); } if (j <= k) left = j + 1; if (k <= j) right = j - 1; } } function swap(arr, i, j) { var tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } function defaultCompare(a, b) { return a < b ? -1 : a > b ? 1 : 0; } },{}],34:[function(require,module,exports){ 'use strict'; var kdbush = require('kdbush'); module.exports = supercluster; function supercluster(options) { return new SuperCluster(options); } function SuperCluster(options) { this.options = extend(Object.create(this.options), options); this.trees = new Array(this.options.maxZoom + 1); } SuperCluster.prototype = { options: { minZoom: 0, // min zoom to generate clusters on maxZoom: 16, // max zoom level to cluster the points on radius: 40, // cluster radius in pixels extent: 512, // tile extent (radius is calculated relative to it) nodeSize: 64, // size of the KD-tree leaf node, affects performance log: false, // whether to log timing info // a reduce function for calculating custom cluster properties reduce: null, // function (accumulated, props) { accumulated.sum += props.sum; } // initial properties of a cluster (before running the reducer) initial: function () { return {}; }, // function () { return {sum: 0}; }, // properties to use for individual points when running the reducer map: function (props) { return props; } // function (props) { return {sum: props.my_value}; }, }, load: function (points) { var log = this.options.log; if (log) console.time('total time'); var timerId = 'prepare ' + points.length + ' points'; if (log) console.time(timerId); this.points = points; // generate a cluster object for each point var clusters = points.map(createPointCluster); if (log) console.timeEnd(timerId); // cluster points on max zoom, then cluster the results on previous zoom, etc.; // results in a cluster hierarchy across zoom levels for (var z = this.options.maxZoom; z >= this.options.minZoom; z--) { var now = +Date.now(); // index input points into a KD-tree this.trees[z + 1] = kdbush(clusters, getX, getY, this.options.nodeSize, Float32Array); clusters = this._cluster(clusters, z); // create a new set of clusters for the zoom if (log) console.log('z%d: %d clusters in %dms', z, clusters.length, +Date.now() - now); } // index top-level clusters this.trees[this.options.minZoom] = kdbush(clusters, getX, getY, this.options.nodeSize, Float32Array); if (log) console.timeEnd('total time'); return this; }, getClusters: function (bbox, zoom) { var tree = this.trees[this._limitZoom(zoom)]; var ids = tree.range(lngX(bbox[0]), latY(bbox[3]), lngX(bbox[2]), latY(bbox[1])); var clusters = []; for (var i = 0; i < ids.length; i++) { var c = tree.points[ids[i]]; clusters.push(c.numPoints ? getClusterJSON(c) : this.points[c.id]); } return clusters; }, getChildren: function (clusterId, clusterZoom) { var origin = this.trees[clusterZoom + 1].points[clusterId]; var r = this.options.radius / (this.options.extent * Math.pow(2, clusterZoom)); var points = this.trees[clusterZoom + 1].within(origin.x, origin.y, r); var children = []; for (var i = 0; i < points.length; i++) { var c = this.trees[clusterZoom + 1].points[points[i]]; if (c.parentId === clusterId) { children.push(c.numPoints ? getClusterJSON(c) : this.points[c.id]); } } return children; }, getLeaves: function (clusterId, clusterZoom, limit, offset) { limit = limit || 10; offset = offset || 0; var leaves = []; this._appendLeaves(leaves, clusterId, clusterZoom, limit, offset, 0); return leaves; }, getTile: function (z, x, y) { var tree = this.trees[this._limitZoom(z)]; var z2 = Math.pow(2, z); var extent = this.options.extent; var r = this.options.radius; var p = r / extent; var top = (y - p) / z2; var bottom = (y + 1 + p) / z2; var tile = { features: [] }; this._addTileFeatures( tree.range((x - p) / z2, top, (x + 1 + p) / z2, bottom), tree.points, x, y, z2, tile); if (x === 0) { this._addTileFeatures( tree.range(1 - p / z2, top, 1, bottom), tree.points, z2, y, z2, tile); } if (x === z2 - 1) { this._addTileFeatures( tree.range(0, top, p / z2, bottom), tree.points, -1, y, z2, tile); } return tile.features.length ? tile : null; }, getClusterExpansionZoom: function (clusterId, clusterZoom) { while (clusterZoom < this.options.maxZoom) { var children = this.getChildren(clusterId, clusterZoom); clusterZoom++; if (children.length !== 1) break; clusterId = children[0].properties.cluster_id; } return clusterZoom; }, _appendLeaves: function (result, clusterId, clusterZoom, limit, offset, skipped) { var children = this.getChildren(clusterId, clusterZoom); for (var i = 0; i < children.length; i++) { var props = children[i].properties; if (props.cluster) { if (skipped + props.point_count <= offset) { // skip the whole cluster skipped += props.point_count; } else { // enter the cluster skipped = this._appendLeaves( result, props.cluster_id, clusterZoom + 1, limit, offset, skipped); // exit the cluster } } else if (skipped < offset) { // skip a single point skipped++; } else { // add a single point result.push(children[i]); } if (result.length === limit) break; } return skipped; }, _addTileFeatures: function (ids, points, x, y, z2, tile) { for (var i = 0; i < ids.length; i++) { var c = points[ids[i]]; tile.features.push({ type: 1, geometry: [[ Math.round(this.options.extent * (c.x * z2 - x)), Math.round(this.options.extent * (c.y * z2 - y)) ]], tags: c.numPoints ? getClusterProperties(c) : this.points[c.id].properties }); } }, _limitZoom: function (z) { return Math.max(this.options.minZoom, Math.min(z, this.options.maxZoom + 1)); }, _cluster: function (points, zoom) { var clusters = []; var r = this.options.radius / (this.options.extent * Math.pow(2, zoom)); // loop through each point for (var i = 0; i < points.length; i++) { var p = points[i]; // if we've already visited the point at this zoom level, skip it if (p.zoom <= zoom) continue; p.zoom = zoom; // find all nearby points var tree = this.trees[zoom + 1]; var neighborIds = tree.within(p.x, p.y, r); var numPoints = p.numPoints || 1; var wx = p.x * numPoints; var wy = p.y * numPoints; var clusterProperties = null; if (this.options.reduce) { clusterProperties = this.options.initial(); this._accumulate(clusterProperties, p); } for (var j = 0; j < neighborIds.length; j++) { var b = tree.points[neighborIds[j]]; // filter out neighbors that are too far or already processed if (zoom < b.zoom) { var numPoints2 = b.numPoints || 1; b.zoom = zoom; // save the zoom (so it doesn't get processed twice) wx += b.x * numPoints2; // accumulate coordinates for calculating weighted center wy += b.y * numPoints2; numPoints += numPoints2; b.parentId = i; if (this.options.reduce) { this._accumulate(clusterProperties, b); } } } if (numPoints === 1) { clusters.push(p); } else { p.parentId = i; clusters.push(createCluster(wx / numPoints, wy / numPoints, numPoints, i, clusterProperties)); } } return clusters; }, _accumulate: function (clusterProperties, point) { var properties = point.numPoints ? point.properties : this.options.map(this.points[point.id].properties); this.options.reduce(clusterProperties, properties); } }; function createCluster(x, y, numPoints, id, properties) { return { x: x, // weighted cluster center y: y, zoom: Infinity, // the last zoom the cluster was processed at id: id, // index of the first child of the cluster in the zoom level tree properties: properties, parentId: -1, // parent cluster id numPoints: numPoints }; } function createPointCluster(p, id) { var coords = p.geometry.coordinates; return { x: lngX(coords[0]), // projected point coordinates y: latY(coords[1]), zoom: Infinity, // the last zoom the point was processed at id: id, // index of the source feature in the original input array parentId: -1 // parent cluster id }; } function getClusterJSON(cluster) { return { type: 'Feature', properties: getClusterProperties(cluster), geometry: { type: 'Point', coordinates: [xLng(cluster.x), yLat(cluster.y)] } }; } function getClusterProperties(cluster) { var count = cluster.numPoints; var abbrev = count >= 10000 ? Math.round(count / 1000) + 'k' : count >= 1000 ? (Math.round(count / 100) / 10) + 'k' : count; return extend(extend({}, cluster.properties), { cluster: true, cluster_id: cluster.id, point_count: count, point_count_abbreviated: abbrev }); } // longitude/latitude to spherical mercator in [0..1] range function lngX(lng) { return lng / 360 + 0.5; } function latY(lat) { var sin = Math.sin(lat * Math.PI / 180), y = (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI); return y < 0 ? 0 : y > 1 ? 1 : y; } // spherical mercator to longitude/latitude function xLng(x) { return (x - 0.5) * 360; } function yLat(y) { var y2 = (180 - y * 360) * Math.PI / 180; return 360 * Math.atan(Math.exp(y2)) / Math.PI - 90; } function extend(dest, src) { for (var id in src) dest[id] = src[id]; return dest; } function getX(p) { return p.x; } function getY(p) { return p.y; } },{"kdbush":27}],35:[function(require,module,exports){ 'use strict'; module.exports = TinyQueue; function TinyQueue(data, compare) { if (!(this instanceof TinyQueue)) return new TinyQueue(data, compare); this.data = data || []; this.length = this.data.length; this.compare = compare || defaultCompare; if (this.length > 0) { for (var i = (this.length >> 1); i >= 0; i--) this._down(i); } } function defaultCompare(a, b) { return a < b ? -1 : a > b ? 1 : 0; } TinyQueue.prototype = { push: function (item) { this.data.push(item); this.length++; this._up(this.length - 1); }, pop: function () { if (this.length === 0) return undefined; var top = this.data[0]; this.length--; if (this.length > 0) { this.data[0] = this.data[this.length]; this._down(0); } this.data.pop(); return top; }, peek: function () { return this.data[0]; }, _up: function (pos) { var data = this.data; var compare = this.compare; var item = data[pos]; while (pos > 0) { var parent = (pos - 1) >> 1; var current = data[parent]; if (compare(item, current) >= 0) break; data[pos] = current; pos = parent; } data[pos] = item; }, _down: function (pos) { var data = this.data; var compare = this.compare; var len = this.length; var halfLen = len >> 1; var item = data[pos]; while (pos < halfLen) { var left = (pos << 1) + 1; var right = left + 1; var best = data[left]; if (right < len && compare(data[right], best) < 0) { left = right; best = data[right]; } if (compare(best, item) >= 0) break; data[pos] = best; pos = left; } data[pos] = item; } }; },{}],36:[function(require,module,exports){ if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); }; } else { // old school shim for old browsers module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor var TempCtor = function () {} TempCtor.prototype = superCtor.prototype ctor.prototype = new TempCtor() ctor.prototype.constructor = ctor } } },{}],37:[function(require,module,exports){ module.exports = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; } },{}],38:[function(require,module,exports){ (function (process,global){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. var formatRegExp = /%[sdj%]/g; exports.format = function(f) { if (!isString(f)) { var objects = []; for (var i = 0; i < arguments.length; i++) { objects.push(inspect(arguments[i])); } return objects.join(' '); } var i = 1; var args = arguments; var len = args.length; var str = String(f).replace(formatRegExp, function(x) { if (x === '%%') return '%'; if (i >= len) return x; switch (x) { case '%s': return String(args[i++]); case '%d': return Number(args[i++]); case '%j': try { return JSON.stringify(args[i++]); } catch (_) { return '[Circular]'; } default: return x; } }); for (var x = args[i]; i < len; x = args[++i]) { if (isNull(x) || !isObject(x)) { str += ' ' + x; } else { str += ' ' + inspect(x); } } return str; }; // Mark that a method should not be used. // Returns a modified function which warns once by default. // If --no-deprecation is set, then it is a no-op. exports.deprecate = function(fn, msg) { // Allow for deprecating things in the process of starting up. if (isUndefined(global.process)) { return function() { return exports.deprecate(fn, msg).apply(this, arguments); }; } if (process.noDeprecation === true) { return fn; } var warned = false; function deprecated() { if (!warned) { if (process.throwDeprecation) { throw new Error(msg); } else if (process.traceDeprecation) { console.trace(msg); } else { console.error(msg); } warned = true; } return fn.apply(this, arguments); } return deprecated; }; var debugs = {}; var debugEnviron; exports.debuglog = function(set) { if (isUndefined(debugEnviron)) debugEnviron = process.env.NODE_DEBUG || ''; set = set.toUpperCase(); if (!debugs[set]) { if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { var pid = process.pid; debugs[set] = function() { var msg = exports.format.apply(exports, arguments); console.error('%s %d: %s', set, pid, msg); }; } else { debugs[set] = function() {}; } } return debugs[set]; }; /** * Echos the value of a value. Trys to print the value out * in the best way possible given the different types. * * @param {Object} obj The object to print out. * @param {Object} opts Optional options object that alters the output. */ /* legacy: obj, showHidden, depth, colors*/ function inspect(obj, opts) { // default options var ctx = { seen: [], stylize: stylizeNoColor }; // legacy... if (arguments.length >= 3) ctx.depth = arguments[2]; if (arguments.length >= 4) ctx.colors = arguments[3]; if (isBoolean(opts)) { // legacy... ctx.showHidden = opts; } else if (opts) { // got an "options" object exports._extend(ctx, opts); } // set default options if (isUndefined(ctx.showHidden)) ctx.showHidden = false; if (isUndefined(ctx.depth)) ctx.depth = 2; if (isUndefined(ctx.colors)) ctx.colors = false; if (isUndefined(ctx.customInspect)) ctx.customInspect = true; if (ctx.colors) ctx.stylize = stylizeWithColor; return formatValue(ctx, obj, ctx.depth); } exports.inspect = inspect; // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics inspect.colors = { 'bold' : [1, 22], 'italic' : [3, 23], 'underline' : [4, 24], 'inverse' : [7, 27], 'white' : [37, 39], 'grey' : [90, 39], 'black' : [30, 39], 'blue' : [34, 39], 'cyan' : [36, 39], 'green' : [32, 39], 'magenta' : [35, 39], 'red' : [31, 39], 'yellow' : [33, 39] }; // Don't use 'blue' not visible on cmd.exe inspect.styles = { 'special': 'cyan', 'number': 'yellow', 'boolean': 'yellow', 'undefined': 'grey', 'null': 'bold', 'string': 'green', 'date': 'magenta', // "name": intentionally not styling 'regexp': 'red' }; function stylizeWithColor(str, styleType) { var style = inspect.styles[styleType]; if (style) { return '\u001b[' + inspect.colors[style][0] + 'm' + str + '\u001b[' + inspect.colors[style][1] + 'm'; } else { return str; } } function stylizeNoColor(str, styleType) { return str; } function arrayToHash(array) { var hash = {}; array.forEach(function(val, idx) { hash[val] = true; }); return hash; } function formatValue(ctx, value, recurseTimes) { // Provide a hook for user-specified inspect functions. // Check that value is an object with an inspect function on it if (ctx.customInspect && value && isFunction(value.inspect) && // Filter out the util module, it's inspect function is special value.inspect !== exports.inspect && // Also filter out any prototype objects using the circular check. !(value.constructor && value.constructor.prototype === value)) { var ret = value.inspect(recurseTimes, ctx); if (!isString(ret)) { ret = formatValue(ctx, ret, recurseTimes); } return ret; } // Primitive types cannot have properties var primitive = formatPrimitive(ctx, value); if (primitive) { return primitive; } // Look up the keys of the object. var keys = Object.keys(value); var visibleKeys = arrayToHash(keys); if (ctx.showHidden) { keys = Object.getOwnPropertyNames(value); } // IE doesn't make error fields non-enumerable // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx if (isError(value) && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { return formatError(value); } // Some type of object without properties can be shortcutted. if (keys.length === 0) { if (isFunction(value)) { var name = value.name ? ': ' + value.name : ''; return ctx.stylize('[Function' + name + ']', 'special'); } if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } if (isDate(value)) { return ctx.stylize(Date.prototype.toString.call(value), 'date'); } if (isError(value)) { return formatError(value); } } var base = '', array = false, braces = ['{', '}']; // Make Array say that they are Array if (isArray(value)) { array = true; braces = ['[', ']']; } // Make functions say that they are functions if (isFunction(value)) { var n = value.name ? ': ' + value.name : ''; base = ' [Function' + n + ']'; } // Make RegExps say that they are RegExps if (isRegExp(value)) { base = ' ' + RegExp.prototype.toString.call(value); } // Make dates with properties first say the date if (isDate(value)) { base = ' ' + Date.prototype.toUTCString.call(value); } // Make error with message first say the error if (isError(value)) { base = ' ' + formatError(value); } if (keys.length === 0 && (!array || value.length == 0)) { return braces[0] + base + braces[1]; } if (recurseTimes < 0) { if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } else { return ctx.stylize('[Object]', 'special'); } } ctx.seen.push(value); var output; if (array) { output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); } else { output = keys.map(function(key) { return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); }); } ctx.seen.pop(); return reduceToSingleString(output, base, braces); } function formatPrimitive(ctx, value) { if (isUndefined(value)) return ctx.stylize('undefined', 'undefined'); if (isString(value)) { var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') .replace(/'/g, "\\'") .replace(/\\"/g, '"') + '\''; return ctx.stylize(simple, 'string'); } if (isNumber(value)) return ctx.stylize('' + value, 'number'); if (isBoolean(value)) return ctx.stylize('' + value, 'boolean'); // For some reason typeof null is "object", so special case here. if (isNull(value)) return ctx.stylize('null', 'null'); } function formatError(value) { return '[' + Error.prototype.toString.call(value) + ']'; } function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { var output = []; for (var i = 0, l = value.length; i < l; ++i) { if (hasOwnProperty(value, String(i))) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true)); } else { output.push(''); } } keys.forEach(function(key) { if (!key.match(/^\d+$/)) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true)); } }); return output; } function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { var name, str, desc; desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; if (desc.get) { if (desc.set) { str = ctx.stylize('[Getter/Setter]', 'special'); } else { str = ctx.stylize('[Getter]', 'special'); } } else { if (desc.set) { str = ctx.stylize('[Setter]', 'special'); } } if (!hasOwnProperty(visibleKeys, key)) { name = '[' + key + ']'; } if (!str) { if (ctx.seen.indexOf(desc.value) < 0) { if (isNull(recurseTimes)) { str = formatValue(ctx, desc.value, null); } else { str = formatValue(ctx, desc.value, recurseTimes - 1); } if (str.indexOf('\n') > -1) { if (array) { str = str.split('\n').map(function(line) { return ' ' + line; }).join('\n').substr(2); } else { str = '\n' + str.split('\n').map(function(line) { return ' ' + line; }).join('\n'); } } } else { str = ctx.stylize('[Circular]', 'special'); } } if (isUndefined(name)) { if (array && key.match(/^\d+$/)) { return str; } name = JSON.stringify('' + key); if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { name = name.substr(1, name.length - 2); name = ctx.stylize(name, 'name'); } else { name = name.replace(/'/g, "\\'") .replace(/\\"/g, '"') .replace(/(^"|"$)/g, "'"); name = ctx.stylize(name, 'string'); } } return name + ': ' + str; } function reduceToSingleString(output, base, braces) { var numLinesEst = 0; var length = output.reduce(function(prev, cur) { numLinesEst++; if (cur.indexOf('\n') >= 0) numLinesEst++; return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; }, 0); if (length > 60) { return braces[0] + (base === '' ? '' : base + '\n ') + ' ' + output.join(',\n ') + ' ' + braces[1]; } return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; } // NOTE: These type checking functions intentionally don't use `instanceof` // because it is fragile and can be easily faked with `Object.create()`. function isArray(ar) { return Array.isArray(ar); } exports.isArray = isArray; function isBoolean(arg) { return typeof arg === 'boolean'; } exports.isBoolean = isBoolean; function isNull(arg) { return arg === null; } exports.isNull = isNull; function isNullOrUndefined(arg) { return arg == null; } exports.isNullOrUndefined = isNullOrUndefined; function isNumber(arg) { return typeof arg === 'number'; } exports.isNumber = isNumber; function isString(arg) { return typeof arg === 'string'; } exports.isString = isString; function isSymbol(arg) { return typeof arg === 'symbol'; } exports.isSymbol = isSymbol; function isUndefined(arg) { return arg === void 0; } exports.isUndefined = isUndefined; function isRegExp(re) { return isObject(re) && objectToString(re) === '[object RegExp]'; } exports.isRegExp = isRegExp; function isObject(arg) { return typeof arg === 'object' && arg !== null; } exports.isObject = isObject; function isDate(d) { return isObject(d) && objectToString(d) === '[object Date]'; } exports.isDate = isDate; function isError(e) { return isObject(e) && (objectToString(e) === '[object Error]' || e instanceof Error); } exports.isError = isError; function isFunction(arg) { return typeof arg === 'function'; } exports.isFunction = isFunction; function isPrimitive(arg) { return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || typeof arg === 'symbol' || // ES6 symbol typeof arg === 'undefined'; } exports.isPrimitive = isPrimitive; exports.isBuffer = require('./support/isBuffer'); function objectToString(o) { return Object.prototype.toString.call(o); } function pad(n) { return n < 10 ? '0' + n.toString(10) : n.toString(10); } var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; // 26 Feb 16:19:34 function timestamp() { var d = new Date(); var time = [pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds())].join(':'); return [d.getDate(), months[d.getMonth()], time].join(' '); } // log is just a thin wrapper to console.log that prepends a timestamp exports.log = function() { console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); }; /** * Inherit the prototype methods from one constructor into another. * * The Function.prototype.inherits from lang.js rewritten as a standalone * function (not on Function.prototype). NOTE: If this file is to be loaded * during bootstrapping this function needs to be rewritten using some native * functions as prototype setup using normal JavaScript does not work as * expected during bootstrapping (see mirror.js in r114903). * * @param {function} ctor Constructor function which needs to inherit the * prototype. * @param {function} superCtor Constructor function to inherit prototype from. */ exports.inherits = require('inherits'); exports._extend = function(origin, add) { // Don't do anything if add isn't an object if (!add || !isObject(add)) return origin; var keys = Object.keys(add); var i = keys.length; while (i--) { origin[keys[i]] = add[keys[i]]; } return origin; }; function hasOwnProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"./support/isBuffer":37,"_process":32,"inherits":36}],39:[function(require,module,exports){ var Pbf = require('pbf') var GeoJSONWrapper = require('./lib/geojson_wrapper') module.exports = fromVectorTileJs module.exports.fromVectorTileJs = fromVectorTileJs module.exports.fromGeojsonVt = fromGeojsonVt module.exports.GeoJSONWrapper = GeoJSONWrapper /** * Serialize a vector-tile-js-created tile to pbf * * @param {Object} tile * @return {Buffer} uncompressed, pbf-serialized tile data */ function fromVectorTileJs (tile) { var out = new Pbf() writeTile(tile, out) return out.finish() } /** * Serialized a geojson-vt-created tile to pbf. * * @param {Object} layers - An object mapping layer names to geojson-vt-created vector tile objects * @return {Buffer} uncompressed, pbf-serialized tile data */ function fromGeojsonVt (layers) { var l = {} for (var k in layers) { l[k] = new GeoJSONWrapper(layers[k].features) l[k].name = k } return fromVectorTileJs({layers: l}) } function writeTile (tile, pbf) { for (var key in tile.layers) { pbf.writeMessage(3, writeLayer, tile.layers[key]) } } function writeLayer (layer, pbf) { pbf.writeVarintField(15, layer.version || 1) pbf.writeStringField(1, layer.name || '') pbf.writeVarintField(5, layer.extent || 4096) var i var context = { keys: [], values: [], keycache: {}, valuecache: {} } for (i = 0; i < layer.length; i++) { context.feature = layer.feature(i) pbf.writeMessage(2, writeFeature, context) } var keys = context.keys for (i = 0; i < keys.length; i++) { pbf.writeStringField(3, keys[i]) } var values = context.values for (i = 0; i < values.length; i++) { pbf.writeMessage(4, writeValue, values[i]) } } function writeFeature (context, pbf) { var feature = context.feature if (feature.id !== undefined) { pbf.writeVarintField(1, feature.id) } pbf.writeMessage(2, writeProperties, context) pbf.writeVarintField(3, feature.type) pbf.writeMessage(4, writeGeometry, feature) } function writeProperties (context, pbf) { var feature = context.feature var keys = context.keys var values = context.values var keycache = context.keycache var valuecache = context.valuecache for (var key in feature.properties) { var keyIndex = keycache[key] if (typeof keyIndex === 'undefined') { keys.push(key) keyIndex = keys.length - 1 keycache[key] = keyIndex } pbf.writeVarint(keyIndex) var value = feature.properties[key] var type = typeof value if (type !== 'string' && type !== 'boolean' && type !== 'number') { value = JSON.stringify(value) } var valueKey = type + ':' + value var valueIndex = valuecache[valueKey] if (typeof valueIndex === 'undefined') { values.push(value) valueIndex = values.length - 1 valuecache[valueKey] = valueIndex } pbf.writeVarint(valueIndex) } } function command (cmd, length) { return (length << 3) + (cmd & 0x7) } function zigzag (num) { return (num << 1) ^ (num >> 31) } function writeGeometry (feature, pbf) { var geometry = feature.loadGeometry() var type = feature.type var x = 0 var y = 0 var rings = geometry.length for (var r = 0; r < rings; r++) { var ring = geometry[r] var count = 1 if (type === 1) { count = ring.length } pbf.writeVarint(command(1, count)) // moveto for (var i = 0; i < ring.length; i++) { if (i === 1 && type !== 1) { pbf.writeVarint(command(2, ring.length - 1)) // lineto } var dx = ring[i].x - x var dy = ring[i].y - y pbf.writeVarint(zigzag(dx)) pbf.writeVarint(zigzag(dy)) x += dx y += dy } } } function writeValue (value, pbf) { var type = typeof value if (type === 'string') { pbf.writeStringField(1, value) } else if (type === 'boolean') { pbf.writeBooleanField(7, value) } else if (type === 'number') { if (value % 1 !== 0) { pbf.writeDoubleField(3, value) } else if (value < 0) { pbf.writeSVarintField(6, value) } else { pbf.writeVarintField(5, value) } } } },{"./lib/geojson_wrapper":40,"pbf":31}],40:[function(require,module,exports){ 'use strict' var Point = require('@mapbox/point-geometry') var VectorTileFeature = require('@mapbox/vector-tile').VectorTileFeature module.exports = GeoJSONWrapper // conform to vectortile api function GeoJSONWrapper (features) { this.features = features this.length = features.length } GeoJSONWrapper.prototype.feature = function (i) { return new FeatureWrapper(this.features[i]) } function FeatureWrapper (feature) { this.id = typeof feature.id === 'number' ? feature.id : undefined this.type = feature.type this.rawGeometry = feature.type === 1 ? [feature.geometry] : feature.geometry this.properties = feature.tags this.extent = 4096 } FeatureWrapper.prototype.loadGeometry = function () { var rings = this.rawGeometry this.geometry = [] for (var i = 0; i < rings.length; i++) { var ring = rings[i] var newRing = [] for (var j = 0; j < ring.length; j++) { newRing.push(new Point(ring[j][0], ring[j][1])) } this.geometry.push(newRing) } return this.geometry } FeatureWrapper.prototype.bbox = function () { if (!this.geometry) this.loadGeometry() var rings = this.geometry var x1 = Infinity var x2 = -Infinity var y1 = Infinity var y2 = -Infinity for (var i = 0; i < rings.length; i++) { var ring = rings[i] for (var j = 0; j < ring.length; j++) { var coord = ring[j] x1 = Math.min(x1, coord.x) x2 = Math.max(x2, coord.x) y1 = Math.min(y1, coord.y) y2 = Math.max(y2, coord.y) } } return [x1, y1, x2, y2] } FeatureWrapper.prototype.toGeoJSON = VectorTileFeature.prototype.toGeoJSON },{"@mapbox/point-geometry":4,"@mapbox/vector-tile":8}],41:[function(require,module,exports){ var bundleFn = arguments[3]; var sources = arguments[4]; var cache = arguments[5]; var stringify = JSON.stringify; module.exports = function (fn, options) { var wkey; var cacheKeys = Object.keys(cache); for (var i = 0, l = cacheKeys.length; i < l; i++) { var key = cacheKeys[i]; var exp = cache[key].exports; // Using babel as a transpiler to use esmodule, the export will always // be an object with the default export as a property of it. To ensure // the existing api and babel esmodule exports are both supported we // check for both if (exp === fn || exp && exp.default === fn) { wkey = key; break; } } if (!wkey) { wkey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16); var wcache = {}; for (var i = 0, l = cacheKeys.length; i < l; i++) { var key = cacheKeys[i]; wcache[key] = key; } sources[wkey] = [ 'function(require,module,exports){' + fn + '(self); }', wcache ]; } var skey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16); var scache = {}; scache[wkey] = wkey; sources[skey] = [ 'function(require,module,exports){' + // try to call default if defined to also support babel esmodule exports 'var f = require(' + stringify(wkey) + ');' + '(f.default ? f.default : f)(self);' + '}', scache ]; var workerSources = {}; resolveSources(skey); function resolveSources(key) { workerSources[key] = true; for (var depPath in sources[key][1]) { var depKey = sources[key][1][depPath]; if (!workerSources[depKey]) { resolveSources(depKey); } } } var src = '(' + bundleFn + ')({' + Object.keys(workerSources).map(function (key) { return stringify(key) + ':[' + sources[key][0] + ',' + stringify(sources[key][1]) + ']' ; }).join(',') + '},{},[' + stringify(skey) + '])' ; var URL = window.URL || window.webkitURL || window.mozURL || window.msURL; var blob = new Blob([src], { type: 'text/javascript' }); if (options && options.bare) { return blob; } var workerUrl = URL.createObjectURL(blob); var worker = new Worker(workerUrl); worker.objectURL = workerUrl; return worker; }; },{}],42:[function(require,module,exports){ module.exports.RADIUS = 6378137; module.exports.FLATTENING = 1/298.257223563; module.exports.POLAR_RADIUS = 6356752.3142; },{}],43:[function(require,module,exports){ module.exports={ "version": "0.44.1" } },{}],44:[function(require,module,exports){ 'use strict';// This file is generated. Edit build/generate-struct-arrays.js, then run `yarn run codegen`. // var assert = require('assert'); var ref = require('../util/struct_array'); var StructArray = ref.StructArray; var ref$1 = require('../util/struct_array'); var Struct = ref$1.Struct; var ref$2 = require('../util/web_worker_transfer'); var register = ref$2.register; var Point = require('@mapbox/point-geometry'); /** * Implementation of the StructArray layout: * [0]: Int16[2] * * @private */ var StructArrayLayout2i4 = (function (StructArray) { function StructArrayLayout2i4 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2i4.__proto__ = StructArray; StructArrayLayout2i4.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2i4.prototype.constructor = StructArrayLayout2i4; StructArrayLayout2i4.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout2i4.prototype.emplaceBack = function emplaceBack (v0 , v1 ) { var i = this.length; this.resize(i + 1); var o2 = i * 2; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; return i; }; return StructArrayLayout2i4; }(StructArray)); StructArrayLayout2i4.prototype.bytesPerElement = 4; register('StructArrayLayout2i4', StructArrayLayout2i4); /** * Implementation of the StructArray layout: * [0]: Int16[4] * * @private */ var StructArrayLayout4i8 = (function (StructArray) { function StructArrayLayout4i8 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout4i8.__proto__ = StructArray; StructArrayLayout4i8.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout4i8.prototype.constructor = StructArrayLayout4i8; StructArrayLayout4i8.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout4i8.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 ) { var i = this.length; this.resize(i + 1); var o2 = i * 4; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; return i; }; return StructArrayLayout4i8; }(StructArray)); StructArrayLayout4i8.prototype.bytesPerElement = 8; register('StructArrayLayout4i8', StructArrayLayout4i8); /** * Implementation of the StructArray layout: * [0]: Int16[2] * [4]: Int16[4] * * @private */ var StructArrayLayout2i4i12 = (function (StructArray) { function StructArrayLayout2i4i12 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2i4i12.__proto__ = StructArray; StructArrayLayout2i4i12.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2i4i12.prototype.constructor = StructArrayLayout2i4i12; StructArrayLayout2i4i12.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout2i4i12.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 ) { var i = this.length; this.resize(i + 1); var o2 = i * 6; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.int16[o2 + 4] = v4; this.int16[o2 + 5] = v5; return i; }; return StructArrayLayout2i4i12; }(StructArray)); StructArrayLayout2i4i12.prototype.bytesPerElement = 12; register('StructArrayLayout2i4i12', StructArrayLayout2i4i12); /** * Implementation of the StructArray layout: * [0]: Int16[4] * [8]: Uint8[4] * * @private */ var StructArrayLayout4i4ub12 = (function (StructArray) { function StructArrayLayout4i4ub12 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout4i4ub12.__proto__ = StructArray; StructArrayLayout4i4ub12.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout4i4ub12.prototype.constructor = StructArrayLayout4i4ub12; StructArrayLayout4i4ub12.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout4i4ub12.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 ) { var i = this.length; this.resize(i + 1); var o2 = i * 6; var o1 = i * 12; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.uint8[o1 + 8] = v4; this.uint8[o1 + 9] = v5; this.uint8[o1 + 10] = v6; this.uint8[o1 + 11] = v7; return i; }; return StructArrayLayout4i4ub12; }(StructArray)); StructArrayLayout4i4ub12.prototype.bytesPerElement = 12; register('StructArrayLayout4i4ub12', StructArrayLayout4i4ub12); /** * Implementation of the StructArray layout: * [0]: Int16[4] * [8]: Uint16[4] * * @private */ var StructArrayLayout4i4ui16 = (function (StructArray) { function StructArrayLayout4i4ui16 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout4i4ui16.__proto__ = StructArray; StructArrayLayout4i4ui16.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout4i4ui16.prototype.constructor = StructArrayLayout4i4ui16; StructArrayLayout4i4ui16.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout4i4ui16.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 ) { var i = this.length; this.resize(i + 1); var o2 = i * 8; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.uint16[o2 + 4] = v4; this.uint16[o2 + 5] = v5; this.uint16[o2 + 6] = v6; this.uint16[o2 + 7] = v7; return i; }; return StructArrayLayout4i4ui16; }(StructArray)); StructArrayLayout4i4ui16.prototype.bytesPerElement = 16; register('StructArrayLayout4i4ui16', StructArrayLayout4i4ui16); /** * Implementation of the StructArray layout: * [0]: Float32[3] * * @private */ var StructArrayLayout3f12 = (function (StructArray) { function StructArrayLayout3f12 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout3f12.__proto__ = StructArray; StructArrayLayout3f12.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout3f12.prototype.constructor = StructArrayLayout3f12; StructArrayLayout3f12.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout3f12.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 ) { var i = this.length; this.resize(i + 1); var o4 = i * 3; this.float32[o4 + 0] = v0; this.float32[o4 + 1] = v1; this.float32[o4 + 2] = v2; return i; }; return StructArrayLayout3f12; }(StructArray)); StructArrayLayout3f12.prototype.bytesPerElement = 12; register('StructArrayLayout3f12', StructArrayLayout3f12); /** * Implementation of the StructArray layout: * [0]: Uint32[1] * * @private */ var StructArrayLayout1ul4 = (function (StructArray) { function StructArrayLayout1ul4 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout1ul4.__proto__ = StructArray; StructArrayLayout1ul4.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout1ul4.prototype.constructor = StructArrayLayout1ul4; StructArrayLayout1ul4.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint32 = new Uint32Array(this.arrayBuffer); }; StructArrayLayout1ul4.prototype.emplaceBack = function emplaceBack (v0 ) { var i = this.length; this.resize(i + 1); var o4 = i * 1; this.uint32[o4 + 0] = v0; return i; }; return StructArrayLayout1ul4; }(StructArray)); StructArrayLayout1ul4.prototype.bytesPerElement = 4; register('StructArrayLayout1ul4', StructArrayLayout1ul4); /** * Implementation of the StructArray layout: * [0]: Int16[6] * [12]: Uint32[1] * [16]: Uint16[2] * [20]: Int16[2] * * @private */ var StructArrayLayout6i1ul2ui2i24 = (function (StructArray) { function StructArrayLayout6i1ul2ui2i24 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout6i1ul2ui2i24.__proto__ = StructArray; StructArrayLayout6i1ul2ui2i24.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout6i1ul2ui2i24.prototype.constructor = StructArrayLayout6i1ul2ui2i24; StructArrayLayout6i1ul2ui2i24.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); this.uint32 = new Uint32Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout6i1ul2ui2i24.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 ) { var i = this.length; this.resize(i + 1); var o2 = i * 12; var o4 = i * 6; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.int16[o2 + 4] = v4; this.int16[o2 + 5] = v5; this.uint32[o4 + 3] = v6; this.uint16[o2 + 8] = v7; this.uint16[o2 + 9] = v8; this.int16[o2 + 10] = v9; this.int16[o2 + 11] = v10; return i; }; return StructArrayLayout6i1ul2ui2i24; }(StructArray)); StructArrayLayout6i1ul2ui2i24.prototype.bytesPerElement = 24; register('StructArrayLayout6i1ul2ui2i24', StructArrayLayout6i1ul2ui2i24); /** * Implementation of the StructArray layout: * [0]: Int16[2] * [4]: Int16[2] * [8]: Int16[2] * * @private */ var StructArrayLayout2i2i2i12 = (function (StructArray) { function StructArrayLayout2i2i2i12 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2i2i2i12.__proto__ = StructArray; StructArrayLayout2i2i2i12.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2i2i2i12.prototype.constructor = StructArrayLayout2i2i2i12; StructArrayLayout2i2i2i12.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout2i2i2i12.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 ) { var i = this.length; this.resize(i + 1); var o2 = i * 6; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.int16[o2 + 4] = v4; this.int16[o2 + 5] = v5; return i; }; return StructArrayLayout2i2i2i12; }(StructArray)); StructArrayLayout2i2i2i12.prototype.bytesPerElement = 12; register('StructArrayLayout2i2i2i12', StructArrayLayout2i2i2i12); /** * Implementation of the StructArray layout: * [0]: Uint8[2] * * @private */ var StructArrayLayout2ub4 = (function (StructArray) { function StructArrayLayout2ub4 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2ub4.__proto__ = StructArray; StructArrayLayout2ub4.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2ub4.prototype.constructor = StructArrayLayout2ub4; StructArrayLayout2ub4.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); }; StructArrayLayout2ub4.prototype.emplaceBack = function emplaceBack (v0 , v1 ) { var i = this.length; this.resize(i + 1); var o1 = i * 4; this.uint8[o1 + 0] = v0; this.uint8[o1 + 1] = v1; return i; }; return StructArrayLayout2ub4; }(StructArray)); StructArrayLayout2ub4.prototype.bytesPerElement = 4; register('StructArrayLayout2ub4', StructArrayLayout2ub4); /** * Implementation of the StructArray layout: * [0]: Int16[2] * [4]: Uint16[2] * [8]: Uint32[3] * [20]: Uint16[3] * [28]: Float32[2] * [36]: Uint8[2] * * @private */ var StructArrayLayout2i2ui3ul3ui2f2ub40 = (function (StructArray) { function StructArrayLayout2i2ui3ul3ui2f2ub40 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2i2ui3ul3ui2f2ub40.__proto__ = StructArray; StructArrayLayout2i2ui3ul3ui2f2ub40.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2i2ui3ul3ui2f2ub40.prototype.constructor = StructArrayLayout2i2ui3ul3ui2f2ub40; StructArrayLayout2i2ui3ul3ui2f2ub40.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); this.uint32 = new Uint32Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout2i2ui3ul3ui2f2ub40.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 ) { var i = this.length; this.resize(i + 1); var o2 = i * 20; var o4 = i * 10; var o1 = i * 40; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.uint16[o2 + 2] = v2; this.uint16[o2 + 3] = v3; this.uint32[o4 + 2] = v4; this.uint32[o4 + 3] = v5; this.uint32[o4 + 4] = v6; this.uint16[o2 + 10] = v7; this.uint16[o2 + 11] = v8; this.uint16[o2 + 12] = v9; this.float32[o4 + 7] = v10; this.float32[o4 + 8] = v11; this.uint8[o1 + 36] = v12; this.uint8[o1 + 37] = v13; return i; }; return StructArrayLayout2i2ui3ul3ui2f2ub40; }(StructArray)); StructArrayLayout2i2ui3ul3ui2f2ub40.prototype.bytesPerElement = 40; register('StructArrayLayout2i2ui3ul3ui2f2ub40', StructArrayLayout2i2ui3ul3ui2f2ub40); /** * Implementation of the StructArray layout: * [0]: Float32[1] * * @private */ var StructArrayLayout1f4 = (function (StructArray) { function StructArrayLayout1f4 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout1f4.__proto__ = StructArray; StructArrayLayout1f4.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout1f4.prototype.constructor = StructArrayLayout1f4; StructArrayLayout1f4.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout1f4.prototype.emplaceBack = function emplaceBack (v0 ) { var i = this.length; this.resize(i + 1); var o4 = i * 1; this.float32[o4 + 0] = v0; return i; }; return StructArrayLayout1f4; }(StructArray)); StructArrayLayout1f4.prototype.bytesPerElement = 4; register('StructArrayLayout1f4', StructArrayLayout1f4); /** * Implementation of the StructArray layout: * [0]: Int16[3] * * @private */ var StructArrayLayout3i6 = (function (StructArray) { function StructArrayLayout3i6 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout3i6.__proto__ = StructArray; StructArrayLayout3i6.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout3i6.prototype.constructor = StructArrayLayout3i6; StructArrayLayout3i6.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout3i6.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 ) { var i = this.length; this.resize(i + 1); var o2 = i * 3; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; return i; }; return StructArrayLayout3i6; }(StructArray)); StructArrayLayout3i6.prototype.bytesPerElement = 6; register('StructArrayLayout3i6', StructArrayLayout3i6); /** * Implementation of the StructArray layout: * [0]: Uint32[1] * [4]: Uint16[2] * * @private */ var StructArrayLayout1ul2ui8 = (function (StructArray) { function StructArrayLayout1ul2ui8 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout1ul2ui8.__proto__ = StructArray; StructArrayLayout1ul2ui8.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout1ul2ui8.prototype.constructor = StructArrayLayout1ul2ui8; StructArrayLayout1ul2ui8.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint32 = new Uint32Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout1ul2ui8.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 ) { var i = this.length; this.resize(i + 1); var o4 = i * 2; var o2 = i * 4; this.uint32[o4 + 0] = v0; this.uint16[o2 + 2] = v1; this.uint16[o2 + 3] = v2; return i; }; return StructArrayLayout1ul2ui8; }(StructArray)); StructArrayLayout1ul2ui8.prototype.bytesPerElement = 8; register('StructArrayLayout1ul2ui8', StructArrayLayout1ul2ui8); /** * Implementation of the StructArray layout: * [0]: Uint16[3] * * @private */ var StructArrayLayout3ui6 = (function (StructArray) { function StructArrayLayout3ui6 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout3ui6.__proto__ = StructArray; StructArrayLayout3ui6.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout3ui6.prototype.constructor = StructArrayLayout3ui6; StructArrayLayout3ui6.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout3ui6.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 ) { var i = this.length; this.resize(i + 1); var o2 = i * 3; this.uint16[o2 + 0] = v0; this.uint16[o2 + 1] = v1; this.uint16[o2 + 2] = v2; return i; }; return StructArrayLayout3ui6; }(StructArray)); StructArrayLayout3ui6.prototype.bytesPerElement = 6; register('StructArrayLayout3ui6', StructArrayLayout3ui6); /** * Implementation of the StructArray layout: * [0]: Uint16[2] * * @private */ var StructArrayLayout2ui4 = (function (StructArray) { function StructArrayLayout2ui4 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2ui4.__proto__ = StructArray; StructArrayLayout2ui4.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2ui4.prototype.constructor = StructArrayLayout2ui4; StructArrayLayout2ui4.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout2ui4.prototype.emplaceBack = function emplaceBack (v0 , v1 ) { var i = this.length; this.resize(i + 1); var o2 = i * 2; this.uint16[o2 + 0] = v0; this.uint16[o2 + 1] = v1; return i; }; return StructArrayLayout2ui4; }(StructArray)); StructArrayLayout2ui4.prototype.bytesPerElement = 4; register('StructArrayLayout2ui4', StructArrayLayout2ui4); /** * Implementation of the StructArray layout: * [0]: Float32[2] * * @private */ var StructArrayLayout2f8 = (function (StructArray) { function StructArrayLayout2f8 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2f8.__proto__ = StructArray; StructArrayLayout2f8.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2f8.prototype.constructor = StructArrayLayout2f8; StructArrayLayout2f8.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout2f8.prototype.emplaceBack = function emplaceBack (v0 , v1 ) { var i = this.length; this.resize(i + 1); var o4 = i * 2; this.float32[o4 + 0] = v0; this.float32[o4 + 1] = v1; return i; }; return StructArrayLayout2f8; }(StructArray)); StructArrayLayout2f8.prototype.bytesPerElement = 8; register('StructArrayLayout2f8', StructArrayLayout2f8); /** * Implementation of the StructArray layout: * [0]: Float32[4] * * @private */ var StructArrayLayout4f16 = (function (StructArray) { function StructArrayLayout4f16 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout4f16.__proto__ = StructArray; StructArrayLayout4f16.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout4f16.prototype.constructor = StructArrayLayout4f16; StructArrayLayout4f16.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout4f16.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 ) { var i = this.length; this.resize(i + 1); var o4 = i * 4; this.float32[o4 + 0] = v0; this.float32[o4 + 1] = v1; this.float32[o4 + 2] = v2; this.float32[o4 + 3] = v3; return i; }; return StructArrayLayout4f16; }(StructArray)); StructArrayLayout4f16.prototype.bytesPerElement = 16; register('StructArrayLayout4f16', StructArrayLayout4f16); var CollisionBoxStruct = (function (Struct) { function CollisionBoxStruct () { Struct.apply(this, arguments); } if ( Struct ) CollisionBoxStruct.__proto__ = Struct; CollisionBoxStruct.prototype = Object.create( Struct && Struct.prototype ); CollisionBoxStruct.prototype.constructor = CollisionBoxStruct; var prototypeAccessors = { anchorPointX: {},anchorPointY: {},x1: {},y1: {},x2: {},y2: {},featureIndex: {},sourceLayerIndex: {},bucketIndex: {},radius: {},signedDistanceFromAnchor: {},anchorPoint: {} }; prototypeAccessors.anchorPointX.get = function () { return this._structArray.int16[this._pos2 + 0]; }; prototypeAccessors.anchorPointX.set = function (x) { this._structArray.int16[this._pos2 + 0] = x; }; prototypeAccessors.anchorPointY.get = function () { return this._structArray.int16[this._pos2 + 1]; }; prototypeAccessors.anchorPointY.set = function (x) { this._structArray.int16[this._pos2 + 1] = x; }; prototypeAccessors.x1.get = function () { return this._structArray.int16[this._pos2 + 2]; }; prototypeAccessors.x1.set = function (x) { this._structArray.int16[this._pos2 + 2] = x; }; prototypeAccessors.y1.get = function () { return this._structArray.int16[this._pos2 + 3]; }; prototypeAccessors.y1.set = function (x) { this._structArray.int16[this._pos2 + 3] = x; }; prototypeAccessors.x2.get = function () { return this._structArray.int16[this._pos2 + 4]; }; prototypeAccessors.x2.set = function (x) { this._structArray.int16[this._pos2 + 4] = x; }; prototypeAccessors.y2.get = function () { return this._structArray.int16[this._pos2 + 5]; }; prototypeAccessors.y2.set = function (x) { this._structArray.int16[this._pos2 + 5] = x; }; prototypeAccessors.featureIndex.get = function () { return this._structArray.uint32[this._pos4 + 3]; }; prototypeAccessors.featureIndex.set = function (x) { this._structArray.uint32[this._pos4 + 3] = x; }; prototypeAccessors.sourceLayerIndex.get = function () { return this._structArray.uint16[this._pos2 + 8]; }; prototypeAccessors.sourceLayerIndex.set = function (x) { this._structArray.uint16[this._pos2 + 8] = x; }; prototypeAccessors.bucketIndex.get = function () { return this._structArray.uint16[this._pos2 + 9]; }; prototypeAccessors.bucketIndex.set = function (x) { this._structArray.uint16[this._pos2 + 9] = x; }; prototypeAccessors.radius.get = function () { return this._structArray.int16[this._pos2 + 10]; }; prototypeAccessors.radius.set = function (x) { this._structArray.int16[this._pos2 + 10] = x; }; prototypeAccessors.signedDistanceFromAnchor.get = function () { return this._structArray.int16[this._pos2 + 11]; }; prototypeAccessors.signedDistanceFromAnchor.set = function (x) { this._structArray.int16[this._pos2 + 11] = x; }; prototypeAccessors.anchorPoint.get = function () { return new Point(this.anchorPointX, this.anchorPointY); }; Object.defineProperties( CollisionBoxStruct.prototype, prototypeAccessors ); return CollisionBoxStruct; }(Struct)); CollisionBoxStruct.prototype.size = 24; /** * @private */ var CollisionBoxArray = (function (StructArrayLayout6i1ul2ui2i24) { function CollisionBoxArray () { StructArrayLayout6i1ul2ui2i24.apply(this, arguments); } if ( StructArrayLayout6i1ul2ui2i24 ) CollisionBoxArray.__proto__ = StructArrayLayout6i1ul2ui2i24; CollisionBoxArray.prototype = Object.create( StructArrayLayout6i1ul2ui2i24 && StructArrayLayout6i1ul2ui2i24.prototype ); CollisionBoxArray.prototype.constructor = CollisionBoxArray; CollisionBoxArray.prototype.get = function get (index ) { assert(!this.isTransferred); return new CollisionBoxStruct(this, index); }; return CollisionBoxArray; }(StructArrayLayout6i1ul2ui2i24)); register('CollisionBoxArray', CollisionBoxArray); var PlacedSymbolStruct = (function (Struct) { function PlacedSymbolStruct () { Struct.apply(this, arguments); } if ( Struct ) PlacedSymbolStruct.__proto__ = Struct; PlacedSymbolStruct.prototype = Object.create( Struct && Struct.prototype ); PlacedSymbolStruct.prototype.constructor = PlacedSymbolStruct; var prototypeAccessors$1 = { anchorX: {},anchorY: {},glyphStartIndex: {},numGlyphs: {},vertexStartIndex: {},lineStartIndex: {},lineLength: {},segment: {},lowerSize: {},upperSize: {},lineOffsetX: {},lineOffsetY: {},writingMode: {},hidden: {} }; prototypeAccessors$1.anchorX.get = function () { return this._structArray.int16[this._pos2 + 0]; }; prototypeAccessors$1.anchorX.set = function (x) { this._structArray.int16[this._pos2 + 0] = x; }; prototypeAccessors$1.anchorY.get = function () { return this._structArray.int16[this._pos2 + 1]; }; prototypeAccessors$1.anchorY.set = function (x) { this._structArray.int16[this._pos2 + 1] = x; }; prototypeAccessors$1.glyphStartIndex.get = function () { return this._structArray.uint16[this._pos2 + 2]; }; prototypeAccessors$1.glyphStartIndex.set = function (x) { this._structArray.uint16[this._pos2 + 2] = x; }; prototypeAccessors$1.numGlyphs.get = function () { return this._structArray.uint16[this._pos2 + 3]; }; prototypeAccessors$1.numGlyphs.set = function (x) { this._structArray.uint16[this._pos2 + 3] = x; }; prototypeAccessors$1.vertexStartIndex.get = function () { return this._structArray.uint32[this._pos4 + 2]; }; prototypeAccessors$1.vertexStartIndex.set = function (x) { this._structArray.uint32[this._pos4 + 2] = x; }; prototypeAccessors$1.lineStartIndex.get = function () { return this._structArray.uint32[this._pos4 + 3]; }; prototypeAccessors$1.lineStartIndex.set = function (x) { this._structArray.uint32[this._pos4 + 3] = x; }; prototypeAccessors$1.lineLength.get = function () { return this._structArray.uint32[this._pos4 + 4]; }; prototypeAccessors$1.lineLength.set = function (x) { this._structArray.uint32[this._pos4 + 4] = x; }; prototypeAccessors$1.segment.get = function () { return this._structArray.uint16[this._pos2 + 10]; }; prototypeAccessors$1.segment.set = function (x) { this._structArray.uint16[this._pos2 + 10] = x; }; prototypeAccessors$1.lowerSize.get = function () { return this._structArray.uint16[this._pos2 + 11]; }; prototypeAccessors$1.lowerSize.set = function (x) { this._structArray.uint16[this._pos2 + 11] = x; }; prototypeAccessors$1.upperSize.get = function () { return this._structArray.uint16[this._pos2 + 12]; }; prototypeAccessors$1.upperSize.set = function (x) { this._structArray.uint16[this._pos2 + 12] = x; }; prototypeAccessors$1.lineOffsetX.get = function () { return this._structArray.float32[this._pos4 + 7]; }; prototypeAccessors$1.lineOffsetX.set = function (x) { this._structArray.float32[this._pos4 + 7] = x; }; prototypeAccessors$1.lineOffsetY.get = function () { return this._structArray.float32[this._pos4 + 8]; }; prototypeAccessors$1.lineOffsetY.set = function (x) { this._structArray.float32[this._pos4 + 8] = x; }; prototypeAccessors$1.writingMode.get = function () { return this._structArray.uint8[this._pos1 + 36]; }; prototypeAccessors$1.writingMode.set = function (x) { this._structArray.uint8[this._pos1 + 36] = x; }; prototypeAccessors$1.hidden.get = function () { return this._structArray.uint8[this._pos1 + 37]; }; prototypeAccessors$1.hidden.set = function (x) { this._structArray.uint8[this._pos1 + 37] = x; }; Object.defineProperties( PlacedSymbolStruct.prototype, prototypeAccessors$1 ); return PlacedSymbolStruct; }(Struct)); PlacedSymbolStruct.prototype.size = 40; /** * @private */ var PlacedSymbolArray = (function (StructArrayLayout2i2ui3ul3ui2f2ub40) { function PlacedSymbolArray () { StructArrayLayout2i2ui3ul3ui2f2ub40.apply(this, arguments); } if ( StructArrayLayout2i2ui3ul3ui2f2ub40 ) PlacedSymbolArray.__proto__ = StructArrayLayout2i2ui3ul3ui2f2ub40; PlacedSymbolArray.prototype = Object.create( StructArrayLayout2i2ui3ul3ui2f2ub40 && StructArrayLayout2i2ui3ul3ui2f2ub40.prototype ); PlacedSymbolArray.prototype.constructor = PlacedSymbolArray; PlacedSymbolArray.prototype.get = function get (index ) { assert(!this.isTransferred); return new PlacedSymbolStruct(this, index); }; return PlacedSymbolArray; }(StructArrayLayout2i2ui3ul3ui2f2ub40)); register('PlacedSymbolArray', PlacedSymbolArray); var GlyphOffsetStruct = (function (Struct) { function GlyphOffsetStruct () { Struct.apply(this, arguments); } if ( Struct ) GlyphOffsetStruct.__proto__ = Struct; GlyphOffsetStruct.prototype = Object.create( Struct && Struct.prototype ); GlyphOffsetStruct.prototype.constructor = GlyphOffsetStruct; var prototypeAccessors$2 = { offsetX: {} }; prototypeAccessors$2.offsetX.get = function () { return this._structArray.float32[this._pos4 + 0]; }; prototypeAccessors$2.offsetX.set = function (x) { this._structArray.float32[this._pos4 + 0] = x; }; Object.defineProperties( GlyphOffsetStruct.prototype, prototypeAccessors$2 ); return GlyphOffsetStruct; }(Struct)); GlyphOffsetStruct.prototype.size = 4; /** * @private */ var GlyphOffsetArray = (function (StructArrayLayout1f4) { function GlyphOffsetArray () { StructArrayLayout1f4.apply(this, arguments); } if ( StructArrayLayout1f4 ) GlyphOffsetArray.__proto__ = StructArrayLayout1f4; GlyphOffsetArray.prototype = Object.create( StructArrayLayout1f4 && StructArrayLayout1f4.prototype ); GlyphOffsetArray.prototype.constructor = GlyphOffsetArray; GlyphOffsetArray.prototype.getoffsetX = function getoffsetX (index ) { return this.float32[index * 1 + 0]; }; /** * Return the GlyphOffsetStruct at the given location in the array. * @param {number} index The index of the element. */ GlyphOffsetArray.prototype.get = function get (index ) { assert(!this.isTransferred); return new GlyphOffsetStruct(this, index); }; return GlyphOffsetArray; }(StructArrayLayout1f4)); register('GlyphOffsetArray', GlyphOffsetArray); var SymbolLineVertexStruct = (function (Struct) { function SymbolLineVertexStruct () { Struct.apply(this, arguments); } if ( Struct ) SymbolLineVertexStruct.__proto__ = Struct; SymbolLineVertexStruct.prototype = Object.create( Struct && Struct.prototype ); SymbolLineVertexStruct.prototype.constructor = SymbolLineVertexStruct; var prototypeAccessors$3 = { x: {},y: {},tileUnitDistanceFromAnchor: {} }; prototypeAccessors$3.x.get = function () { return this._structArray.int16[this._pos2 + 0]; }; prototypeAccessors$3.x.set = function (x) { this._structArray.int16[this._pos2 + 0] = x; }; prototypeAccessors$3.y.get = function () { return this._structArray.int16[this._pos2 + 1]; }; prototypeAccessors$3.y.set = function (x) { this._structArray.int16[this._pos2 + 1] = x; }; prototypeAccessors$3.tileUnitDistanceFromAnchor.get = function () { return this._structArray.int16[this._pos2 + 2]; }; prototypeAccessors$3.tileUnitDistanceFromAnchor.set = function (x) { this._structArray.int16[this._pos2 + 2] = x; }; Object.defineProperties( SymbolLineVertexStruct.prototype, prototypeAccessors$3 ); return SymbolLineVertexStruct; }(Struct)); SymbolLineVertexStruct.prototype.size = 6; /** * @private */ var SymbolLineVertexArray = (function (StructArrayLayout3i6) { function SymbolLineVertexArray () { StructArrayLayout3i6.apply(this, arguments); } if ( StructArrayLayout3i6 ) SymbolLineVertexArray.__proto__ = StructArrayLayout3i6; SymbolLineVertexArray.prototype = Object.create( StructArrayLayout3i6 && StructArrayLayout3i6.prototype ); SymbolLineVertexArray.prototype.constructor = SymbolLineVertexArray; SymbolLineVertexArray.prototype.getx = function getx (index ) { return this.int16[index * 3 + 0]; }; SymbolLineVertexArray.prototype.gety = function gety (index ) { return this.int16[index * 3 + 1]; }; SymbolLineVertexArray.prototype.gettileUnitDistanceFromAnchor = function gettileUnitDistanceFromAnchor (index ) { return this.int16[index * 3 + 2]; }; /** * Return the SymbolLineVertexStruct at the given location in the array. * @param {number} index The index of the element. */ SymbolLineVertexArray.prototype.get = function get (index ) { assert(!this.isTransferred); return new SymbolLineVertexStruct(this, index); }; return SymbolLineVertexArray; }(StructArrayLayout3i6)); register('SymbolLineVertexArray', SymbolLineVertexArray); var FeatureIndexStruct = (function (Struct) { function FeatureIndexStruct () { Struct.apply(this, arguments); } if ( Struct ) FeatureIndexStruct.__proto__ = Struct; FeatureIndexStruct.prototype = Object.create( Struct && Struct.prototype ); FeatureIndexStruct.prototype.constructor = FeatureIndexStruct; var prototypeAccessors$4 = { featureIndex: {},sourceLayerIndex: {},bucketIndex: {} }; prototypeAccessors$4.featureIndex.get = function () { return this._structArray.uint32[this._pos4 + 0]; }; prototypeAccessors$4.featureIndex.set = function (x) { this._structArray.uint32[this._pos4 + 0] = x; }; prototypeAccessors$4.sourceLayerIndex.get = function () { return this._structArray.uint16[this._pos2 + 2]; }; prototypeAccessors$4.sourceLayerIndex.set = function (x) { this._structArray.uint16[this._pos2 + 2] = x; }; prototypeAccessors$4.bucketIndex.get = function () { return this._structArray.uint16[this._pos2 + 3]; }; prototypeAccessors$4.bucketIndex.set = function (x) { this._structArray.uint16[this._pos2 + 3] = x; }; Object.defineProperties( FeatureIndexStruct.prototype, prototypeAccessors$4 ); return FeatureIndexStruct; }(Struct)); FeatureIndexStruct.prototype.size = 8; /** * @private */ var FeatureIndexArray = (function (StructArrayLayout1ul2ui8) { function FeatureIndexArray () { StructArrayLayout1ul2ui8.apply(this, arguments); } if ( StructArrayLayout1ul2ui8 ) FeatureIndexArray.__proto__ = StructArrayLayout1ul2ui8; FeatureIndexArray.prototype = Object.create( StructArrayLayout1ul2ui8 && StructArrayLayout1ul2ui8.prototype ); FeatureIndexArray.prototype.constructor = FeatureIndexArray; FeatureIndexArray.prototype.get = function get (index ) { assert(!this.isTransferred); return new FeatureIndexStruct(this, index); }; return FeatureIndexArray; }(StructArrayLayout1ul2ui8)); register('FeatureIndexArray', FeatureIndexArray); module.exports = { StructArrayLayout2i4: StructArrayLayout2i4, StructArrayLayout4i8: StructArrayLayout4i8, StructArrayLayout2i4i12: StructArrayLayout2i4i12, StructArrayLayout4i4ub12: StructArrayLayout4i4ub12, StructArrayLayout4i4ui16: StructArrayLayout4i4ui16, StructArrayLayout3f12: StructArrayLayout3f12, StructArrayLayout1ul4: StructArrayLayout1ul4, StructArrayLayout6i1ul2ui2i24: StructArrayLayout6i1ul2ui2i24, StructArrayLayout2i2i2i12: StructArrayLayout2i2i2i12, StructArrayLayout2ub4: StructArrayLayout2ub4, StructArrayLayout2i2ui3ul3ui2f2ub40: StructArrayLayout2i2ui3ul3ui2f2ub40, StructArrayLayout1f4: StructArrayLayout1f4, StructArrayLayout3i6: StructArrayLayout3i6, StructArrayLayout1ul2ui8: StructArrayLayout1ul2ui8, StructArrayLayout3ui6: StructArrayLayout3ui6, StructArrayLayout2ui4: StructArrayLayout2ui4, StructArrayLayout2f8: StructArrayLayout2f8, StructArrayLayout4f16: StructArrayLayout4f16, PosArray: StructArrayLayout2i4, RasterBoundsArray: StructArrayLayout4i8, CircleLayoutArray: StructArrayLayout2i4, FillLayoutArray: StructArrayLayout2i4, FillExtrusionLayoutArray: StructArrayLayout2i4i12, HeatmapLayoutArray: StructArrayLayout2i4, LineLayoutArray: StructArrayLayout4i4ub12, SymbolLayoutArray: StructArrayLayout4i4ui16, SymbolDynamicLayoutArray: StructArrayLayout3f12, SymbolOpacityArray: StructArrayLayout1ul4, CollisionBoxLayoutArray: StructArrayLayout2i2i2i12, CollisionCircleLayoutArray: StructArrayLayout2i2i2i12, CollisionVertexArray: StructArrayLayout2ub4, TriangleIndexArray: StructArrayLayout3ui6, LineIndexArray: StructArrayLayout2ui4, CollisionBoxArray: CollisionBoxArray, PlacedSymbolArray: PlacedSymbolArray, GlyphOffsetArray: GlyphOffsetArray, SymbolLineVertexArray: SymbolLineVertexArray, FeatureIndexArray: FeatureIndexArray }; },{"../util/struct_array":276,"../util/web_worker_transfer":283,"@mapbox/point-geometry":4,"assert":13}],45:[function(require,module,exports){ 'use strict';// /** * The `Bucket` interface is the single point of knowledge about turning vector * tiles into WebGL buffers. * * `Bucket` is an abstract interface. An implementation exists for each style layer type. * Create a bucket via the `StyleLayer#createBucket` method. * * The concrete bucket types, using layout options from the style layer, * transform feature geometries into vertex and index data for use by the * vertex shader. They also (via `ProgramConfiguration`) use feature * properties and the zoom level to populate the attributes needed for * data-driven styling. * * Buckets are designed to be built on a worker thread and then serialized and * transferred back to the main thread for rendering. On the worker side, a * bucket's vertex, index, and attribute data is stored in `bucket.arrays: * ArrayGroup`. When a bucket's data is serialized and sent back to the main * thread, is gets deserialized (using `new Bucket(serializedBucketData)`, with * the array data now stored in `bucket.buffers: BufferGroup`. BufferGroups * hold the same data as ArrayGroups, but are tuned for consumption by WebGL. * * @private */ module.exports = { deserialize: function deserialize(input , style ) { var output = {}; // Guard against the case where the map's style has been set to null while // this bucket has been parsing. if (!style) { return output; } for (var i = 0, list = input; i < list.length; i += 1) { var bucket = list[i]; var layers = bucket.layerIds .map(function (id) { return style.getLayer(id); }) .filter(Boolean); if (layers.length === 0) { continue; } // look up StyleLayer objects from layer ids (since we don't // want to waste time serializing/copying them from the worker) (bucket ).layers = layers; for (var i$1 = 0, list$1 = layers; i$1 < list$1.length; i$1 += 1) { var layer = list$1[i$1]; output[layer.id] = bucket; } } return output; } }; },{}],46:[function(require,module,exports){ 'use strict';// var ref = require('../../util/struct_array'); var createLayout = ref.createLayout; module.exports = createLayout([ {name: 'a_pos', components: 2, type: 'Int16'} ], 4); },{"../../util/struct_array":276}],47:[function(require,module,exports){ 'use strict';// var ref = require('../array_types'); var CircleLayoutArray = ref.CircleLayoutArray; var layoutAttributes = require('./circle_attributes').members; var ref$1 = require('../segment'); var SegmentVector = ref$1.SegmentVector; var ref$2 = require('../program_configuration'); var ProgramConfigurationSet = ref$2.ProgramConfigurationSet; var ref$3 = require('../index_array_type'); var TriangleIndexArray = ref$3.TriangleIndexArray; var loadGeometry = require('../load_geometry'); var EXTENT = require('../extent'); var ref$4 = require('../../util/web_worker_transfer'); var register = ref$4.register; function addCircleVertex(layoutVertexArray, x, y, extrudeX, extrudeY) { layoutVertexArray.emplaceBack( (x * 2) + ((extrudeX + 1) / 2), (y * 2) + ((extrudeY + 1) / 2)); } /** * Circles are represented by two triangles. * * Each corner has a pos that is the center of the circle and an extrusion * vector that is where it points. * @private */ var CircleBucket = function CircleBucket(options ) { this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.layoutVertexArray = new CircleLayoutArray(); this.indexArray = new TriangleIndexArray(); this.segments = new SegmentVector(); this.programConfigurations = new ProgramConfigurationSet(layoutAttributes, options.layers, options.zoom); }; CircleBucket.prototype.populate = function populate (features , options ) { var this$1 = this; for (var i = 0, list = features; i < list.length; i += 1) { var ref = list[i]; var feature = ref.feature; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; if (this$1.layers[0]._featureFilter({zoom: this$1.zoom}, feature)) { var geometry = loadGeometry(feature); this$1.addFeature(feature, geometry); options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this$1.index); } } }; CircleBucket.prototype.isEmpty = function isEmpty () { return this.layoutVertexArray.length === 0; }; CircleBucket.prototype.upload = function upload (context ) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, layoutAttributes); this.indexBuffer = context.createIndexBuffer(this.indexArray); this.programConfigurations.upload(context); }; CircleBucket.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); }; CircleBucket.prototype.addFeature = function addFeature (feature , geometry ) { var this$1 = this; for (var i = 0, list = geometry; i < list.length; i += 1) { var ring = list[i]; for (var i$1 = 0, list$1 = ring; i$1 < list$1.length; i$1 += 1) { var point = list$1[i$1]; var x = point.x; var y = point.y; // Do not include points that are outside the tile boundaries. if (x < 0 || x >= EXTENT || y < 0 || y >= EXTENT) { continue; } // this geometry will be of the Point type, and we'll derive // two triangles from it. // // ┌─────────┐ // │ 3 2 │ // │ │ // │ 0 1 │ // └─────────┘ var segment = this$1.segments.prepareSegment(4, this$1.layoutVertexArray, this$1.indexArray); var index = segment.vertexLength; addCircleVertex(this$1.layoutVertexArray, x, y, -1, -1); addCircleVertex(this$1.layoutVertexArray, x, y, 1, -1); addCircleVertex(this$1.layoutVertexArray, x, y, 1, 1); addCircleVertex(this$1.layoutVertexArray, x, y, -1, 1); this$1.indexArray.emplaceBack(index, index + 1, index + 2); this$1.indexArray.emplaceBack(index, index + 3, index + 2); segment.vertexLength += 4; segment.primitiveLength += 2; } } this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature); }; register('CircleBucket', CircleBucket, {omit: ['layers']}); module.exports = CircleBucket; },{"../../util/web_worker_transfer":283,"../array_types":44,"../extent":58,"../index_array_type":60,"../load_geometry":61,"../program_configuration":63,"../segment":65,"./circle_attributes":46}],48:[function(require,module,exports){ 'use strict';// var ref = require('../../util/struct_array'); var createLayout = ref.createLayout; module.exports = createLayout([ {name: 'a_pos', components: 2, type: 'Int16'} ], 4); },{"../../util/struct_array":276}],49:[function(require,module,exports){ 'use strict';// var ref = require('../array_types'); var FillLayoutArray = ref.FillLayoutArray; var layoutAttributes = require('./fill_attributes').members; var ref$1 = require('../segment'); var SegmentVector = ref$1.SegmentVector; var ref$2 = require('../program_configuration'); var ProgramConfigurationSet = ref$2.ProgramConfigurationSet; var ref$3 = require('../index_array_type'); var LineIndexArray = ref$3.LineIndexArray; var TriangleIndexArray = ref$3.TriangleIndexArray; var loadGeometry = require('../load_geometry'); var earcut = require('earcut'); var classifyRings = require('../../util/classify_rings'); var assert = require('assert'); var EARCUT_MAX_RINGS = 500; var ref$4 = require('../../util/web_worker_transfer'); var register = ref$4.register; var FillBucket = function FillBucket(options ) { this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.layoutVertexArray = new FillLayoutArray(); this.indexArray = new TriangleIndexArray(); this.indexArray2 = new LineIndexArray(); this.programConfigurations = new ProgramConfigurationSet(layoutAttributes, options.layers, options.zoom); this.segments = new SegmentVector(); this.segments2 = new SegmentVector(); }; FillBucket.prototype.populate = function populate (features , options ) { var this$1 = this; for (var i = 0, list = features; i < list.length; i += 1) { var ref = list[i]; var feature = ref.feature; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; if (this$1.layers[0]._featureFilter({zoom: this$1.zoom}, feature)) { var geometry = loadGeometry(feature); this$1.addFeature(feature, geometry); options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this$1.index); } } }; FillBucket.prototype.isEmpty = function isEmpty () { return this.layoutVertexArray.length === 0; }; FillBucket.prototype.upload = function upload (context ) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, layoutAttributes); this.indexBuffer = context.createIndexBuffer(this.indexArray); this.indexBuffer2 = context.createIndexBuffer(this.indexArray2); this.programConfigurations.upload(context); }; FillBucket.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.indexBuffer2.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); this.segments2.destroy(); }; FillBucket.prototype.addFeature = function addFeature (feature , geometry ) { var this$1 = this; for (var i$2 = 0, list = classifyRings(geometry, EARCUT_MAX_RINGS); i$2 < list.length; i$2 += 1) { var polygon = list[i$2]; var numVertices = 0; for (var i$3 = 0, list$1 = polygon; i$3 < list$1.length; i$3 += 1) { var ring = list$1[i$3]; numVertices += ring.length; } var triangleSegment = this$1.segments.prepareSegment(numVertices, this$1.layoutVertexArray, this$1.indexArray); var triangleIndex = triangleSegment.vertexLength; var flattened = []; var holeIndices = []; for (var i$4 = 0, list$2 = polygon; i$4 < list$2.length; i$4 += 1) { var ring$1 = list$2[i$4]; if (ring$1.length === 0) { continue; } if (ring$1 !== polygon[0]) { holeIndices.push(flattened.length / 2); } var lineSegment = this$1.segments2.prepareSegment(ring$1.length, this$1.layoutVertexArray, this$1.indexArray2); var lineIndex = lineSegment.vertexLength; this$1.layoutVertexArray.emplaceBack(ring$1[0].x, ring$1[0].y); this$1.indexArray2.emplaceBack(lineIndex + ring$1.length - 1, lineIndex); flattened.push(ring$1[0].x); flattened.push(ring$1[0].y); for (var i = 1; i < ring$1.length; i++) { this$1.layoutVertexArray.emplaceBack(ring$1[i].x, ring$1[i].y); this$1.indexArray2.emplaceBack(lineIndex + i - 1, lineIndex + i); flattened.push(ring$1[i].x); flattened.push(ring$1[i].y); } lineSegment.vertexLength += ring$1.length; lineSegment.primitiveLength += ring$1.length; } var indices = earcut(flattened, holeIndices); assert(indices.length % 3 === 0); for (var i$1 = 0; i$1 < indices.length; i$1 += 3) { this$1.indexArray.emplaceBack( triangleIndex + indices[i$1], triangleIndex + indices[i$1 + 1], triangleIndex + indices[i$1 + 2]); } triangleSegment.vertexLength += numVertices; triangleSegment.primitiveLength += indices.length / 3; } this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature); }; register('FillBucket', FillBucket, {omit: ['layers']}); module.exports = FillBucket; },{"../../util/classify_rings":260,"../../util/web_worker_transfer":283,"../array_types":44,"../index_array_type":60,"../load_geometry":61,"../program_configuration":63,"../segment":65,"./fill_attributes":48,"assert":13,"earcut":15}],50:[function(require,module,exports){ 'use strict';// var ref = require('../../util/struct_array'); var createLayout = ref.createLayout; module.exports = createLayout([ {name: 'a_pos', components: 2, type: 'Int16'}, {name: 'a_normal_ed', components: 4, type: 'Int16'} ], 4); },{"../../util/struct_array":276}],51:[function(require,module,exports){ 'use strict';// var ref = require('../array_types'); var FillExtrusionLayoutArray = ref.FillExtrusionLayoutArray; var layoutAttributes = require('./fill_extrusion_attributes').members; var ref$1 = require('../segment'); var SegmentVector = ref$1.SegmentVector; var MAX_VERTEX_ARRAY_LENGTH = ref$1.MAX_VERTEX_ARRAY_LENGTH; var ref$2 = require('../program_configuration'); var ProgramConfigurationSet = ref$2.ProgramConfigurationSet; var ref$3 = require('../index_array_type'); var TriangleIndexArray = ref$3.TriangleIndexArray; var loadGeometry = require('../load_geometry'); var EXTENT = require('../extent'); var earcut = require('earcut'); var classifyRings = require('../../util/classify_rings'); var assert = require('assert'); var EARCUT_MAX_RINGS = 500; var ref$4 = require('../../util/web_worker_transfer'); var register = ref$4.register; var FACTOR = Math.pow(2, 13); function addVertex(vertexArray, x, y, nx, ny, nz, t, e) { vertexArray.emplaceBack( // a_pos x, y, // a_normal_ed: 3-component normal and 1-component edgedistance Math.floor(nx * FACTOR) * 2 + t, ny * FACTOR * 2, nz * FACTOR * 2, // edgedistance (used for wrapping patterns around extrusion sides) Math.round(e) ); } var FillExtrusionBucket = function FillExtrusionBucket(options ) { this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.layoutVertexArray = new FillExtrusionLayoutArray(); this.indexArray = new TriangleIndexArray(); this.programConfigurations = new ProgramConfigurationSet(layoutAttributes, options.layers, options.zoom); this.segments = new SegmentVector(); }; FillExtrusionBucket.prototype.populate = function populate (features , options ) { var this$1 = this; for (var i = 0, list = features; i < list.length; i += 1) { var ref = list[i]; var feature = ref.feature; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; if (this$1.layers[0]._featureFilter({zoom: this$1.zoom}, feature)) { var geometry = loadGeometry(feature); this$1.addFeature(feature, geometry); options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this$1.index); } } }; FillExtrusionBucket.prototype.isEmpty = function isEmpty () { return this.layoutVertexArray.length === 0; }; FillExtrusionBucket.prototype.upload = function upload (context ) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, layoutAttributes); this.indexBuffer = context.createIndexBuffer(this.indexArray); this.programConfigurations.upload(context); }; FillExtrusionBucket.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); }; FillExtrusionBucket.prototype.addFeature = function addFeature (feature , geometry ) { var this$1 = this; for (var i$1 = 0, list = classifyRings(geometry, EARCUT_MAX_RINGS); i$1 < list.length; i$1 += 1) { var polygon = list[i$1]; var numVertices = 0; for (var i$2 = 0, list$1 = polygon; i$2 < list$1.length; i$2 += 1) { var ring = list$1[i$2]; numVertices += ring.length; } var segment = this$1.segments.prepareSegment(4, this$1.layoutVertexArray, this$1.indexArray); for (var i$3 = 0, list$2 = polygon; i$3 < list$2.length; i$3 += 1) { var ring$1 = list$2[i$3]; if (ring$1.length === 0) { continue; } if (isEntirelyOutside(ring$1)) { continue; } var edgeDistance = 0; for (var p = 0; p < ring$1.length; p++) { var p1 = ring$1[p]; if (p >= 1) { var p2 = ring$1[p - 1]; if (!isBoundaryEdge(p1, p2)) { if (segment.vertexLength + 4 > MAX_VERTEX_ARRAY_LENGTH) { segment = this$1.segments.prepareSegment(4, this$1.layoutVertexArray, this$1.indexArray); } var perp = p1.sub(p2)._perp()._unit(); var dist = p2.dist(p1); if (edgeDistance + dist > 32768) { edgeDistance = 0; } addVertex(this$1.layoutVertexArray, p1.x, p1.y, perp.x, perp.y, 0, 0, edgeDistance); addVertex(this$1.layoutVertexArray, p1.x, p1.y, perp.x, perp.y, 0, 1, edgeDistance); edgeDistance += dist; addVertex(this$1.layoutVertexArray, p2.x, p2.y, perp.x, perp.y, 0, 0, edgeDistance); addVertex(this$1.layoutVertexArray, p2.x, p2.y, perp.x, perp.y, 0, 1, edgeDistance); var bottomRight = segment.vertexLength; this$1.indexArray.emplaceBack(bottomRight, bottomRight + 1, bottomRight + 2); this$1.indexArray.emplaceBack(bottomRight + 1, bottomRight + 2, bottomRight + 3); segment.vertexLength += 4; segment.primitiveLength += 2; } } } } if (segment.vertexLength + numVertices > MAX_VERTEX_ARRAY_LENGTH) { segment = this$1.segments.prepareSegment(numVertices, this$1.layoutVertexArray, this$1.indexArray); } var flattened = []; var holeIndices = []; var triangleIndex = segment.vertexLength; for (var i$4 = 0, list$3 = polygon; i$4 < list$3.length; i$4 += 1) { var ring$2 = list$3[i$4]; if (ring$2.length === 0) { continue; } if (ring$2 !== polygon[0]) { holeIndices.push(flattened.length / 2); } for (var i = 0; i < ring$2.length; i++) { var p$1 = ring$2[i]; addVertex(this$1.layoutVertexArray, p$1.x, p$1.y, 0, 0, 1, 1, 0); flattened.push(p$1.x); flattened.push(p$1.y); } } var indices = earcut(flattened, holeIndices); assert(indices.length % 3 === 0); for (var j = 0; j < indices.length; j += 3) { this$1.indexArray.emplaceBack( triangleIndex + indices[j], triangleIndex + indices[j + 1], triangleIndex + indices[j + 2]); } segment.primitiveLength += indices.length / 3; segment.vertexLength += numVertices; } this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature); }; register('FillExtrusionBucket', FillExtrusionBucket, {omit: ['layers']}); module.exports = FillExtrusionBucket; function isBoundaryEdge(p1, p2) { return (p1.x === p2.x && (p1.x < 0 || p1.x > EXTENT)) || (p1.y === p2.y && (p1.y < 0 || p1.y > EXTENT)); } function isEntirelyOutside(ring) { return ring.every(function (p) { return p.x < 0; }) || ring.every(function (p) { return p.x > EXTENT; }) || ring.every(function (p) { return p.y < 0; }) || ring.every(function (p) { return p.y > EXTENT; }); } },{"../../util/classify_rings":260,"../../util/web_worker_transfer":283,"../array_types":44,"../extent":58,"../index_array_type":60,"../load_geometry":61,"../program_configuration":63,"../segment":65,"./fill_extrusion_attributes":50,"assert":13,"earcut":15}],52:[function(require,module,exports){ 'use strict';// var CircleBucket = require('./circle_bucket'); var ref = require('../../util/web_worker_transfer'); var register = ref.register; var HeatmapBucket = (function (CircleBucket) { function HeatmapBucket () { CircleBucket.apply(this, arguments); }if ( CircleBucket ) HeatmapBucket.__proto__ = CircleBucket; HeatmapBucket.prototype = Object.create( CircleBucket && CircleBucket.prototype ); HeatmapBucket.prototype.constructor = HeatmapBucket; return HeatmapBucket; }(CircleBucket)); register('HeatmapBucket', HeatmapBucket, {omit: ['layers']}); module.exports = HeatmapBucket; },{"../../util/web_worker_transfer":283,"./circle_bucket":47}],53:[function(require,module,exports){ 'use strict';// var ref = require('../../util/struct_array'); var createLayout = ref.createLayout; module.exports = createLayout([ {name: 'a_pos_normal', components: 4, type: 'Int16'}, {name: 'a_data', components: 4, type: 'Uint8'} ], 4); },{"../../util/struct_array":276}],54:[function(require,module,exports){ 'use strict';// var ref = require('../array_types'); var LineLayoutArray = ref.LineLayoutArray; var layoutAttributes = require('./line_attributes').members; var ref$1 = require('../segment'); var SegmentVector = ref$1.SegmentVector; var ref$2 = require('../program_configuration'); var ProgramConfigurationSet = ref$2.ProgramConfigurationSet; var ref$3 = require('../index_array_type'); var TriangleIndexArray = ref$3.TriangleIndexArray; var loadGeometry = require('../load_geometry'); var EXTENT = require('../extent'); var vectorTileFeatureTypes = require('@mapbox/vector-tile').VectorTileFeature.types; var ref$4 = require('../../util/web_worker_transfer'); var register = ref$4.register; // NOTE ON EXTRUDE SCALE: // scale the extrusion vector so that the normal length is this value. // contains the "texture" normals (-1..1). this is distinct from the extrude // normals for line joins, because the x-value remains 0 for the texture // normal array, while the extrude normal actually moves the vertex to create // the acute/bevelled line join. var EXTRUDE_SCALE = 63; /* * Sharp corners cause dashed lines to tilt because the distance along the line * is the same at both the inner and outer corners. To improve the appearance of * dashed lines we add extra points near sharp corners so that a smaller part * of the line is tilted. * * COS_HALF_SHARP_CORNER controls how sharp a corner has to be for us to add an * extra vertex. The default is 75 degrees. * * The newly created vertices are placed SHARP_CORNER_OFFSET pixels from the corner. */ var COS_HALF_SHARP_CORNER = Math.cos(75 / 2 * (Math.PI / 180)); var SHARP_CORNER_OFFSET = 15; // The number of bits that is used to store the line distance in the buffer. var LINE_DISTANCE_BUFFER_BITS = 15; // We don't have enough bits for the line distance as we'd like to have, so // use this value to scale the line distance (in tile units) down to a smaller // value. This lets us store longer distances while sacrificing precision. var LINE_DISTANCE_SCALE = 1 / 2; // The maximum line distance, in tile units, that fits in the buffer. var MAX_LINE_DISTANCE = Math.pow(2, LINE_DISTANCE_BUFFER_BITS - 1) / LINE_DISTANCE_SCALE; function addLineVertex(layoutVertexBuffer, point , extrude , round , up , dir , linesofar ) { layoutVertexBuffer.emplaceBack( // a_pos_normal point.x, point.y, round ? 1 : 0, up ? 1 : -1, // a_data // add 128 to store a byte in an unsigned byte Math.round(EXTRUDE_SCALE * extrude.x) + 128, Math.round(EXTRUDE_SCALE * extrude.y) + 128, // Encode the -1/0/1 direction value into the first two bits of .z of a_data. // Combine it with the lower 6 bits of `linesofar` (shifted by 2 bites to make // room for the direction value). The upper 8 bits of `linesofar` are placed in // the `w` component. `linesofar` is scaled down by `LINE_DISTANCE_SCALE` so that // we can store longer distances while sacrificing precision. ((dir === 0 ? 0 : (dir < 0 ? -1 : 1)) + 1) | (((linesofar * LINE_DISTANCE_SCALE) & 0x3F) << 2), (linesofar * LINE_DISTANCE_SCALE) >> 6); } /** * @private */ var LineBucket = function LineBucket(options ) { this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.layoutVertexArray = new LineLayoutArray(); this.indexArray = new TriangleIndexArray(); this.programConfigurations = new ProgramConfigurationSet(layoutAttributes, options.layers, options.zoom); this.segments = new SegmentVector(); }; LineBucket.prototype.populate = function populate (features , options ) { var this$1 = this; for (var i = 0, list = features; i < list.length; i += 1) { var ref = list[i]; var feature = ref.feature; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; if (this$1.layers[0]._featureFilter({zoom: this$1.zoom}, feature)) { var geometry = loadGeometry(feature); this$1.addFeature(feature, geometry); options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this$1.index); } } }; LineBucket.prototype.isEmpty = function isEmpty () { return this.layoutVertexArray.length === 0; }; LineBucket.prototype.upload = function upload (context ) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, layoutAttributes); this.indexBuffer = context.createIndexBuffer(this.indexArray); this.programConfigurations.upload(context); }; LineBucket.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); }; LineBucket.prototype.addFeature = function addFeature (feature , geometry ) { var this$1 = this; var layout = this.layers[0].layout; var join = layout.get('line-join').evaluate(feature); var cap = layout.get('line-cap'); var miterLimit = layout.get('line-miter-limit'); var roundLimit = layout.get('line-round-limit'); for (var i = 0, list = geometry; i < list.length; i += 1) { var line = list[i]; this$1.addLine(line, feature, join, cap, miterLimit, roundLimit); } }; LineBucket.prototype.addLine = function addLine (vertices , feature , join , cap , miterLimit , roundLimit ) { var this$1 = this; var isPolygon = vectorTileFeatureTypes[feature.type] === 'Polygon'; // If the line has duplicate vertices at the ends, adjust start/length to remove them. var len = vertices.length; while (len >= 2 && vertices[len - 1].equals(vertices[len - 2])) { len--; } var first = 0; while (first < len - 1 && vertices[first].equals(vertices[first + 1])) { first++; } // Ignore invalid geometry. if (len < (isPolygon ? 3 : 2)) { return; } if (join === 'bevel') { miterLimit = 1.05; } var sharpCornerOffset = SHARP_CORNER_OFFSET * (EXTENT / (512 * this.overscaling)); var firstVertex = vertices[first]; // we could be more precise, but it would only save a negligible amount of space var segment = this.segments.prepareSegment(len * 10, this.layoutVertexArray, this.indexArray); this.distance = 0; var beginCap = cap, endCap = isPolygon ? 'butt' : cap; var startOfLine = true; var currentVertex; var prevVertex = ((undefined ) ); var nextVertex = ((undefined ) ); var prevNormal = ((undefined ) ); var nextNormal = ((undefined ) ); var offsetA; var offsetB; // the last three vertices added this.e1 = this.e2 = this.e3 = -1; if (isPolygon) { currentVertex = vertices[len - 2]; nextNormal = firstVertex.sub(currentVertex)._unit()._perp(); } for (var i = first; i < len; i++) { nextVertex = isPolygon && i === len - 1 ? vertices[first + 1] : // if the line is closed, we treat the last vertex like the first vertices[i + 1]; // just the next vertex // if two consecutive vertices exist, skip the current one if (nextVertex && vertices[i].equals(nextVertex)) { continue; } if (nextNormal) { prevNormal = nextNormal; } if (currentVertex) { prevVertex = currentVertex; } currentVertex = vertices[i]; // Calculate the normal towards the next vertex in this line. In case // there is no next vertex, pretend that the line is continuing straight, // meaning that we are just using the previous normal. nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal; // If we still don't have a previous normal, this is the beginning of a // non-closed line, so we're doing a straight "join". prevNormal = prevNormal || nextNormal; // Determine the normal of the join extrusion. It is the angle bisector // of the segments between the previous line and the next line. // In the case of 180° angles, the prev and next normals cancel each other out: // prevNormal + nextNormal = (0, 0), its magnitude is 0, so the unit vector would be // undefined. In that case, we're keeping the joinNormal at (0, 0), so that the cosHalfAngle // below will also become 0 and miterLength will become Infinity. var joinNormal = prevNormal.add(nextNormal); if (joinNormal.x !== 0 || joinNormal.y !== 0) { joinNormal._unit(); } /* joinNormal prevNormal * ↖ ↑ * .________. prevVertex * | * nextNormal ← | currentVertex * | * nextVertex ! * */ // Calculate the length of the miter (the ratio of the miter to the width). // Find the cosine of the angle between the next and join normals // using dot product. The inverse of that is the miter length. var cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y; var miterLength = cosHalfAngle !== 0 ? 1 / cosHalfAngle : Infinity; var isSharpCorner = cosHalfAngle < COS_HALF_SHARP_CORNER && prevVertex && nextVertex; if (isSharpCorner && i > first) { var prevSegmentLength = currentVertex.dist(prevVertex); if (prevSegmentLength > 2 * sharpCornerOffset) { var newPrevVertex = currentVertex.sub(currentVertex.sub(prevVertex)._mult(sharpCornerOffset / prevSegmentLength)._round()); this$1.distance += newPrevVertex.dist(prevVertex); this$1.addCurrentVertex(newPrevVertex, this$1.distance, prevNormal.mult(1), 0, 0, false, segment); prevVertex = newPrevVertex; } } // The join if a middle vertex, otherwise the cap. var middleVertex = prevVertex && nextVertex; var currentJoin = middleVertex ? join : nextVertex ? beginCap : endCap; if (middleVertex && currentJoin === 'round') { if (miterLength < roundLimit) { currentJoin = 'miter'; } else if (miterLength <= 2) { currentJoin = 'fakeround'; } } if (currentJoin === 'miter' && miterLength > miterLimit) { currentJoin = 'bevel'; } if (currentJoin === 'bevel') { // The maximum extrude length is 128 / 63 = 2 times the width of the line // so if miterLength >= 2 we need to draw a different type of bevel here. if (miterLength > 2) { currentJoin = 'flipbevel'; } // If the miterLength is really small and the line bevel wouldn't be visible, // just draw a miter join to save a triangle. if (miterLength < miterLimit) { currentJoin = 'miter'; } } // Calculate how far along the line the currentVertex is if (prevVertex) { this$1.distance += currentVertex.dist(prevVertex); } if (currentJoin === 'miter') { joinNormal._mult(miterLength); this$1.addCurrentVertex(currentVertex, this$1.distance, joinNormal, 0, 0, false, segment); } else if (currentJoin === 'flipbevel') { // miter is too big, flip the direction to make a beveled join if (miterLength > 100) { // Almost parallel lines joinNormal = nextNormal.clone().mult(-1); } else { var direction = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0 ? -1 : 1; var bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag(); joinNormal._perp()._mult(bevelLength * direction); } this$1.addCurrentVertex(currentVertex, this$1.distance, joinNormal, 0, 0, false, segment); this$1.addCurrentVertex(currentVertex, this$1.distance, joinNormal.mult(-1), 0, 0, false, segment); } else if (currentJoin === 'bevel' || currentJoin === 'fakeround') { var lineTurnsLeft = (prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x) > 0; var offset = -Math.sqrt(miterLength * miterLength - 1); if (lineTurnsLeft) { offsetB = 0; offsetA = offset; } else { offsetA = 0; offsetB = offset; } // Close previous segment with a bevel if (!startOfLine) { this$1.addCurrentVertex(currentVertex, this$1.distance, prevNormal, offsetA, offsetB, false, segment); } if (currentJoin === 'fakeround') { // The join angle is sharp enough that a round join would be visible. // Bevel joins fill the gap between segments with a single pie slice triangle. // Create a round join by adding multiple pie slices. The join isn't actually round, but // it looks like it is at the sizes we render lines at. // Add more triangles for sharper angles. // This math is just a good enough approximation. It isn't "correct". var n = Math.floor((0.5 - (cosHalfAngle - 0.5)) * 8); var approxFractionalJoinNormal = (void 0); for (var m = 0; m < n; m++) { approxFractionalJoinNormal = nextNormal.mult((m + 1) / (n + 1))._add(prevNormal)._unit(); this$1.addPieSliceVertex(currentVertex, this$1.distance, approxFractionalJoinNormal, lineTurnsLeft, segment); } this$1.addPieSliceVertex(currentVertex, this$1.distance, joinNormal, lineTurnsLeft, segment); for (var k = n - 1; k >= 0; k--) { approxFractionalJoinNormal = prevNormal.mult((k + 1) / (n + 1))._add(nextNormal)._unit(); this$1.addPieSliceVertex(currentVertex, this$1.distance, approxFractionalJoinNormal, lineTurnsLeft, segment); } } // Start next segment if (nextVertex) { this$1.addCurrentVertex(currentVertex, this$1.distance, nextNormal, -offsetA, -offsetB, false, segment); } } else if (currentJoin === 'butt') { if (!startOfLine) { // Close previous segment with a butt this$1.addCurrentVertex(currentVertex, this$1.distance, prevNormal, 0, 0, false, segment); } // Start next segment with a butt if (nextVertex) { this$1.addCurrentVertex(currentVertex, this$1.distance, nextNormal, 0, 0, false, segment); } } else if (currentJoin === 'square') { if (!startOfLine) { // Close previous segment with a square cap this$1.addCurrentVertex(currentVertex, this$1.distance, prevNormal, 1, 1, false, segment); // The segment is done. Unset vertices to disconnect segments. this$1.e1 = this$1.e2 = -1; } // Start next segment if (nextVertex) { this$1.addCurrentVertex(currentVertex, this$1.distance, nextNormal, -1, -1, false, segment); } } else if (currentJoin === 'round') { if (!startOfLine) { // Close previous segment with butt this$1.addCurrentVertex(currentVertex, this$1.distance, prevNormal, 0, 0, false, segment); // Add round cap or linejoin at end of segment this$1.addCurrentVertex(currentVertex, this$1.distance, prevNormal, 1, 1, true, segment); // The segment is done. Unset vertices to disconnect segments. this$1.e1 = this$1.e2 = -1; } // Start next segment with a butt if (nextVertex) { // Add round cap before first segment this$1.addCurrentVertex(currentVertex, this$1.distance, nextNormal, -1, -1, true, segment); this$1.addCurrentVertex(currentVertex, this$1.distance, nextNormal, 0, 0, false, segment); } } if (isSharpCorner && i < len - 1) { var nextSegmentLength = currentVertex.dist(nextVertex); if (nextSegmentLength > 2 * sharpCornerOffset) { var newCurrentVertex = currentVertex.add(nextVertex.sub(currentVertex)._mult(sharpCornerOffset / nextSegmentLength)._round()); this$1.distance += newCurrentVertex.dist(currentVertex); this$1.addCurrentVertex(newCurrentVertex, this$1.distance, nextNormal.mult(1), 0, 0, false, segment); currentVertex = newCurrentVertex; } } startOfLine = false; } this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature); }; /** * Add two vertices to the buffers. * * @param {Object} currentVertex the line vertex to add buffer vertices for * @param {number} distance the distance from the beginning of the line to the vertex * @param {number} endLeft extrude to shift the left vertex along the line * @param {number} endRight extrude to shift the left vertex along the line * @param {boolean} round whether this is a round cap * @private */ LineBucket.prototype.addCurrentVertex = function addCurrentVertex (currentVertex , distance , normal , endLeft , endRight , round , segment ) { var extrude; var layoutVertexArray = this.layoutVertexArray; var indexArray = this.indexArray; extrude = normal.clone(); if (endLeft) { extrude._sub(normal.perp()._mult(endLeft)); } addLineVertex(layoutVertexArray, currentVertex, extrude, round, false, endLeft, distance); this.e3 = segment.vertexLength++; if (this.e1 >= 0 && this.e2 >= 0) { indexArray.emplaceBack(this.e1, this.e2, this.e3); segment.primitiveLength++; } this.e1 = this.e2; this.e2 = this.e3; extrude = normal.mult(-1); if (endRight) { extrude._sub(normal.perp()._mult(endRight)); } addLineVertex(layoutVertexArray, currentVertex, extrude, round, true, -endRight, distance); this.e3 = segment.vertexLength++; if (this.e1 >= 0 && this.e2 >= 0) { indexArray.emplaceBack(this.e1, this.e2, this.e3); segment.primitiveLength++; } this.e1 = this.e2; this.e2 = this.e3; // There is a maximum "distance along the line" that we can store in the buffers. // When we get close to the distance, reset it to zero and add the vertex again with // a distance of zero. The max distance is determined by the number of bits we allocate // to `linesofar`. if (distance > MAX_LINE_DISTANCE / 2) { this.distance = 0; this.addCurrentVertex(currentVertex, this.distance, normal, endLeft, endRight, round, segment); } }; /** * Add a single new vertex and a triangle using two previous vertices. * This adds a pie slice triangle near a join to simulate round joins * * @param currentVertex the line vertex to add buffer vertices for * @param distance the distance from the beggining of the line to the vertex * @param extrude the offset of the new vertex from the currentVertex * @param lineTurnsLeft whether the line is turning left or right at this angle * @private */ LineBucket.prototype.addPieSliceVertex = function addPieSliceVertex (currentVertex , distance , extrude , lineTurnsLeft , segment ) { extrude = extrude.mult(lineTurnsLeft ? -1 : 1); var layoutVertexArray = this.layoutVertexArray; var indexArray = this.indexArray; addLineVertex(layoutVertexArray, currentVertex, extrude, false, lineTurnsLeft, 0, distance); this.e3 = segment.vertexLength++; if (this.e1 >= 0 && this.e2 >= 0) { indexArray.emplaceBack(this.e1, this.e2, this.e3); segment.primitiveLength++; } if (lineTurnsLeft) { this.e2 = this.e3; } else { this.e1 = this.e3; } }; register('LineBucket', LineBucket, {omit: ['layers']}); module.exports = LineBucket; },{"../../util/web_worker_transfer":283,"../array_types":44,"../extent":58,"../index_array_type":60,"../load_geometry":61,"../program_configuration":63,"../segment":65,"./line_attributes":53,"@mapbox/vector-tile":8}],55:[function(require,module,exports){ 'use strict';// var ref = require('../../util/struct_array'); var createLayout = ref.createLayout; var symbolLayoutAttributes = createLayout([ {name: 'a_pos_offset', components: 4, type: 'Int16'}, {name: 'a_data', components: 4, type: 'Uint16'} ]); var dynamicLayoutAttributes = createLayout([ { name: 'a_projected_pos', components: 3, type: 'Float32' } ], 4); var placementOpacityAttributes = createLayout([ { name: 'a_fade_opacity', components: 1, type: 'Uint32' } ], 4); var collisionVertexAttributes = createLayout([ { name: 'a_placed', components: 2, type: 'Uint8' } ], 4); var symbolAttributes = { symbolLayoutAttributes: symbolLayoutAttributes, dynamicLayoutAttributes: dynamicLayoutAttributes, placementOpacityAttributes: placementOpacityAttributes, collisionVertexAttributes: collisionVertexAttributes, collisionBox: createLayout([ // the box is centered around the anchor point { type: 'Int16', name: 'anchorPointX' }, { type: 'Int16', name: 'anchorPointY' }, // distances to the edges from the anchor { type: 'Int16', name: 'x1' }, { type: 'Int16', name: 'y1' }, { type: 'Int16', name: 'x2' }, { type: 'Int16', name: 'y2' }, // the index of the feature in the original vectortile { type: 'Uint32', name: 'featureIndex' }, // the source layer the feature appears in { type: 'Uint16', name: 'sourceLayerIndex' }, // the bucket the feature appears in { type: 'Uint16', name: 'bucketIndex' }, // collision circles for lines store their distance to the anchor in tile units // so that they can be ignored if the projected label doesn't extend into // the box area { type: 'Int16', name: 'radius' }, { type: 'Int16', name: 'signedDistanceFromAnchor' } ]), collisionBoxLayout: createLayout([ // used to render collision boxes for debugging purposes {name: 'a_pos', components: 2, type: 'Int16'}, {name: 'a_anchor_pos', components: 2, type: 'Int16'}, {name: 'a_extrude', components: 2, type: 'Int16'} ], 4), collisionCircleLayout: createLayout([ // used to render collision circles for debugging purposes {name: 'a_pos', components: 2, type: 'Int16'}, {name: 'a_anchor_pos', components: 2, type: 'Int16'}, {name: 'a_extrude', components: 2, type: 'Int16'} ], 4), placement: createLayout([ { type: 'Int16', name: 'anchorX' }, { type: 'Int16', name: 'anchorY' }, { type: 'Uint16', name: 'glyphStartIndex' }, { type: 'Uint16', name: 'numGlyphs' }, { type: 'Uint32', name: 'vertexStartIndex' }, { type: 'Uint32', name: 'lineStartIndex' }, { type: 'Uint32', name: 'lineLength' }, { type: 'Uint16', name: 'segment' }, { type: 'Uint16', name: 'lowerSize' }, { type: 'Uint16', name: 'upperSize' }, { type: 'Float32', name: 'lineOffsetX' }, { type: 'Float32', name: 'lineOffsetY' }, { type: 'Uint8', name: 'writingMode' }, { type: 'Uint8', name: 'hidden' } ]), glyphOffset: createLayout([ { type: 'Float32', name: 'offsetX' } ]), lineVertex: createLayout([ { type: 'Int16', name: 'x' }, { type: 'Int16', name: 'y' }, { type: 'Int16', name: 'tileUnitDistanceFromAnchor' } ]) }; module.exports = symbolAttributes; },{"../../util/struct_array":276}],56:[function(require,module,exports){ 'use strict';// var ref = require('./symbol_attributes'); var symbolLayoutAttributes = ref.symbolLayoutAttributes; var collisionVertexAttributes = ref.collisionVertexAttributes; var collisionBoxLayout = ref.collisionBoxLayout; var collisionCircleLayout = ref.collisionCircleLayout; var dynamicLayoutAttributes = ref.dynamicLayoutAttributes; var ref$1 = require('../array_types'); var SymbolLayoutArray = ref$1.SymbolLayoutArray; var SymbolDynamicLayoutArray = ref$1.SymbolDynamicLayoutArray; var SymbolOpacityArray = ref$1.SymbolOpacityArray; var CollisionBoxLayoutArray = ref$1.CollisionBoxLayoutArray; var CollisionCircleLayoutArray = ref$1.CollisionCircleLayoutArray; var CollisionVertexArray = ref$1.CollisionVertexArray; var PlacedSymbolArray = ref$1.PlacedSymbolArray; var GlyphOffsetArray = ref$1.GlyphOffsetArray; var SymbolLineVertexArray = ref$1.SymbolLineVertexArray; var Point = require('@mapbox/point-geometry'); var ref$2 = require('../segment'); var SegmentVector = ref$2.SegmentVector; var ref$3 = require('../program_configuration'); var ProgramConfigurationSet = ref$3.ProgramConfigurationSet; var ref$4 = require('../index_array_type'); var TriangleIndexArray = ref$4.TriangleIndexArray; var LineIndexArray = ref$4.LineIndexArray; var transformText = require('../../symbol/transform_text'); var mergeLines = require('../../symbol/mergelines'); var scriptDetection = require('../../util/script_detection'); var loadGeometry = require('../load_geometry'); var vectorTileFeatureTypes = require('@mapbox/vector-tile').VectorTileFeature.types; var verticalizePunctuation = require('../../util/verticalize_punctuation'); var Anchor = require('../../symbol/anchor'); var ref$5 = require('../../symbol/symbol_size'); var getSizeData = ref$5.getSizeData; var ref$6 = require('../../util/web_worker_transfer'); var register = ref$6.register; // Opacity arrays are frequently updated but don't contain a lot of information, so we pack them // tight. Each Uint32 is actually four duplicate Uint8s for the four corners of a glyph // 7 bits are for the current opacity, and the lowest bit is the target opacity // actually defined in symbol_attributes.js // const placementOpacityAttributes = [ // { name: 'a_fade_opacity', components: 1, type: 'Uint32' } // ]; var shaderOpacityAttributes = [ { name: 'a_fade_opacity', components: 1, type: 'Uint8', offset: 0 } ]; function addVertex(array, anchorX, anchorY, ox, oy, tx, ty, sizeVertex) { array.emplaceBack( // a_pos_offset anchorX, anchorY, Math.round(ox * 64), Math.round(oy * 64), // a_data tx, // x coordinate of symbol on glyph atlas texture ty, // y coordinate of symbol on glyph atlas texture sizeVertex ? sizeVertex[0] : 0, sizeVertex ? sizeVertex[1] : 0 ); } function addDynamicAttributes(dynamicLayoutVertexArray , p , angle ) { dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); } var SymbolBuffers = function SymbolBuffers(programConfigurations ) { this.layoutVertexArray = new SymbolLayoutArray(); this.indexArray = new TriangleIndexArray(); this.programConfigurations = programConfigurations; this.segments = new SegmentVector(); this.dynamicLayoutVertexArray = new SymbolDynamicLayoutArray(); this.opacityVertexArray = new SymbolOpacityArray(); this.placedSymbolArray = new PlacedSymbolArray(); }; SymbolBuffers.prototype.upload = function upload (context , dynamicIndexBuffer ) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, symbolLayoutAttributes.members); this.indexBuffer = context.createIndexBuffer(this.indexArray, dynamicIndexBuffer); this.programConfigurations.upload(context); this.dynamicLayoutVertexBuffer = context.createVertexBuffer(this.dynamicLayoutVertexArray, dynamicLayoutAttributes.members, true); this.opacityVertexBuffer = context.createVertexBuffer(this.opacityVertexArray, shaderOpacityAttributes, true); // This is a performance hack so that we can write to opacityVertexArray with uint32s // even though the shaders read uint8s this.opacityVertexBuffer.itemSize = 1; }; SymbolBuffers.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); this.dynamicLayoutVertexBuffer.destroy(); this.opacityVertexBuffer.destroy(); }; register('SymbolBuffers', SymbolBuffers); var CollisionBuffers = function CollisionBuffers(LayoutArray , layoutAttributes , IndexArray ) { this.layoutVertexArray = new LayoutArray(); this.layoutAttributes = layoutAttributes; this.indexArray = new IndexArray(); this.segments = new SegmentVector(); this.collisionVertexArray = new CollisionVertexArray(); }; CollisionBuffers.prototype.upload = function upload (context ) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, this.layoutAttributes); this.indexBuffer = context.createIndexBuffer(this.indexArray); this.collisionVertexBuffer = context.createVertexBuffer(this.collisionVertexArray, collisionVertexAttributes.members, true); }; CollisionBuffers.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.segments.destroy(); this.collisionVertexBuffer.destroy(); }; register('CollisionBuffers', CollisionBuffers); /** * Unlike other buckets, which simply implement #addFeature with type-specific * logic for (essentially) triangulating feature geometries, SymbolBucket * requires specialized behavior: * * 1. WorkerTile#parse(), the logical owner of the bucket creation process, * calls SymbolBucket#populate(), which resolves text and icon tokens on * each feature, adds each glyphs and symbols needed to the passed-in * collections options.glyphDependencies and options.iconDependencies, and * stores the feature data for use in subsequent step (this.features). * * 2. WorkerTile asynchronously requests from the main thread all of the glyphs * and icons needed (by this bucket and any others). When glyphs and icons * have been received, the WorkerTile creates a CollisionIndex and invokes: * * 3. performSymbolLayout(bucket, stacks, icons) perform texts shaping and * layout on a Symbol Bucket. This step populates: * `this.symbolInstances`: metadata on generated symbols * `this.collisionBoxArray`: collision data for use by foreground * `this.text`: SymbolBuffers for text symbols * `this.icons`: SymbolBuffers for icons * `this.collisionBox`: Debug SymbolBuffers for collision boxes * `this.collisionCircle`: Debug SymbolBuffers for collision circles * The results are sent to the foreground for rendering * * 4. performSymbolPlacement(bucket, collisionIndex) is run on the foreground, * and uses the CollisionIndex along with current camera settings to determine * which symbols can actually show on the map. Collided symbols are hidden * using a dynamic "OpacityVertexArray". * * @private */ var SymbolBucket = function SymbolBucket(options ) { this.collisionBoxArray = options.collisionBoxArray; this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.pixelRatio = options.pixelRatio; var layer = this.layers[0]; var unevaluatedLayoutValues = layer._unevaluatedLayout._values; this.textSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['text-size']); this.iconSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['icon-size']); var layout = this.layers[0].layout; this.sortFeaturesByY = layout.get('text-allow-overlap') || layout.get('icon-allow-overlap') || layout.get('text-ignore-placement') || layout.get('icon-ignore-placement'); }; SymbolBucket.prototype.createArrays = function createArrays () { this.text = new SymbolBuffers(new ProgramConfigurationSet(symbolLayoutAttributes.members, this.layers, this.zoom, function (property) { return /^text/.test(property); })); this.icon = new SymbolBuffers(new ProgramConfigurationSet(symbolLayoutAttributes.members, this.layers, this.zoom, function (property) { return /^icon/.test(property); })); this.collisionBox = new CollisionBuffers(CollisionBoxLayoutArray, collisionBoxLayout.members, LineIndexArray); this.collisionCircle = new CollisionBuffers(CollisionCircleLayoutArray, collisionCircleLayout.members, TriangleIndexArray); this.glyphOffsetArray = new GlyphOffsetArray(); this.lineVertexArray = new SymbolLineVertexArray(); }; SymbolBucket.prototype.populate = function populate (features , options ) { var this$1 = this; var layer = this.layers[0]; var layout = layer.layout; var textFont = layout.get('text-font'); var textField = layout.get('text-field'); var iconImage = layout.get('icon-image'); var hasText = (textField.value.kind !== 'constant' || textField.value.value.length > 0) && (textFont.value.kind !== 'constant' || textFont.value.value.length > 0); var hasIcon = iconImage.value.kind !== 'constant' || iconImage.value.value && iconImage.value.value.length > 0; this.features = []; if (!hasText && !hasIcon) { return; } var icons = options.iconDependencies; var stacks = options.glyphDependencies; var globalProperties ={zoom: this.zoom}; for (var i$1 = 0, list = features; i$1 < list.length; i$1 += 1) { var ref = list[i$1]; var feature = ref.feature; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; if (!layer._featureFilter(globalProperties, feature)) { continue; } var text = (void 0); if (hasText) { text = layer.getValueAndResolveTokens('text-field', feature); text = transformText(text, layer, feature); } var icon = (void 0); if (hasIcon) { icon = layer.getValueAndResolveTokens('icon-image', feature); } if (!text && !icon) { continue; } var symbolFeature = { text: text, icon: icon, index: index, sourceLayerIndex: sourceLayerIndex, geometry: loadGeometry(feature), properties: feature.properties, type: vectorTileFeatureTypes[feature.type] }; if (typeof feature.id !== 'undefined') { symbolFeature.id = feature.id; } this$1.features.push(symbolFeature); if (icon) { icons[icon] = true; } if (text) { var fontStack = textFont.evaluate(feature).join(','); var stack = stacks[fontStack] = stacks[fontStack] || {}; var textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') === 'line'; var allowsVerticalWritingMode = scriptDetection.allowsVerticalWritingMode(text); for (var i = 0; i < text.length; i++) { stack[text.charCodeAt(i)] = true; if (textAlongLine && allowsVerticalWritingMode) { var verticalChar = verticalizePunctuation.lookup[text.charAt(i)]; if (verticalChar) { stack[verticalChar.charCodeAt(0)] = true; } } } } } if (layout.get('symbol-placement') === 'line') { // Merge adjacent lines with the same text to improve labelling. // It's better to place labels on one long line than on many short segments. this.features = mergeLines(this.features); } }; SymbolBucket.prototype.isEmpty = function isEmpty () { return this.symbolInstances.length === 0; }; SymbolBucket.prototype.upload = function upload (context ) { this.text.upload(context, this.sortFeaturesByY); this.icon.upload(context, this.sortFeaturesByY); this.collisionBox.upload(context); this.collisionCircle.upload(context); }; SymbolBucket.prototype.destroy = function destroy () { this.text.destroy(); this.icon.destroy(); this.collisionBox.destroy(); this.collisionCircle.destroy(); }; SymbolBucket.prototype.addToLineVertexArray = function addToLineVertexArray (anchor , line ) { var this$1 = this; var lineStartIndex = this.lineVertexArray.length; if (anchor.segment !== undefined) { var sumForwardLength = anchor.dist(line[anchor.segment + 1]); var sumBackwardLength = anchor.dist(line[anchor.segment]); var vertices = {}; for (var i = anchor.segment + 1; i < line.length; i++) { vertices[i] = { x: line[i].x, y: line[i].y, tileUnitDistanceFromAnchor: sumForwardLength }; if (i < line.length - 1) { sumForwardLength += line[i + 1].dist(line[i]); } } for (var i$1 = anchor.segment || 0; i$1 >= 0; i$1--) { vertices[i$1] = { x: line[i$1].x, y: line[i$1].y, tileUnitDistanceFromAnchor: sumBackwardLength }; if (i$1 > 0) { sumBackwardLength += line[i$1 - 1].dist(line[i$1]); } } for (var i$2 = 0; i$2 < line.length; i$2++) { var vertex = vertices[i$2]; this$1.lineVertexArray.emplaceBack(vertex.x, vertex.y, vertex.tileUnitDistanceFromAnchor); } } return { lineStartIndex: lineStartIndex, lineLength: this.lineVertexArray.length - lineStartIndex }; }; SymbolBucket.prototype.addSymbols = function addSymbols (arrays , quads , sizeVertex , lineOffset , alongLine , feature , writingMode , labelAnchor , lineStartIndex , lineLength ) { var this$1 = this; var indexArray = arrays.indexArray; var layoutVertexArray = arrays.layoutVertexArray; var dynamicLayoutVertexArray = arrays.dynamicLayoutVertexArray; var segment = arrays.segments.prepareSegment(4 * quads.length, arrays.layoutVertexArray, arrays.indexArray); var glyphOffsetArrayStart = this.glyphOffsetArray.length; var vertexStartIndex = segment.vertexLength; for (var i = 0, list = quads; i < list.length; i += 1) { var symbol = list[i]; var tl = symbol.tl, tr = symbol.tr, bl = symbol.bl, br = symbol.br, tex = symbol.tex; var index = segment.vertexLength; var y = symbol.glyphOffset[1]; addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, tl.x, y + tl.y, tex.x, tex.y, sizeVertex); addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, tr.x, y + tr.y, tex.x + tex.w, tex.y, sizeVertex); addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, bl.x, y + bl.y, tex.x, tex.y + tex.h, sizeVertex); addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, br.x, y + br.y, tex.x + tex.w, tex.y + tex.h, sizeVertex); addDynamicAttributes(dynamicLayoutVertexArray, labelAnchor, 0); indexArray.emplaceBack(index, index + 1, index + 2); indexArray.emplaceBack(index + 1, index + 2, index + 3); segment.vertexLength += 4; segment.primitiveLength += 2; this$1.glyphOffsetArray.emplaceBack(symbol.glyphOffset[0]); } arrays.placedSymbolArray.emplaceBack(labelAnchor.x, labelAnchor.y, glyphOffsetArrayStart, this.glyphOffsetArray.length - glyphOffsetArrayStart, vertexStartIndex, lineStartIndex, lineLength, (labelAnchor.segment ), sizeVertex ? sizeVertex[0] : 0, sizeVertex ? sizeVertex[1] : 0, lineOffset[0], lineOffset[1], writingMode, (false )); arrays.programConfigurations.populatePaintArrays(arrays.layoutVertexArray.length, feature); }; SymbolBucket.prototype._addCollisionDebugVertex = function _addCollisionDebugVertex (layoutVertexArray , collisionVertexArray , point , anchor , extrude ) { collisionVertexArray.emplaceBack(0, 0); return layoutVertexArray.emplaceBack( // pos point.x, point.y, // a_anchor_pos anchor.x, anchor.y, // extrude Math.round(extrude.x), Math.round(extrude.y)); }; SymbolBucket.prototype.addCollisionDebugVertices = function addCollisionDebugVertices (x1 , y1 , x2 , y2 , arrays , boxAnchorPoint , symbolInstance , isCircle ) { var segment = arrays.segments.prepareSegment(4, arrays.layoutVertexArray, arrays.indexArray); var index = segment.vertexLength; var layoutVertexArray = arrays.layoutVertexArray; var collisionVertexArray = arrays.collisionVertexArray; this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, symbolInstance.anchor, new Point(x1, y1)); this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, symbolInstance.anchor, new Point(x2, y1)); this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, symbolInstance.anchor, new Point(x2, y2)); this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, symbolInstance.anchor, new Point(x1, y2)); segment.vertexLength += 4; if (isCircle) { var indexArray = (arrays.indexArray ); indexArray.emplaceBack(index, index + 1, index + 2); indexArray.emplaceBack(index, index + 2, index + 3); segment.primitiveLength += 2; } else { var indexArray$1 = (arrays.indexArray ); indexArray$1.emplaceBack(index, index + 1); indexArray$1.emplaceBack(index + 1, index + 2); indexArray$1.emplaceBack(index + 2, index + 3); indexArray$1.emplaceBack(index + 3, index); segment.primitiveLength += 4; } }; SymbolBucket.prototype.generateCollisionDebugBuffers = function generateCollisionDebugBuffers () { var this$1 = this; for (var i$1 = 0, list = this$1.symbolInstances; i$1 < list.length; i$1 += 1) { var symbolInstance = list[i$1]; symbolInstance.textCollisionFeature = {boxStartIndex: symbolInstance.textBoxStartIndex, boxEndIndex: symbolInstance.textBoxEndIndex}; symbolInstance.iconCollisionFeature = {boxStartIndex: symbolInstance.iconBoxStartIndex, boxEndIndex: symbolInstance.iconBoxEndIndex}; for (var i = 0; i < 2; i++) { var feature = symbolInstance[i === 0 ? 'textCollisionFeature' : 'iconCollisionFeature']; if (!feature) { continue; } for (var b = feature.boxStartIndex; b < feature.boxEndIndex; b++) { var box = (this$1.collisionBoxArray.get(b) ); var x1 = box.x1; var y1 = box.y1; var x2 = box.x2; var y2 = box.y2; // If the radius > 0, this collision box is actually a circle // The data we add to the buffers is exactly the same, but we'll render with a different shader. var isCircle = box.radius > 0; this$1.addCollisionDebugVertices(x1, y1, x2, y2, isCircle ? this$1.collisionCircle : this$1.collisionBox, box.anchorPoint, symbolInstance, isCircle); } } } }; // These flat arrays are meant to be quicker to iterate over than the source // CollisionBoxArray SymbolBucket.prototype.deserializeCollisionBoxes = function deserializeCollisionBoxes (collisionBoxArray , textStartIndex , textEndIndex , iconStartIndex , iconEndIndex ) { var collisionArrays = {}; for (var k = textStartIndex; k < textEndIndex; k++) { var box = (collisionBoxArray.get(k) ); if (box.radius === 0) { collisionArrays.textBox = { x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, anchorPointX: box.anchorPointX, anchorPointY: box.anchorPointY }; break; // Only one box allowed per instance } else { if (!collisionArrays.textCircles) { collisionArrays.textCircles = []; } var used = 1; // May be updated at collision detection time collisionArrays.textCircles.push(box.anchorPointX, box.anchorPointY, box.radius, box.signedDistanceFromAnchor, used); } } for (var k$1 = iconStartIndex; k$1 < iconEndIndex; k$1++) { // An icon can only have one box now, so this indexing is a bit vestigial... var box$1 = (collisionBoxArray.get(k$1) ); if (box$1.radius === 0) { collisionArrays.iconBox = { x1: box$1.x1, y1: box$1.y1, x2: box$1.x2, y2: box$1.y2, anchorPointX: box$1.anchorPointX, anchorPointY: box$1.anchorPointY }; break; // Only one box allowed per instance } } return collisionArrays; }; SymbolBucket.prototype.hasTextData = function hasTextData () { return this.text.segments.get().length > 0; }; SymbolBucket.prototype.hasIconData = function hasIconData () { return this.icon.segments.get().length > 0; }; SymbolBucket.prototype.hasCollisionBoxData = function hasCollisionBoxData () { return this.collisionBox.segments.get().length > 0; }; SymbolBucket.prototype.hasCollisionCircleData = function hasCollisionCircleData () { return this.collisionCircle.segments.get().length > 0; }; SymbolBucket.prototype.sortFeatures = function sortFeatures (angle ) { var this$1 = this; if (!this.sortFeaturesByY) { return; } if (this.sortedAngle === angle) { return; } this.sortedAngle = angle; // The current approach to sorting doesn't sort across segments so don't try. // Sorting within segments separately seemed not to be worth the complexity. if (this.text.segments.get().length > 1 || this.icon.segments.get().length > 1) { return; } // If the symbols are allowed to overlap sort them by their vertical screen position. // The index array buffer is rewritten to reference the (unchanged) vertices in the // sorted order. // To avoid sorting the actual symbolInstance array we sort an array of indexes. var symbolInstanceIndexes = []; for (var i = 0; i < this.symbolInstances.length; i++) { symbolInstanceIndexes.push(i); } var sin = Math.sin(angle), cos = Math.cos(angle); symbolInstanceIndexes.sort(function (aIndex, bIndex) { var a = this$1.symbolInstances[aIndex]; var b = this$1.symbolInstances[bIndex]; var aRotated = (sin * a.anchor.x + cos * a.anchor.y) | 0; var bRotated = (sin * b.anchor.x + cos * b.anchor.y) | 0; return (aRotated - bRotated) || (b.featureIndex - a.featureIndex); }); this.text.indexArray.clear(); this.icon.indexArray.clear(); for (var i$2 = 0, list = symbolInstanceIndexes; i$2 < list.length; i$2 += 1) { var i$1 = list[i$2]; var symbolInstance = this$1.symbolInstances[i$1]; for (var i$3 = 0, list$1 = symbolInstance.placedTextSymbolIndices; i$3 < list$1.length; i$3 += 1) { var placedTextSymbolIndex = list$1[i$3]; var placedSymbol = this$1.text.placedSymbolArray.get(placedTextSymbolIndex); var endIndex = placedSymbol.vertexStartIndex + placedSymbol.numGlyphs * 4; for (var vertexIndex = placedSymbol.vertexStartIndex; vertexIndex < endIndex; vertexIndex += 4) { this$1.text.indexArray.emplaceBack(vertexIndex, vertexIndex + 1, vertexIndex + 2); this$1.text.indexArray.emplaceBack(vertexIndex + 1, vertexIndex + 2, vertexIndex + 3); } } var placedIcon = this$1.icon.placedSymbolArray.get(i$1); if (placedIcon.numGlyphs) { var vertexIndex$1 = placedIcon.vertexStartIndex; this$1.icon.indexArray.emplaceBack(vertexIndex$1, vertexIndex$1 + 1, vertexIndex$1 + 2); this$1.icon.indexArray.emplaceBack(vertexIndex$1 + 1, vertexIndex$1 + 2, vertexIndex$1 + 3); } } if (this.text.indexBuffer) { this.text.indexBuffer.updateData(this.text.indexArray); } if (this.icon.indexBuffer) { this.icon.indexBuffer.updateData(this.icon.indexArray); } }; register('SymbolBucket', SymbolBucket, { omit: ['layers', 'collisionBoxArray', 'features', 'compareText'], shallow: ['symbolInstances'] }); // this constant is based on the size of StructArray indexes used in a symbol // bucket--namely, glyphOffsetArrayStart // eg the max valid UInt16 is 65,535 // See https://github.com/mapbox/mapbox-gl-js/issues/2907 for motivation // lineStartIndex and textBoxStartIndex could potentially be concerns // but we expect there to be many fewer boxes/lines than glyphs SymbolBucket.MAX_GLYPHS = 65535; SymbolBucket.addDynamicAttributes = addDynamicAttributes; module.exports = SymbolBucket; },{"../../symbol/anchor":218,"../../symbol/mergelines":226,"../../symbol/symbol_size":233,"../../symbol/transform_text":234,"../../util/script_detection":274,"../../util/verticalize_punctuation":282,"../../util/web_worker_transfer":283,"../array_types":44,"../index_array_type":60,"../load_geometry":61,"../program_configuration":63,"../segment":65,"./symbol_attributes":55,"@mapbox/point-geometry":4,"@mapbox/vector-tile":8}],57:[function(require,module,exports){ 'use strict';// var ref = require('../util/image'); var RGBAImage = ref.RGBAImage; var util = require('../util/util'); var ref$1 = require('../util/web_worker_transfer'); var register = ref$1.register; var Level = function Level(dim , border , data ) { if (dim <= 0) { throw new RangeError('Level must have positive dimension'); } this.dim = dim; this.border = border; this.stride = this.dim + 2 * this.border; this.data = data || new Int32Array((this.dim + 2 * this.border) * (this.dim + 2 * this.border)); }; Level.prototype.set = function set (x , y , value ) { this.data[this._idx(x, y)] = value + 65536; }; Level.prototype.get = function get (x , y ) { return this.data[this._idx(x, y)] - 65536; }; Level.prototype._idx = function _idx (x , y ) { if (x < -this.border || x >= this.dim + this.border || y < -this.border || y >= this.dim + this.border) { throw new RangeError('out of range source coordinates for DEM data'); } return (y + this.border) * this.stride + (x + this.border); }; register('Level', Level); // DEMData is a data structure for decoding, backfilling, and storing elevation data for processing in the hillshade shaders // data can be populated either from a pngraw image tile or from serliazed data sent back from a worker. When data is initially // loaded from a image tile, we decode the pixel values using the mapbox terrain-rgb tileset decoding formula, but we store the // elevation data in a Level as an Int32 value. we add 65536 (2^16) to eliminate negative values and enable the use of // integer overflow when creating the texture used in the hillshadePrepare step. // DEMData also handles the backfilling of data from a tile's neighboring tiles. This is necessary because we use a pixel's 8 // surrounding pixel values to compute the slope at that pixel, and we cannot accurately calculate the slope at pixels on a // tile's edge without backfilling from neighboring tiles. var DEMData = function DEMData(uid , scale , data ) { this.uid = uid; this.scale = scale || 1; // if no data is provided, use a temporary empty level to satisfy flow this.level = data || new Level(256, 512); this.loaded = !!data; }; DEMData.prototype.loadFromImage = function loadFromImage (data ) { var this$1 = this; if (data.height !== data.width) { throw new RangeError('DEM tiles must be square'); } // Build level 0 var level = this.level = new Level(data.width, data.width / 2); var pixels = data.data; // unpack for (var y = 0; y < level.dim; y++) { for (var x = 0; x < level.dim; x++) { var i = y * level.dim + x; var j = i * 4; // decoding per https://blog.mapbox.com/global-elevation-data-6689f1d0ba65 level.set(x, y, this$1.scale * ((pixels[j] * 256 * 256 + pixels[j + 1] * 256.0 + pixels[j + 2]) / 10.0 - 10000.0)); } } // in order to avoid flashing seams between tiles, here we are initially populating a 1px border of pixels around the image // with the data of the nearest pixel from the image. this data is eventually replaced when the tile's neighboring // tiles are loaded and the accurate data can be backfilled using DEMData#backfillBorder for (var x$1 = 0; x$1 < level.dim; x$1++) { // left vertical border level.set(-1, x$1, level.get(0, x$1)); // right vertical border level.set(level.dim, x$1, level.get(level.dim - 1, x$1)); // left horizontal border level.set(x$1, -1, level.get(x$1, 0)); // right horizontal border level.set(x$1, level.dim, level.get(x$1, level.dim - 1)); } // corners level.set(-1, -1, level.get(0, 0)); level.set(level.dim, -1, level.get(level.dim - 1, 0)); level.set(-1, level.dim, level.get(0, level.dim - 1)); level.set(level.dim, level.dim, level.get(level.dim - 1, level.dim - 1)); this.loaded = true; }; DEMData.prototype.getPixels = function getPixels () { return new RGBAImage({width: this.level.dim + 2 * this.level.border, height: this.level.dim + 2 * this.level.border}, new Uint8Array(this.level.data.buffer)); }; DEMData.prototype.backfillBorder = function backfillBorder (borderTile , dx , dy ) { var t = this.level; var o = borderTile.level; if (t.dim !== o.dim) { throw new Error('level mismatch (dem dimension)'); } var _xMin = dx * t.dim, _xMax = dx * t.dim + t.dim, _yMin = dy * t.dim, _yMax = dy * t.dim + t.dim; switch (dx) { case -1: _xMin = _xMax - 1; break; case 1: _xMax = _xMin + 1; break; } switch (dy) { case -1: _yMin = _yMax - 1; break; case 1: _yMax = _yMin + 1; break; } var xMin = util.clamp(_xMin, -t.border, t.dim + t.border); var xMax = util.clamp(_xMax, -t.border, t.dim + t.border); var yMin = util.clamp(_yMin, -t.border, t.dim + t.border); var yMax = util.clamp(_yMax, -t.border, t.dim + t.border); var ox = -dx * t.dim; var oy = -dy * t.dim; for (var y = yMin; y < yMax; y++) { for (var x = xMin; x < xMax; x++) { t.set(x, y, o.get(x + ox, y + oy)); } } }; register('DEMData', DEMData); module.exports = {DEMData: DEMData, Level: Level}; },{"../util/image":268,"../util/util":280,"../util/web_worker_transfer":283}],58:[function(require,module,exports){ 'use strict';// /** * The maximum value of a coordinate in the internal tile coordinate system. Coordinates of * all source features normalized to this extent upon load. * * The value is a consequence of the following: * * * Vertex buffer store positions as signed 16 bit integers. * * One bit is lost for signedness to support tile buffers. * * One bit is lost because the line vertex buffer used to pack 1 bit of other data into the int. * This is no longer the case but we're reserving this bit anyway. * * One bit is lost to support features extending past the extent on the right edge of the tile. * * This leaves us with 2^13 = 8192 * * @private * @readonly */ module.exports = 8192; },{}],59:[function(require,module,exports){ 'use strict';// var Point = require('@mapbox/point-geometry'); var loadGeometry = require('./load_geometry'); var EXTENT = require('./extent'); var featureFilter = require('../style-spec/feature_filter'); var Grid = require('grid-index'); var DictionaryCoder = require('../util/dictionary_coder'); var vt = require('@mapbox/vector-tile'); var Protobuf = require('pbf'); var GeoJSONFeature = require('../util/vectortile_to_geojson'); var arraysIntersect = require('../util/util').arraysIntersect; var ref = require('../source/tile_id'); var OverscaledTileID = ref.OverscaledTileID; var ref$1 = require('../util/web_worker_transfer'); var register = ref$1.register; var ref$2 = require('./array_types'); var FeatureIndexArray = ref$2.FeatureIndexArray; var FeatureIndex = function FeatureIndex(tileID , overscaling , grid , featureIndexArray ) { this.tileID = tileID; this.overscaling = overscaling; this.x = tileID.canonical.x; this.y = tileID.canonical.y; this.z = tileID.canonical.z; this.grid = grid || new Grid(EXTENT, 16, 0); this.featureIndexArray = featureIndexArray || new FeatureIndexArray(); }; FeatureIndex.prototype.insert = function insert (feature , geometry , featureIndex , sourceLayerIndex , bucketIndex ) { var this$1 = this; var key = this.featureIndexArray.length; this.featureIndexArray.emplaceBack(featureIndex, sourceLayerIndex, bucketIndex); for (var r = 0; r < geometry.length; r++) { var ring = geometry[r]; var bbox = [Infinity, Infinity, -Infinity, -Infinity]; for (var i = 0; i < ring.length; i++) { var p = ring[i]; bbox[0] = Math.min(bbox[0], p.x); bbox[1] = Math.min(bbox[1], p.y); bbox[2] = Math.max(bbox[2], p.x); bbox[3] = Math.max(bbox[3], p.y); } this$1.grid.insert(key, bbox[0], bbox[1], bbox[2], bbox[3]); } }; // Finds features in this tile at a particular position. FeatureIndex.prototype.query = function query (args , styleLayers ) { if (!this.vtLayers) { this.vtLayers = new vt.VectorTile(new Protobuf(this.rawTileData)).layers; this.sourceLayerCoder = new DictionaryCoder(this.vtLayers ? Object.keys(this.vtLayers).sort() : ['_geojsonTileLayer']); } var result = {}; var params = args.params || {}, pixelsToTileUnits = EXTENT / args.tileSize / args.scale, filter = featureFilter(params.filter); var queryGeometry = args.queryGeometry; var additionalRadius = args.additionalRadius * pixelsToTileUnits; var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; for (var i = 0; i < queryGeometry.length; i++) { var ring = queryGeometry[i]; for (var k = 0; k < ring.length; k++) { var p = ring[k]; minX = Math.min(minX, p.x); minY = Math.min(minY, p.y); maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y); } } var matching = this.grid.query(minX - additionalRadius, minY - additionalRadius, maxX + additionalRadius, maxY + additionalRadius); matching.sort(topDownFeatureComparator); this.filterMatching(result, matching, this.featureIndexArray, queryGeometry, filter, params.layers, styleLayers, args.bearing, pixelsToTileUnits); var matchingSymbols = args.collisionIndex ? args.collisionIndex.queryRenderedSymbols(queryGeometry, this.tileID, EXTENT / args.tileSize, args.collisionBoxArray, args.sourceID, args.bucketInstanceIds) : []; matchingSymbols.sort(); this.filterMatching(result, matchingSymbols, args.collisionBoxArray, queryGeometry, filter, params.layers, styleLayers, args.bearing, pixelsToTileUnits); return result; }; FeatureIndex.prototype.filterMatching = function filterMatching ( result , matching , array , queryGeometry , filter , filterLayerIDs , styleLayers , bearing , pixelsToTileUnits ) { var this$1 = this; var previousIndex; for (var k = 0; k < matching.length; k++) { var index = matching[k]; // don't check the same feature more than once if (index === previousIndex) { continue; } previousIndex = index; var match = array.get(index); var layerIDs = this$1.bucketLayerIDs[match.bucketIndex]; if (filterLayerIDs && !arraysIntersect(filterLayerIDs, layerIDs)) { continue; } var sourceLayerName = this$1.sourceLayerCoder.decode(match.sourceLayerIndex); var sourceLayer = this$1.vtLayers[sourceLayerName]; var feature = sourceLayer.feature(match.featureIndex); if (!filter({zoom: this$1.tileID.overscaledZ}, feature)) { continue; } var geometry = null; for (var l = 0; l < layerIDs.length; l++) { var layerID = layerIDs[l]; if (filterLayerIDs && filterLayerIDs.indexOf(layerID) < 0) { continue; } var styleLayer = styleLayers[layerID]; if (!styleLayer) { continue; } if (styleLayer.type !== 'symbol') { // all symbols already match the style if (!geometry) { geometry = loadGeometry(feature); } if (!styleLayer.queryIntersectsFeature(queryGeometry, feature, geometry, this$1.z, bearing, pixelsToTileUnits)) { continue; } } var geojsonFeature = new GeoJSONFeature(feature, this$1.z, this$1.x, this$1.y); (geojsonFeature ).layer = styleLayer.serialize(); var layerResult = result[layerID]; if (layerResult === undefined) { layerResult = result[layerID] = []; } layerResult.push({ featureIndex: index, feature: geojsonFeature }); } } }; FeatureIndex.prototype.hasLayer = function hasLayer (id ) { var this$1 = this; for (var i = 0, list = this$1.bucketLayerIDs; i < list.length; i += 1) { var layerIDs = list[i]; for (var i$1 = 0, list$1 = layerIDs; i$1 < list$1.length; i$1 += 1) { var layerID = list$1[i$1]; if (id === layerID) { return true; } } } return false; }; register( 'FeatureIndex', FeatureIndex, { omit: ['rawTileData', 'sourceLayerCoder'] } ); module.exports = FeatureIndex; function topDownFeatureComparator(a, b) { return b - a; } },{"../source/tile_id":119,"../style-spec/feature_filter":153,"../util/dictionary_coder":262,"../util/util":280,"../util/vectortile_to_geojson":281,"../util/web_worker_transfer":283,"./array_types":44,"./extent":58,"./load_geometry":61,"@mapbox/point-geometry":4,"@mapbox/vector-tile":8,"grid-index":25,"pbf":31}],60:[function(require,module,exports){ 'use strict';// /** * An index array stores Uint16 indicies of vertexes in a corresponding vertex array. We use * two kinds of index arrays: arrays storing groups of three indicies, forming triangles; and * arrays storing pairs of indicies, forming line segments. * @private */ module.exports = { LineIndexArray: require('./array_types').LineIndexArray, TriangleIndexArray: require('./array_types').TriangleIndexArray }; },{"./array_types":44}],61:[function(require,module,exports){ 'use strict';// var util = require('../util/util'); var EXTENT = require('./extent'); // These bounds define the minimum and maximum supported coordinate values. // While visible coordinates are within [0, EXTENT], tiles may theoretically // contain cordinates within [-Infinity, Infinity]. Our range is limited by the // number of bits used to represent the coordinate. function createBounds(bits) { return { min: -1 * Math.pow(2, bits - 1), max: Math.pow(2, bits - 1) - 1 }; } var bounds = createBounds(16); /** * Loads a geometry from a VectorTileFeature and scales it to the common extent * used internally. * @param {VectorTileFeature} feature * @private */ module.exports = function loadGeometry(feature ) { var scale = EXTENT / feature.extent; var geometry = feature.loadGeometry(); for (var r = 0; r < geometry.length; r++) { var ring = geometry[r]; for (var p = 0; p < ring.length; p++) { var point = ring[p]; // round here because mapbox-gl-native uses integers to represent // points and we need to do the same to avoid renering differences. point.x = Math.round(point.x * scale); point.y = Math.round(point.y * scale); if (point.x < bounds.min || point.x > bounds.max || point.y < bounds.min || point.y > bounds.max) { util.warnOnce('Geometry exceeds allowed extent, reduce your vector tile buffer size'); } } } return geometry; }; },{"../util/util":280,"./extent":58}],62:[function(require,module,exports){ 'use strict';// var ref = require('../util/struct_array'); var createLayout = ref.createLayout; module.exports = createLayout([ { name: 'a_pos', type: 'Int16', components: 2 } ]); },{"../util/struct_array":276}],63:[function(require,module,exports){ 'use strict';// var packUint8ToFloat = require('../shaders/encode_attribute').packUint8ToFloat; var Color = require('../style-spec/util/color'); var ref = require('../util/web_worker_transfer'); var register = ref.register; var ref$1 = require('../style/properties'); var PossiblyEvaluatedPropertyValue = ref$1.PossiblyEvaluatedPropertyValue; var ref$2 = require('./array_types'); var StructArrayLayout1f4 = ref$2.StructArrayLayout1f4; var StructArrayLayout2f8 = ref$2.StructArrayLayout2f8; var StructArrayLayout4f16 = ref$2.StructArrayLayout4f16; function packColor(color ) { return [ packUint8ToFloat(255 * color.r, 255 * color.g), packUint8ToFloat(255 * color.b, 255 * color.a) ]; } /** * `Binder` is the interface definition for the strategies for constructing, * uploading, and binding paint property data as GLSL attributes. * * It has three implementations, one for each of the three strategies we use: * * * For _constant_ properties -- those whose value is a constant, or the constant * result of evaluating a camera expression at a particular camera position -- we * don't need a vertex buffer, and instead use a uniform. * * For data expressions, we use a vertex buffer with a single attribute value, * the evaluated result of the source function for the given feature. * * For composite expressions, we use a vertex buffer with two attributes: min and * max values covering the range of zooms at which we expect the tile to be * displayed. These values are calculated by evaluating the composite expression for * the given feature at strategically chosen zoom levels. In addition to this * attribute data, we also use a uniform value which the shader uses to interpolate * between the min and max value at the final displayed zoom level. The use of a * uniform allows us to cheaply update the value on every frame. * * Note that the shader source varies depending on whether we're using a uniform or * attribute. We dynamically compile shaders at runtime to accomodate this. * * @private */ var ConstantBinder = function ConstantBinder(value , name , type ) { this.value = value; this.name = name; this.type = type; this.statistics = { max: -Infinity }; }; ConstantBinder.prototype.defines = function defines () { return [("#define HAS_UNIFORM_u_" + (this.name))]; }; ConstantBinder.prototype.populatePaintArray = function populatePaintArray () {}; ConstantBinder.prototype.upload = function upload () {}; ConstantBinder.prototype.destroy = function destroy () {}; ConstantBinder.prototype.setUniforms = function setUniforms (context , program , globals , currentValue ) { var value = currentValue.constantOr(this.value); var gl = context.gl; if (this.type === 'color') { gl.uniform4f(program.uniforms[("u_" + (this.name))], value.r, value.g, value.b, value.a); } else { gl.uniform1f(program.uniforms[("u_" + (this.name))], value); } }; var SourceExpressionBinder = function SourceExpressionBinder(expression , name , type ) { this.expression = expression; this.name = name; this.type = type; this.statistics = { max: -Infinity }; var PaintVertexArray = type === 'color' ? StructArrayLayout2f8 : StructArrayLayout1f4; this.paintVertexAttributes = [{ name: ("a_" + name), type: 'Float32', components: type === 'color' ? 2 : 1, offset: 0 }]; this.paintVertexArray = new PaintVertexArray(); }; SourceExpressionBinder.prototype.defines = function defines () { return []; }; SourceExpressionBinder.prototype.populatePaintArray = function populatePaintArray (length , feature ) { var paintArray = this.paintVertexArray; var start = paintArray.length; paintArray.reserve(length); var value = this.expression.evaluate({zoom: 0}, feature); if (this.type === 'color') { var color = packColor(value); for (var i = start; i < length; i++) { paintArray.emplaceBack(color[0], color[1]); } } else { for (var i$1 = start; i$1 < length; i$1++) { paintArray.emplaceBack(value); } this.statistics.max = Math.max(this.statistics.max, value); } }; SourceExpressionBinder.prototype.upload = function upload (context ) { if (this.paintVertexArray) { this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes); } }; SourceExpressionBinder.prototype.destroy = function destroy () { if (this.paintVertexBuffer) { this.paintVertexBuffer.destroy(); } }; SourceExpressionBinder.prototype.setUniforms = function setUniforms (context , program ) { context.gl.uniform1f(program.uniforms[("a_" + (this.name) + "_t")], 0); }; var CompositeExpressionBinder = function CompositeExpressionBinder(expression , name , type , useIntegerZoom , zoom ) { this.expression = expression; this.name = name; this.type = type; this.useIntegerZoom = useIntegerZoom; this.zoom = zoom; this.statistics = { max: -Infinity }; var PaintVertexArray = type === 'color' ? StructArrayLayout4f16 : StructArrayLayout2f8; this.paintVertexAttributes = [{ name: ("a_" + name), type: 'Float32', components: type === 'color' ? 4 : 2, offset: 0 }]; this.paintVertexArray = new PaintVertexArray(); }; CompositeExpressionBinder.prototype.defines = function defines () { return []; }; CompositeExpressionBinder.prototype.populatePaintArray = function populatePaintArray (length , feature ) { var paintArray = this.paintVertexArray; var start = paintArray.length; paintArray.reserve(length); var min = this.expression.evaluate({zoom: this.zoom}, feature); var max = this.expression.evaluate({zoom: this.zoom + 1}, feature); if (this.type === 'color') { var minColor = packColor(min); var maxColor = packColor(max); for (var i = start; i < length; i++) { paintArray.emplaceBack(minColor[0], minColor[1], maxColor[0], maxColor[1]); } } else { for (var i$1 = start; i$1 < length; i$1++) { paintArray.emplaceBack(min, max); } this.statistics.max = Math.max(this.statistics.max, min, max); } }; CompositeExpressionBinder.prototype.upload = function upload (context ) { if (this.paintVertexArray) { this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes); } }; CompositeExpressionBinder.prototype.destroy = function destroy () { if (this.paintVertexBuffer) { this.paintVertexBuffer.destroy(); } }; CompositeExpressionBinder.prototype.interpolationFactor = function interpolationFactor (currentZoom ) { if (this.useIntegerZoom) { return this.expression.interpolationFactor(Math.floor(currentZoom), this.zoom, this.zoom + 1); } else { return this.expression.interpolationFactor(currentZoom, this.zoom, this.zoom + 1); } }; CompositeExpressionBinder.prototype.setUniforms = function setUniforms (context , program , globals ) { context.gl.uniform1f(program.uniforms[("a_" + (this.name) + "_t")], this.interpolationFactor(globals.zoom)); }; /** * ProgramConfiguration contains the logic for binding style layer properties and tile * layer feature data into GL program uniforms and vertex attributes. * * Non-data-driven property values are bound to shader uniforms. Data-driven property * values are bound to vertex attributes. In order to support a uniform GLSL syntax over * both, [Mapbox GL Shaders](https://github.com/mapbox/mapbox-gl-shaders) defines a `#pragma` * abstraction, which ProgramConfiguration is responsible for implementing. At runtime, * it examines the attributes of a particular layer, combines this with fixed knowledge * about how layers of the particular type are implemented, and determines which uniforms * and vertex attributes will be required. It can then substitute the appropriate text * into the shader source code, create and link a program, and bind the uniforms and * vertex attributes in preparation for drawing. * * When a vector tile is parsed, this same configuration information is used to * populate the attribute buffers needed for data-driven styling using the zoom * level and feature property data. * * @private */ var ProgramConfiguration = function ProgramConfiguration() { this.binders = {}; this.cacheKey = ''; this._buffers = []; }; ProgramConfiguration.createDynamic = function createDynamic (layer , zoom , filterProperties ) { var self = new ProgramConfiguration(); var keys = []; for (var property in layer.paint._values) { if (!filterProperties(property)) { continue; } var value = layer.paint.get(property); if (!(value instanceof PossiblyEvaluatedPropertyValue) || !value.property.specification['property-function']) { continue; } var name = paintAttributeName(property, layer.type); var type = value.property.specification.type; var useIntegerZoom = value.property.useIntegerZoom; if (value.value.kind === 'constant') { self.binders[property] = new ConstantBinder(value.value, name, type); keys.push(("/u_" + name)); } else if (value.value.kind === 'source') { self.binders[property] = new SourceExpressionBinder(value.value, name, type); keys.push(("/a_" + name)); } else { self.binders[property] = new CompositeExpressionBinder(value.value, name, type, useIntegerZoom, zoom); keys.push(("/z_" + name)); } } self.cacheKey = keys.sort().join(''); return self; }; ProgramConfiguration.prototype.populatePaintArrays = function populatePaintArrays (length , feature ) { var this$1 = this; for (var property in this$1.binders) { this$1.binders[property].populatePaintArray(length, feature); } }; ProgramConfiguration.prototype.defines = function defines () { var this$1 = this; var result = []; for (var property in this$1.binders) { result.push.apply(result, this$1.binders[property].defines()); } return result; }; ProgramConfiguration.prototype.setUniforms = function setUniforms (context , program , properties , globals ) { var this$1 = this; for (var property in this$1.binders) { var binder = this$1.binders[property]; binder.setUniforms(context, program, globals, properties.get(property)); } }; ProgramConfiguration.prototype.getPaintVertexBuffers = function getPaintVertexBuffers () { return this._buffers; }; ProgramConfiguration.prototype.upload = function upload (context ) { var this$1 = this; for (var property in this$1.binders) { this$1.binders[property].upload(context); } var buffers = []; for (var property$1 in this$1.binders) { var binder = this$1.binders[property$1]; if ((binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder) && binder.paintVertexBuffer ) { buffers.push(binder.paintVertexBuffer); } } this._buffers = buffers; }; ProgramConfiguration.prototype.destroy = function destroy () { var this$1 = this; for (var property in this$1.binders) { this$1.binders[property].destroy(); } }; var ProgramConfigurationSet = function ProgramConfigurationSet(layoutAttributes , layers , zoom , filterProperties) { var this$1 = this; if ( filterProperties === void 0 ) filterProperties = function () { return true; }; this.programConfigurations = {}; for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; this$1.programConfigurations[layer.id] = ProgramConfiguration.createDynamic(layer, zoom, filterProperties); this$1.programConfigurations[layer.id].layoutAttributes = layoutAttributes; } }; ProgramConfigurationSet.prototype.populatePaintArrays = function populatePaintArrays (length , feature ) { var this$1 = this; for (var key in this$1.programConfigurations) { this$1.programConfigurations[key].populatePaintArrays(length, feature); } }; ProgramConfigurationSet.prototype.get = function get (layerId ) { return this.programConfigurations[layerId]; }; ProgramConfigurationSet.prototype.upload = function upload (context ) { var this$1 = this; for (var layerId in this$1.programConfigurations) { this$1.programConfigurations[layerId].upload(context); } }; ProgramConfigurationSet.prototype.destroy = function destroy () { var this$1 = this; for (var layerId in this$1.programConfigurations) { this$1.programConfigurations[layerId].destroy(); } }; // paint property arrays function paintAttributeName(property, type) { var attributeNameExceptions = { 'text-opacity': 'opacity', 'icon-opacity': 'opacity', 'text-color': 'fill_color', 'icon-color': 'fill_color', 'text-halo-color': 'halo_color', 'icon-halo-color': 'halo_color', 'text-halo-blur': 'halo_blur', 'icon-halo-blur': 'halo_blur', 'text-halo-width': 'halo_width', 'icon-halo-width': 'halo_width', 'line-gap-width': 'gapwidth' }; return attributeNameExceptions[property] || property.replace((type + "-"), '').replace(/-/g, '_'); } register('ConstantBinder', ConstantBinder); register('SourceExpressionBinder', SourceExpressionBinder); register('CompositeExpressionBinder', CompositeExpressionBinder); register('ProgramConfiguration', ProgramConfiguration, {omit: ['_buffers']}); register('ProgramConfigurationSet', ProgramConfigurationSet); module.exports = { ProgramConfiguration: ProgramConfiguration, ProgramConfigurationSet: ProgramConfigurationSet }; },{"../shaders/encode_attribute":101,"../style-spec/util/color":158,"../style/properties":193,"../util/web_worker_transfer":283,"./array_types":44}],64:[function(require,module,exports){ 'use strict';// var ref = require('../util/struct_array'); var createLayout = ref.createLayout; module.exports = createLayout([ { name: 'a_pos', type: 'Int16', components: 2 }, { name: 'a_texture_pos', type: 'Int16', components: 2 } ]); },{"../util/struct_array":276}],65:[function(require,module,exports){ 'use strict';// var ref = require('../util/util'); var warnOnce = ref.warnOnce; var ref$1 = require('../util/web_worker_transfer'); var register = ref$1.register; var MAX_VERTEX_ARRAY_LENGTH = Math.pow(2, 16) - 1; var SegmentVector = function SegmentVector(segments) { if ( segments === void 0 ) segments = []; this.segments = segments; }; SegmentVector.prototype.prepareSegment = function prepareSegment (numVertices , layoutVertexArray , indexArray ) { var segment = this.segments[this.segments.length - 1]; if (numVertices > MAX_VERTEX_ARRAY_LENGTH) { warnOnce(("Max vertices per segment is " + MAX_VERTEX_ARRAY_LENGTH + ": bucket requested " + numVertices)); } if (!segment || segment.vertexLength + numVertices > module.exports.MAX_VERTEX_ARRAY_LENGTH) { segment = ({ vertexOffset: layoutVertexArray.length, primitiveOffset: indexArray.length, vertexLength: 0, primitiveLength: 0 } ); this.segments.push(segment); } return segment; }; SegmentVector.prototype.get = function get () { return this.segments; }; SegmentVector.prototype.destroy = function destroy () { var this$1 = this; for (var i = 0, list = this$1.segments; i < list.length; i += 1) { var segment = list[i]; for (var k in segment.vaos) { segment.vaos[k].destroy(); } } }; register('SegmentVector', SegmentVector); module.exports = { SegmentVector: SegmentVector, /** * The maximum size of a vertex array. This limit is imposed by WebGL's 16 bit * addressing of vertex buffers. * @private * @readonly */ MAX_VERTEX_ARRAY_LENGTH: MAX_VERTEX_ARRAY_LENGTH }; },{"../util/util":280,"../util/web_worker_transfer":283}],66:[function(require,module,exports){ 'use strict';// /** * A coordinate is a column, row, zoom combination, often used * as the data component of a tile. * * @param {number} column * @param {number} row * @param {number} zoom * @private */ var Coordinate = function Coordinate(column , row , zoom ) { this.column = column; this.row = row; this.zoom = zoom; }; /** * Create a clone of this coordinate that can be mutated without * changing the original coordinate * * @returns {Coordinate} clone * @private * var coord = new Coordinate(0, 0, 0); * var c2 = coord.clone(); * // since coord is cloned, modifying a property of c2 does * // not modify it. * c2.zoom = 2; */ Coordinate.prototype.clone = function clone () { return new Coordinate(this.column, this.row, this.zoom); }; /** * Zoom this coordinate to a given zoom level. This returns a new * coordinate object, not mutating the old one. * * @param {number} zoom * @returns {Coordinate} zoomed coordinate * @private * @example * var coord = new Coordinate(0, 0, 0); * var c2 = coord.zoomTo(1); * c2 // equals new Coordinate(0, 0, 1); */ Coordinate.prototype.zoomTo = function zoomTo (zoom ) { return this.clone()._zoomTo(zoom); }; /** * Subtract the column and row values of this coordinate from those * of another coordinate. The other coordinat will be zoomed to the * same level as `this` before the subtraction occurs * * @param {Coordinate} c other coordinate * @returns {Coordinate} result * @private */ Coordinate.prototype.sub = function sub (c ) { return this.clone()._sub(c); }; Coordinate.prototype._zoomTo = function _zoomTo (zoom ) { var scale = Math.pow(2, zoom - this.zoom); this.column *= scale; this.row *= scale; this.zoom = zoom; return this; }; Coordinate.prototype._sub = function _sub (c ) { c = c.zoomTo(this.zoom); this.column -= c.column; this.row -= c.row; return this; }; module.exports = Coordinate; },{}],67:[function(require,module,exports){ 'use strict';// var wrap = require('../util/util').wrap; /** * A `LngLat` object represents a given longitude and latitude coordinate, measured in degrees. * * Mapbox GL uses longitude, latitude coordinate order (as opposed to latitude, longitude) to match GeoJSON. * * Note that any Mapbox GL method that accepts a `LngLat` object as an argument or option * can also accept an `Array` of two numbers and will perform an implicit conversion. * This flexible type is documented as {@link LngLatLike}. * * @param {number} lng Longitude, measured in degrees. * @param {number} lat Latitude, measured in degrees. * @example * var ll = new mapboxgl.LngLat(-73.9749, 40.7736); * @see [Get coordinates of the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/mouse-position/) * @see [Display a popup](https://www.mapbox.com/mapbox-gl-js/example/popup/) * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) * @see [Create a timeline animation](https://www.mapbox.com/mapbox-gl-js/example/timeline-animation/) */ var LngLat = function LngLat(lng , lat ) { if (isNaN(lng) || isNaN(lat)) { throw new Error(("Invalid LngLat object: (" + lng + ", " + lat + ")")); } this.lng = +lng; this.lat = +lat; if (this.lat > 90 || this.lat < -90) { throw new Error('Invalid LngLat latitude value: must be between -90 and 90'); } }; /** * Returns a new `LngLat` object whose longitude is wrapped to the range (-180, 180). * * @returns {LngLat} The wrapped `LngLat` object. * @example * var ll = new mapboxgl.LngLat(286.0251, 40.7736); * var wrapped = ll.wrap(); * wrapped.lng; // = -73.9749 */ LngLat.prototype.wrap = function wrap$1 () { return new LngLat(wrap(this.lng, -180, 180), this.lat); }; /** * Returns the coordinates represented as an array of two numbers. * * @returns {Array} The coordinates represeted as an array of longitude and latitude. * @example * var ll = new mapboxgl.LngLat(-73.9749, 40.7736); * ll.toArray(); // = [-73.9749, 40.7736] */ LngLat.prototype.toArray = function toArray () { return [this.lng, this.lat]; }; /** * Returns the coordinates represent as a string. * * @returns {string} The coordinates represented as a string of the format `'LngLat(lng, lat)'`. * @example * var ll = new mapboxgl.LngLat(-73.9749, 40.7736); * ll.toString(); // = "LngLat(-73.9749, 40.7736)" */ LngLat.prototype.toString = function toString () { return ("LngLat(" + (this.lng) + ", " + (this.lat) + ")"); }; /** * Returns a `LngLatBounds` from the coordinates extended by a given `radius`. * * @param {number} radius Distance in meters from the coordinates to extend the bounds. * @returns {LngLatBounds} A new `LngLatBounds` object representing the coordinates extended by the `radius`. * @example * var ll = new mapboxgl.LngLat(-73.9749, 40.7736); * ll.toBounds(100).toArray(); // = [[-73.97501862141328, 40.77351016847229], [-73.97478137858673, 40.77368983152771]] */ LngLat.prototype.toBounds = function toBounds (radius ) { var earthCircumferenceInMetersAtEquator = 40075017; var latAccuracy = 360 * radius / earthCircumferenceInMetersAtEquator, lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat); var LngLatBounds = require('./lng_lat_bounds'); return new LngLatBounds(new LngLat(this.lng - lngAccuracy, this.lat - latAccuracy), new LngLat(this.lng + lngAccuracy, this.lat + latAccuracy)); }; /** * Converts an array of two numbers to a `LngLat` object. * * If a `LngLat` object is passed in, the function returns it unchanged. * * @param {LngLatLike} input An array of two numbers to convert, or a `LngLat` object to return. * @returns {LngLat} A new `LngLat` object, if a conversion occurred, or the original `LngLat` object. * @example * var arr = [-73.9749, 40.7736]; * var ll = mapboxgl.LngLat.convert(arr); * ll; // = LngLat {lng: -73.9749, lat: 40.7736} */ LngLat.convert = function convert (input ) { if (input instanceof LngLat) { return input; } if (Array.isArray(input) && (input.length === 2 || input.length === 3)) { return new LngLat(Number(input[0]), Number(input[1])); } if (!Array.isArray(input) && typeof input === 'object' && input !== null) { return new LngLat(Number(input.lng), Number(input.lat)); } throw new Error("`LngLatLike` argument must be specified as a LngLat instance, an object {lng: , lat: }, or an array of [, ]"); }; /** * A {@link LngLat} object, an array of two numbers representing longitude and latitude, * or an object with `lng` and `lat` properties. * * @typedef {LngLat | {lng: number, lat: number} | [number, number]} LngLatLike * @example * var v1 = new mapboxgl.LngLat(-122.420679, 37.772537); * var v2 = [-122.420679, 37.772537]; */ module.exports = LngLat; },{"../util/util":280,"./lng_lat_bounds":68}],68:[function(require,module,exports){ 'use strict';// var LngLat = require('./lng_lat'); /** * A `LngLatBounds` object represents a geographical bounding box, * defined by its southwest and northeast points in longitude and latitude. * * If no arguments are provided to the constructor, a `null` bounding box is created. * * Note that any Mapbox GL method that accepts a `LngLatBounds` object as an argument or option * can also accept an `Array` of two {@link LngLatLike} constructs and will perform an implicit conversion. * This flexible type is documented as {@link LngLatBoundsLike}. * * @param {LngLatLike} [sw] The southwest corner of the bounding box. * @param {LngLatLike} [ne] The northeast corner of the bounding box. * @example * var sw = new mapboxgl.LngLat(-73.9876, 40.7661); * var ne = new mapboxgl.LngLat(-73.9397, 40.8002); * var llb = new mapboxgl.LngLatBounds(sw, ne); */ var LngLatBounds = function LngLatBounds(sw , ne ) { if (!sw) { return; } else if (ne) { this.setSouthWest(sw).setNorthEast(ne); } else if (sw.length === 4) { this.setSouthWest([sw[0], sw[1]]).setNorthEast([sw[2], sw[3]]); } else { this.setSouthWest(sw[0]).setNorthEast(sw[1]); } }; /** * Set the northeast corner of the bounding box * * @param {LngLatLike} ne * @returns {LngLatBounds} `this` */ LngLatBounds.prototype.setNorthEast = function setNorthEast (ne ) { this._ne = ne instanceof LngLat ? new LngLat(ne.lng, ne.lat) : LngLat.convert(ne); return this; }; /** * Set the southwest corner of the bounding box * * @param {LngLatLike} sw * @returns {LngLatBounds} `this` */ LngLatBounds.prototype.setSouthWest = function setSouthWest (sw ) { this._sw = sw instanceof LngLat ? new LngLat(sw.lng, sw.lat) : LngLat.convert(sw); return this; }; /** * Extend the bounds to include a given LngLat or LngLatBounds. * * @param {LngLat|LngLatBounds} obj object to extend to * @returns {LngLatBounds} `this` */ LngLatBounds.prototype.extend = function extend (obj) { var sw = this._sw, ne = this._ne; var sw2, ne2; if (obj instanceof LngLat) { sw2 = obj; ne2 = obj; } else if (obj instanceof LngLatBounds) { sw2 = obj._sw; ne2 = obj._ne; if (!sw2 || !ne2) { return this; } } else { if (Array.isArray(obj)) { if (obj.every(Array.isArray)) { return this.extend(LngLatBounds.convert(obj)); } else { return this.extend(LngLat.convert(obj)); } } return this; } if (!sw && !ne) { this._sw = new LngLat(sw2.lng, sw2.lat); this._ne = new LngLat(ne2.lng, ne2.lat); } else { sw.lng = Math.min(sw2.lng, sw.lng); sw.lat = Math.min(sw2.lat, sw.lat); ne.lng = Math.max(ne2.lng, ne.lng); ne.lat = Math.max(ne2.lat, ne.lat); } return this; }; /** * Returns the geographical coordinate equidistant from the bounding box's corners. * * @returns {LngLat} The bounding box's center. * @example * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); * llb.getCenter(); // = LngLat {lng: -73.96365, lat: 40.78315} */ LngLatBounds.prototype.getCenter = function getCenter () { return new LngLat((this._sw.lng + this._ne.lng) / 2, (this._sw.lat + this._ne.lat) / 2); }; /** * Returns the southwest corner of the bounding box. * * @returns {LngLat} The southwest corner of the bounding box. */ LngLatBounds.prototype.getSouthWest = function getSouthWest () { return this._sw; }; /** * Returns the northeast corner of the bounding box. * * @returns {LngLat} The northeast corner of the bounding box. */ LngLatBounds.prototype.getNorthEast = function getNorthEast () { return this._ne; }; /** * Returns the northwest corner of the bounding box. * * @returns {LngLat} The northwest corner of the bounding box. */ LngLatBounds.prototype.getNorthWest = function getNorthWest () { return new LngLat(this.getWest(), this.getNorth()); }; /** * Returns the southeast corner of the bounding box. * * @returns {LngLat} The southeast corner of the bounding box. */ LngLatBounds.prototype.getSouthEast = function getSouthEast () { return new LngLat(this.getEast(), this.getSouth()); }; /** * Returns the west edge of the bounding box. * * @returns {number} The west edge of the bounding box. */ LngLatBounds.prototype.getWest = function getWest () { return this._sw.lng; }; /** * Returns the south edge of the bounding box. * * @returns {number} The south edge of the bounding box. */ LngLatBounds.prototype.getSouth = function getSouth () { return this._sw.lat; }; /** * Returns the east edge of the bounding box. * * @returns {number} The east edge of the bounding box. */ LngLatBounds.prototype.getEast = function getEast () { return this._ne.lng; }; /** * Returns the north edge of the bounding box. * * @returns {number} The north edge of the bounding box. */ LngLatBounds.prototype.getNorth = function getNorth () { return this._ne.lat; }; /** * Returns the bounding box represented as an array. * * @returns {Array>} The bounding box represented as an array, consisting of the * southwest and northeast coordinates of the bounding represented as arrays of numbers. * @example * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); * llb.toArray(); // = [[-73.9876, 40.7661], [-73.9397, 40.8002]] */ LngLatBounds.prototype.toArray = function toArray () { return [this._sw.toArray(), this._ne.toArray()]; }; /** * Return the bounding box represented as a string. * * @returns {string} The bounding box represents as a string of the format * `'LngLatBounds(LngLat(lng, lat), LngLat(lng, lat))'`. * @example * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); * llb.toString(); // = "LngLatBounds(LngLat(-73.9876, 40.7661), LngLat(-73.9397, 40.8002))" */ LngLatBounds.prototype.toString = function toString () { return ("LngLatBounds(" + (this._sw.toString()) + ", " + (this._ne.toString()) + ")"); }; /** * Check if the bounding box is an empty/`null`-type box. * * @returns {boolean} True if bounds have been defined, otherwise false. */ LngLatBounds.prototype.isEmpty = function isEmpty () { return !(this._sw && this._ne); }; /** * Converts an array to a `LngLatBounds` object. * * If a `LngLatBounds` object is passed in, the function returns it unchanged. * * Internally, the function calls `LngLat#convert` to convert arrays to `LngLat` values. * * @param {LngLatBoundsLike} input An array of two coordinates to convert, or a `LngLatBounds` object to return. * @returns {LngLatBounds} A new `LngLatBounds` object, if a conversion occurred, or the original `LngLatBounds` object. * @example * var arr = [[-73.9876, 40.7661], [-73.9397, 40.8002]]; * var llb = mapboxgl.LngLatBounds.convert(arr); * llb; // = LngLatBounds {_sw: LngLat {lng: -73.9876, lat: 40.7661}, _ne: LngLat {lng: -73.9397, lat: 40.8002}} */ LngLatBounds.convert = function convert (input ) { if (!input || input instanceof LngLatBounds) { return input; } return new LngLatBounds(input); }; /** * A {@link LngLatBounds} object, an array of {@link LngLatLike} objects in [sw, ne] order, * or an array of numbers in [west, south, east, north] order. * * @typedef {LngLatBounds | [LngLatLike, LngLatLike] | [number, number, number, number]} LngLatBoundsLike * @example * var v1 = new mapboxgl.LngLatBounds( * new mapboxgl.LngLat(-73.9876, 40.7661), * new mapboxgl.LngLat(-73.9397, 40.8002) * ); * var v2 = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]) * var v3 = [[-73.9876, 40.7661], [-73.9397, 40.8002]]; */ module.exports = LngLatBounds; },{"./lng_lat":67}],69:[function(require,module,exports){ 'use strict';// var LngLat = require('./lng_lat'), Point = require('@mapbox/point-geometry'), Coordinate = require('./coordinate'), util = require('../util/util'), interp = require('../style-spec/util/interpolate').number, tileCover = require('../util/tile_cover'); var ref = require('../source/tile_id'); var CanonicalTileID = ref.CanonicalTileID; var UnwrappedTileID = ref.UnwrappedTileID; var EXTENT = require('../data/extent'), glmatrix = require('@mapbox/gl-matrix'); var vec4 = glmatrix.vec4, mat4 = glmatrix.mat4, mat2 = glmatrix.mat2; /** * A single transform, generally used for a single tile to be * scaled, rotated, and zoomed. * @private */ var Transform = function Transform(minZoom , maxZoom , renderWorldCopies ) { this.tileSize = 512; // constant this._renderWorldCopies = renderWorldCopies === undefined ? true : renderWorldCopies; this._minZoom = minZoom || 0; this._maxZoom = maxZoom || 22; this.latRange = [-85.05113, 85.05113]; this.width = 0; this.height = 0; this._center = new LngLat(0, 0); this.zoom = 0; this.angle = 0; this._fov = 0.6435011087932844; this._pitch = 0; this._unmodified = true; this._posMatrixCache = {}; this._alignedPosMatrixCache = {}; }; var prototypeAccessors = { minZoom: {},maxZoom: {},renderWorldCopies: {},worldSize: {},centerPoint: {},size: {},bearing: {},pitch: {},fov: {},zoom: {},center: {},unmodified: {},x: {},y: {},point: {} }; Transform.prototype.clone = function clone () { var clone = new Transform(this._minZoom, this._maxZoom, this._renderWorldCopies); clone.tileSize = this.tileSize; clone.latRange = this.latRange; clone.width = this.width; clone.height = this.height; clone._center = this._center; clone.zoom = this.zoom; clone.angle = this.angle; clone._fov = this._fov; clone._pitch = this._pitch; clone._unmodified = this._unmodified; clone._calcMatrices(); return clone; }; prototypeAccessors.minZoom.get = function () { return this._minZoom; }; prototypeAccessors.minZoom.set = function (zoom ) { if (this._minZoom === zoom) { return; } this._minZoom = zoom; this.zoom = Math.max(this.zoom, zoom); }; prototypeAccessors.maxZoom.get = function () { return this._maxZoom; }; prototypeAccessors.maxZoom.set = function (zoom ) { if (this._maxZoom === zoom) { return; } this._maxZoom = zoom; this.zoom = Math.min(this.zoom, zoom); }; prototypeAccessors.renderWorldCopies.get = function () { return this._renderWorldCopies; }; prototypeAccessors.worldSize.get = function () { return this.tileSize * this.scale; }; prototypeAccessors.centerPoint.get = function () { return this.size._div(2); }; prototypeAccessors.size.get = function () { return new Point(this.width, this.height); }; prototypeAccessors.bearing.get = function () { return -this.angle / Math.PI * 180; }; prototypeAccessors.bearing.set = function (bearing ) { var b = -util.wrap(bearing, -180, 180) * Math.PI / 180; if (this.angle === b) { return; } this._unmodified = false; this.angle = b; this._calcMatrices(); // 2x2 matrix for rotating points this.rotationMatrix = mat2.create(); mat2.rotate(this.rotationMatrix, this.rotationMatrix, this.angle); }; prototypeAccessors.pitch.get = function () { return this._pitch / Math.PI * 180; }; prototypeAccessors.pitch.set = function (pitch ) { var p = util.clamp(pitch, 0, 60) / 180 * Math.PI; if (this._pitch === p) { return; } this._unmodified = false; this._pitch = p; this._calcMatrices(); }; prototypeAccessors.fov.get = function () { return this._fov / Math.PI * 180; }; prototypeAccessors.fov.set = function (fov ) { fov = Math.max(0.01, Math.min(60, fov)); if (this._fov === fov) { return; } this._unmodified = false; this._fov = fov / 180 * Math.PI; this._calcMatrices(); }; prototypeAccessors.zoom.get = function () { return this._zoom; }; prototypeAccessors.zoom.set = function (zoom ) { var z = Math.min(Math.max(zoom, this.minZoom), this.maxZoom); if (this._zoom === z) { return; } this._unmodified = false; this._zoom = z; this.scale = this.zoomScale(z); this.tileZoom = Math.floor(z); this.zoomFraction = z - this.tileZoom; this._constrain(); this._calcMatrices(); }; prototypeAccessors.center.get = function () { return this._center; }; prototypeAccessors.center.set = function (center ) { if (center.lat === this._center.lat && center.lng === this._center.lng) { return; } this._unmodified = false; this._center = center; this._constrain(); this._calcMatrices(); }; /** * Return a zoom level that will cover all tiles the transform * @param {Object} options * @param {number} options.tileSize * @param {boolean} options.roundZoom * @returns {number} zoom level */ Transform.prototype.coveringZoomLevel = function coveringZoomLevel (options ) { return (options.roundZoom ? Math.round : Math.floor)( this.zoom + this.scaleZoom(this.tileSize / options.tileSize) ); }; /** * Return any "wrapped" copies of a given tile coordinate that are visible * in the current view. * * @private */ Transform.prototype.getVisibleUnwrappedCoordinates = function getVisibleUnwrappedCoordinates (tileID ) { var ul = this.pointCoordinate(new Point(0, 0), 0); var ur = this.pointCoordinate(new Point(this.width, 0), 0); var w0 = Math.floor(ul.column); var w1 = Math.floor(ur.column); var result = [new UnwrappedTileID(0, tileID)]; if (this._renderWorldCopies) { for (var w = w0; w <= w1; w++) { if (w === 0) { continue; } result.push(new UnwrappedTileID(w, tileID)); } } return result; }; /** * Return all coordinates that could cover this transform for a covering * zoom level. * @param {Object} options * @param {number} options.tileSize * @param {number} options.minzoom * @param {number} options.maxzoom * @param {boolean} options.roundZoom * @param {boolean} options.reparseOverscaled * @param {boolean} options.renderWorldCopies * @returns {Array} tiles */ Transform.prototype.coveringTiles = function coveringTiles ( options ) { var z = this.coveringZoomLevel(options); var actualZ = z; if (options.minzoom !== undefined && z < options.minzoom) { return []; } if (options.maxzoom !== undefined && z > options.maxzoom) { z = options.maxzoom; } var centerCoord = this.pointCoordinate(this.centerPoint, z); var centerPoint = new Point(centerCoord.column - 0.5, centerCoord.row - 0.5); var cornerCoords = [ this.pointCoordinate(new Point(0, 0), z), this.pointCoordinate(new Point(this.width, 0), z), this.pointCoordinate(new Point(this.width, this.height), z), this.pointCoordinate(new Point(0, this.height), z) ]; return tileCover(z, cornerCoords, options.reparseOverscaled ? actualZ : z, this._renderWorldCopies) .sort(function (a, b) { return centerPoint.dist(a.canonical) - centerPoint.dist(b.canonical); }); }; Transform.prototype.resize = function resize (width , height ) { this.width = width; this.height = height; this.pixelsToGLUnits = [2 / width, -2 / height]; this._constrain(); this._calcMatrices(); }; prototypeAccessors.unmodified.get = function () { return this._unmodified; }; Transform.prototype.zoomScale = function zoomScale (zoom ) { return Math.pow(2, zoom); }; Transform.prototype.scaleZoom = function scaleZoom (scale ) { return Math.log(scale) / Math.LN2; }; Transform.prototype.project = function project (lnglat ) { return new Point( this.lngX(lnglat.lng), this.latY(lnglat.lat)); }; Transform.prototype.unproject = function unproject (point) { return new LngLat( this.xLng(point.x), this.yLat(point.y)); }; prototypeAccessors.x.get = function () { return this.lngX(this.center.lng); }; prototypeAccessors.y.get = function () { return this.latY(this.center.lat); }; prototypeAccessors.point.get = function () { return new Point(this.x, this.y); }; /** * latitude to absolute x coord * @returns {number} pixel coordinate */ Transform.prototype.lngX = function lngX (lng ) { return (180 + lng) * this.worldSize / 360; }; /** * latitude to absolute y coord * @returns {number} pixel coordinate */ Transform.prototype.latY = function latY (lat ) { var y = 180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)); return (180 - y) * this.worldSize / 360; }; Transform.prototype.xLng = function xLng (x) { return x * 360 / this.worldSize - 180; }; Transform.prototype.yLat = function yLat (y) { var y2 = 180 - y * 360 / this.worldSize; return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90; }; Transform.prototype.setLocationAtPoint = function setLocationAtPoint (lnglat , point ) { var translate = this.pointCoordinate(point)._sub(this.pointCoordinate(this.centerPoint)); this.center = this.coordinateLocation(this.locationCoordinate(lnglat)._sub(translate)); if (this._renderWorldCopies) { this.center = this.center.wrap(); } }; /** * Given a location, return the screen point that corresponds to it * @param {LngLat} lnglat location * @returns {Point} screen point */ Transform.prototype.locationPoint = function locationPoint (lnglat ) { return this.coordinatePoint(this.locationCoordinate(lnglat)); }; /** * Given a point on screen, return its lnglat * @param {Point} p screen point * @returns {LngLat} lnglat location */ Transform.prototype.pointLocation = function pointLocation (p ) { return this.coordinateLocation(this.pointCoordinate(p)); }; /** * Given a geographical lnglat, return an unrounded * coordinate that represents it at this transform's zoom level. * @param {LngLat} lnglat * @returns {Coordinate} */ Transform.prototype.locationCoordinate = function locationCoordinate (lnglat ) { return new Coordinate( this.lngX(lnglat.lng) / this.tileSize, this.latY(lnglat.lat) / this.tileSize, this.zoom).zoomTo(this.tileZoom); }; /** * Given a Coordinate, return its geographical position. * @param {Coordinate} coord * @returns {LngLat} lnglat */ Transform.prototype.coordinateLocation = function coordinateLocation (coord) { var zoomedCoord = coord.zoomTo(this.zoom); return new LngLat( this.xLng(zoomedCoord.column * this.tileSize), this.yLat(zoomedCoord.row * this.tileSize)); }; Transform.prototype.pointCoordinate = function pointCoordinate (p , zoom ) { if (zoom === undefined) { zoom = this.tileZoom; } var targetZ = 0; // since we don't know the correct projected z value for the point, // unproject two points to get a line and then find the point on that // line with z=0 var coord0 = [p.x, p.y, 0, 1]; var coord1 = [p.x, p.y, 1, 1]; vec4.transformMat4(coord0, coord0, this.pixelMatrixInverse); vec4.transformMat4(coord1, coord1, this.pixelMatrixInverse); var w0 = coord0[3]; var w1 = coord1[3]; var x0 = coord0[0] / w0; var x1 = coord1[0] / w1; var y0 = coord0[1] / w0; var y1 = coord1[1] / w1; var z0 = coord0[2] / w0; var z1 = coord1[2] / w1; var t = z0 === z1 ? 0 : (targetZ - z0) / (z1 - z0); return new Coordinate( interp(x0, x1, t) / this.tileSize, interp(y0, y1, t) / this.tileSize, this.zoom)._zoomTo(zoom); }; /** * Given a coordinate, return the screen point that corresponds to it * @param {Coordinate} coord * @returns {Point} screen point */ Transform.prototype.coordinatePoint = function coordinatePoint (coord) { var zoomedCoord = coord.zoomTo(this.zoom); var p = [zoomedCoord.column * this.tileSize, zoomedCoord.row * this.tileSize, 0, 1]; vec4.transformMat4(p, p, this.pixelMatrix); return new Point(p[0] / p[3], p[1] / p[3]); }; /** * Calculate the posMatrix that, given a tile coordinate, would be used to display the tile on a map. * @param {UnwrappedTileID} unwrappedTileID; */ Transform.prototype.calculatePosMatrix = function calculatePosMatrix (unwrappedTileID , aligned) { if ( aligned === void 0 ) aligned = false; var posMatrixKey = unwrappedTileID.key; var cache = aligned ? this._alignedPosMatrixCache : this._posMatrixCache; if (cache[posMatrixKey]) { return cache[posMatrixKey]; } var canonical = unwrappedTileID.canonical; var scale = this.worldSize / this.zoomScale(canonical.z); var unwrappedX = canonical.x + Math.pow(2, canonical.z) * unwrappedTileID.wrap; var posMatrix = mat4.identity(new Float64Array(16)); mat4.translate(posMatrix, posMatrix, [unwrappedX * scale, canonical.y * scale, 0]); mat4.scale(posMatrix, posMatrix, [scale / EXTENT, scale / EXTENT, 1]); mat4.multiply(posMatrix, aligned ? this.alignedProjMatrix : this.projMatrix, posMatrix); cache[posMatrixKey] = new Float32Array(posMatrix); return cache[posMatrixKey]; }; Transform.prototype._constrain = function _constrain () { if (!this.center || !this.width || !this.height || this._constraining) { return; } this._constraining = true; var minY = -90; var maxY = 90; var minX = -180; var maxX = 180; var sy, sx, x2, y2; var size = this.size, unmodified = this._unmodified; if (this.latRange) { var latRange = this.latRange; minY = this.latY(latRange[1]); maxY = this.latY(latRange[0]); sy = maxY - minY < size.y ? size.y / (maxY - minY) : 0; } if (this.lngRange) { var lngRange = this.lngRange; minX = this.lngX(lngRange[0]); maxX = this.lngX(lngRange[1]); sx = maxX - minX < size.x ? size.x / (maxX - minX) : 0; } // how much the map should scale to fit the screen into given latitude/longitude ranges var s = Math.max(sx || 0, sy || 0); if (s) { this.center = this.unproject(new Point( sx ? (maxX + minX) / 2 : this.x, sy ? (maxY + minY) / 2 : this.y)); this.zoom += this.scaleZoom(s); this._unmodified = unmodified; this._constraining = false; return; } if (this.latRange) { var y = this.y, h2 = size.y / 2; if (y - h2 < minY) { y2 = minY + h2; } if (y + h2 > maxY) { y2 = maxY - h2; } } if (this.lngRange) { var x = this.x, w2 = size.x / 2; if (x - w2 < minX) { x2 = minX + w2; } if (x + w2 > maxX) { x2 = maxX - w2; } } // pan the map if the screen goes off the range if (x2 !== undefined || y2 !== undefined) { this.center = this.unproject(new Point( x2 !== undefined ? x2 : this.x, y2 !== undefined ? y2 : this.y)); } this._unmodified = unmodified; this._constraining = false; }; Transform.prototype._calcMatrices = function _calcMatrices () { if (!this.height) { return; } this.cameraToCenterDistance = 0.5 / Math.tan(this._fov / 2) * this.height; // Find the distance from the center point [width/2, height/2] to the // center top point [width/2, 0] in Z units, using the law of sines. // 1 Z unit is equivalent to 1 horizontal px at the center of the map // (the distance between[width/2, height/2] and [width/2 + 1, height/2]) var halfFov = this._fov / 2; var groundAngle = Math.PI / 2 + this._pitch; var topHalfSurfaceDistance = Math.sin(halfFov) * this.cameraToCenterDistance / Math.sin(Math.PI - groundAngle - halfFov); var x = this.x, y = this.y; // Calculate z distance of the farthest fragment that should be rendered. var furthestDistance = Math.cos(Math.PI / 2 - this._pitch) * topHalfSurfaceDistance + this.cameraToCenterDistance; // Add a bit extra to avoid precision problems when a fragment's distance is exactly `furthestDistance` var farZ = furthestDistance * 1.01; // matrix for conversion from location to GL coordinates (-1 .. 1) var m = new Float64Array(16); mat4.perspective(m, this._fov, this.width / this.height, 1, farZ); mat4.scale(m, m, [1, -1, 1]); mat4.translate(m, m, [0, 0, -this.cameraToCenterDistance]); mat4.rotateX(m, m, this._pitch); mat4.rotateZ(m, m, this.angle); mat4.translate(m, m, [-x, -y, 0]); // scale vertically to meters per pixel (inverse of ground resolution): // worldSize / (circumferenceOfEarth * cos(lat * π / 180)) var verticalScale = this.worldSize / (2 * Math.PI * 6378137 * Math.abs(Math.cos(this.center.lat * (Math.PI / 180)))); mat4.scale(m, m, [1, 1, verticalScale, 1]); this.projMatrix = m; // Make a second projection matrix that is aligned to a pixel grid for rendering raster tiles. // We're rounding the (floating point) x/y values to achieve to avoid rendering raster images to fractional // coordinates. Additionally, we adjust by half a pixel in either direction in case that viewport dimension // is an odd integer to preserve rendering to the pixel grid. We're rotating this shift based on the angle // of the transformation so that 0°, 90°, 180°, and 270° rasters are crisp, and adjust the shift so that // it is always <= 0.5 pixels. var xShift = (this.width % 2) / 2, yShift = (this.height % 2) / 2, angleCos = Math.cos(this.angle), angleSin = Math.sin(this.angle), dx = x - Math.round(x) + angleCos * xShift + angleSin * yShift, dy = y - Math.round(y) + angleCos * yShift + angleSin * xShift; var alignedM = new Float64Array(m); mat4.translate(alignedM, alignedM, [ dx > 0.5 ? dx - 1 : dx, dy > 0.5 ? dy - 1 : dy, 0 ]); this.alignedProjMatrix = alignedM; // matrix for conversion from location to screen coordinates m = mat4.create(); mat4.scale(m, m, [this.width / 2, -this.height / 2, 1]); mat4.translate(m, m, [1, -1, 0]); this.pixelMatrix = mat4.multiply(new Float64Array(16), m, this.projMatrix); // inverse matrix for conversion from screen coordinaes to location m = mat4.invert(new Float64Array(16), this.pixelMatrix); if (!m) { throw new Error("failed to invert matrix"); } this.pixelMatrixInverse = m; this._posMatrixCache = {}; this._alignedPosMatrixCache = {}; }; Object.defineProperties( Transform.prototype, prototypeAccessors ); module.exports = Transform; },{"../data/extent":58,"../source/tile_id":119,"../style-spec/util/interpolate":163,"../util/tile_cover":278,"../util/util":280,"./coordinate":66,"./lng_lat":67,"@mapbox/gl-matrix":2,"@mapbox/point-geometry":4}],70:[function(require,module,exports){ 'use strict';// var Color = require('../style-spec/util/color'); var ZERO = 0x0000; var ONE = 0x0001; var ONE_MINUS_SRC_ALPHA = 0x0303; var ColorMode = function ColorMode(blendFunction , blendColor , mask ) { this.blendFunction = blendFunction; this.blendColor = blendColor; this.mask = mask; }; ColorMode.Replace = [ONE, ZERO]; ColorMode.disabled = new ColorMode(ColorMode.Replace, Color.transparent, [false, false, false, false]); ColorMode.unblended = new ColorMode(ColorMode.Replace, Color.transparent, [true, true, true, true]); ColorMode.alphaBlended = new ColorMode([ONE, ONE_MINUS_SRC_ALPHA], Color.transparent, [true, true, true, true]); module.exports = ColorMode; },{"../style-spec/util/color":158}],71:[function(require,module,exports){ 'use strict';// var IndexBuffer = require('./index_buffer'); var VertexBuffer = require('./vertex_buffer'); var Framebuffer = require('./framebuffer'); var DepthMode = require('./depth_mode'); var StencilMode = require('./stencil_mode'); var ColorMode = require('./color_mode'); var util = require('../util/util'); var ref = require('./value'); var ClearColor = ref.ClearColor; var ClearDepth = ref.ClearDepth; var ClearStencil = ref.ClearStencil; var ColorMask = ref.ColorMask; var DepthMask = ref.DepthMask; var StencilMask = ref.StencilMask; var StencilFunc = ref.StencilFunc; var StencilOp = ref.StencilOp; var StencilTest = ref.StencilTest; var DepthRange = ref.DepthRange; var DepthTest = ref.DepthTest; var DepthFunc = ref.DepthFunc; var Blend = ref.Blend; var BlendFunc = ref.BlendFunc; var BlendColor = ref.BlendColor; var Program = ref.Program; var LineWidth = ref.LineWidth; var ActiveTextureUnit = ref.ActiveTextureUnit; var Viewport = ref.Viewport; var BindFramebuffer = ref.BindFramebuffer; var BindRenderbuffer = ref.BindRenderbuffer; var BindTexture = ref.BindTexture; var BindVertexBuffer = ref.BindVertexBuffer; var BindElementBuffer = ref.BindElementBuffer; var BindVertexArrayOES = ref.BindVertexArrayOES; var PixelStoreUnpack = ref.PixelStoreUnpack; var PixelStoreUnpackPremultiplyAlpha = ref.PixelStoreUnpackPremultiplyAlpha; var Context = function Context(gl ) { this.gl = gl; this.extVertexArrayObject = this.gl.getExtension('OES_vertex_array_object'); this.lineWidthRange = gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE); this.clearColor = new ClearColor(this); this.clearDepth = new ClearDepth(this); this.clearStencil = new ClearStencil(this); this.colorMask = new ColorMask(this); this.depthMask = new DepthMask(this); this.stencilMask = new StencilMask(this); this.stencilFunc = new StencilFunc(this); this.stencilOp = new StencilOp(this); this.stencilTest = new StencilTest(this); this.depthRange = new DepthRange(this); this.depthTest = new DepthTest(this); this.depthFunc = new DepthFunc(this); this.blend = new Blend(this); this.blendFunc = new BlendFunc(this); this.blendColor = new BlendColor(this); this.program = new Program(this); this.lineWidth = new LineWidth(this); this.activeTexture = new ActiveTextureUnit(this); this.viewport = new Viewport(this); this.bindFramebuffer = new BindFramebuffer(this); this.bindRenderbuffer = new BindRenderbuffer(this); this.bindTexture = new BindTexture(this); this.bindVertexBuffer = new BindVertexBuffer(this); this.bindElementBuffer = new BindElementBuffer(this); this.bindVertexArrayOES = this.extVertexArrayObject && new BindVertexArrayOES(this); this.pixelStoreUnpack = new PixelStoreUnpack(this); this.pixelStoreUnpackPremultiplyAlpha = new PixelStoreUnpackPremultiplyAlpha(this); this.extTextureFilterAnisotropic = ( gl.getExtension('EXT_texture_filter_anisotropic') || gl.getExtension('MOZ_EXT_texture_filter_anisotropic') || gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic') ); if (this.extTextureFilterAnisotropic) { this.extTextureFilterAnisotropicMax = gl.getParameter(this.extTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT); } this.extTextureHalfFloat = gl.getExtension('OES_texture_half_float'); if (this.extTextureHalfFloat) { gl.getExtension('OES_texture_half_float_linear'); } }; Context.prototype.createIndexBuffer = function createIndexBuffer (array , dynamicDraw ) { return new IndexBuffer(this, array, dynamicDraw); }; Context.prototype.createVertexBuffer = function createVertexBuffer (array , attributes , dynamicDraw ) { return new VertexBuffer(this, array, attributes, dynamicDraw); }; Context.prototype.createRenderbuffer = function createRenderbuffer (storageFormat , width , height ) { var gl = this.gl; var rbo = gl.createRenderbuffer(); this.bindRenderbuffer.set(rbo); gl.renderbufferStorage(gl.RENDERBUFFER, storageFormat, width, height); this.bindRenderbuffer.set(null); return rbo; }; Context.prototype.createFramebuffer = function createFramebuffer (width , height ) { return new Framebuffer(this, width, height); }; Context.prototype.clear = function clear (ref ) { var color = ref.color; var depth = ref.depth; var gl = this.gl; var mask = 0; if (color) { mask |= gl.COLOR_BUFFER_BIT; this.clearColor.set(color); this.colorMask.set([true, true, true, true]); } if (typeof depth !== 'undefined') { mask |= gl.DEPTH_BUFFER_BIT; this.clearDepth.set(depth); this.depthMask.set(true); } // See note in Painter#clearStencil: implement this the easy way once GPU bug/workaround is fixed upstream // if (typeof stencil !== 'undefined') { // mask |= gl.STENCIL_BUFFER_BIT; // this.clearStencil.set(stencil); // this.stencilMask.set(0xFF); // } gl.clear(mask); }; Context.prototype.setDepthMode = function setDepthMode (depthMode ) { if (depthMode.func === this.gl.ALWAYS && !depthMode.mask) { this.depthTest.set(false); } else { this.depthTest.set(true); this.depthFunc.set(depthMode.func); this.depthMask.set(depthMode.mask); this.depthRange.set(depthMode.range); } }; Context.prototype.setStencilMode = function setStencilMode (stencilMode ) { if (stencilMode.func === this.gl.ALWAYS && !stencilMode.mask) { this.stencilTest.set(false); } else { this.stencilTest.set(true); this.stencilMask.set(stencilMode.mask); this.stencilOp.set([stencilMode.fail, stencilMode.depthFail, stencilMode.pass]); this.stencilFunc.set({ func: stencilMode.test.func, ref: stencilMode.ref, mask: stencilMode.test.mask }); } }; Context.prototype.setColorMode = function setColorMode (colorMode ) { if (util.deepEqual(colorMode.blendFunction, ColorMode.Replace)) { this.blend.set(false); } else { this.blend.set(true); this.blendFunc.set(colorMode.blendFunction); this.blendColor.set(colorMode.blendColor); } this.colorMask.set(colorMode.mask); }; module.exports = Context; },{"../util/util":280,"./color_mode":70,"./depth_mode":72,"./framebuffer":73,"./index_buffer":74,"./stencil_mode":75,"./value":76,"./vertex_buffer":77}],72:[function(require,module,exports){ 'use strict';// var ALWAYS = 0x0207; var DepthMode = function DepthMode(depthFunc , depthMask , depthRange ) { this.func = depthFunc; this.mask = depthMask; this.range = depthRange; }; DepthMode.ReadOnly = false; DepthMode.ReadWrite = true; DepthMode.disabled = new DepthMode(ALWAYS, DepthMode.ReadOnly, [0, 1]); module.exports = DepthMode; },{}],73:[function(require,module,exports){ 'use strict';// var ref = require('./value'); var ColorAttachment = ref.ColorAttachment; var DepthAttachment = ref.DepthAttachment; var Framebuffer = function Framebuffer(context , width , height ) { this.context = context; this.width = width; this.height = height; var gl = context.gl; var fbo = this.framebuffer = gl.createFramebuffer(); this.colorAttachment = new ColorAttachment(context, fbo); this.depthAttachment = new DepthAttachment(context, fbo); }; Framebuffer.prototype.destroy = function destroy () { var gl = this.context.gl; var texture = this.colorAttachment.get(); if (texture) { gl.deleteTexture(texture); } var renderbuffer = this.depthAttachment.get(); if (renderbuffer) { gl.deleteRenderbuffer(renderbuffer); } gl.deleteFramebuffer(this.framebuffer); }; module.exports = Framebuffer; },{"./value":76}],74:[function(require,module,exports){ 'use strict';// var assert = require('assert'); var IndexBuffer = function IndexBuffer(context , array , dynamicDraw ) { this.context = context; var gl = context.gl; this.buffer = gl.createBuffer(); this.dynamicDraw = Boolean(dynamicDraw); this.unbindVAO(); context.bindElementBuffer.set(this.buffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, array.arrayBuffer, this.dynamicDraw ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW); if (!this.dynamicDraw) { delete array.arrayBuffer; } }; IndexBuffer.prototype.unbindVAO = function unbindVAO () { // The bound index buffer is part of vertex array object state. We don't want to // modify whatever VAO happens to be currently bound, so make sure the default // vertex array provided by the context is bound instead. if (this.context.extVertexArrayObject) { this.context.bindVertexArrayOES.set(null); } }; IndexBuffer.prototype.bind = function bind () { this.context.bindElementBuffer.set(this.buffer); }; IndexBuffer.prototype.updateData = function updateData (array ) { var gl = this.context.gl; assert(this.dynamicDraw); // The right VAO will get this buffer re-bound later in VertexArrayObject#bind // See https://github.com/mapbox/mapbox-gl-js/issues/5620 this.unbindVAO(); this.bind(); gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, array.arrayBuffer); }; IndexBuffer.prototype.destroy = function destroy () { var gl = this.context.gl; if (this.buffer) { gl.deleteBuffer(this.buffer); delete this.buffer; } }; module.exports = IndexBuffer; },{"assert":13}],75:[function(require,module,exports){ 'use strict';// var ALWAYS = 0x0207; var KEEP = 0x1E00; var StencilMode = function StencilMode(test , ref , mask , fail , depthFail , pass ) { this.test = test; this.ref = ref; this.mask = mask; this.fail = fail; this.depthFail = depthFail; this.pass = pass; }; StencilMode.disabled = new StencilMode({ func: ALWAYS, mask: 0 }, 0, 0, KEEP, KEEP, KEEP); module.exports = StencilMode; },{}],76:[function(require,module,exports){ 'use strict';// var Color = require('../style-spec/util/color'); var util = require('../util/util'); var ClearColor = function ClearColor(context ) { this.context = context; this.current = Color.transparent; }; ClearColor.prototype.get = function get () { return this.current; }; ClearColor.prototype.set = function set (v ) { var c = this.current; if (v.r !== c.r || v.g !== c.g || v.b !== c.b || v.a !== c.a) { this.context.gl.clearColor(v.r, v.g, v.b, v.a); this.current = v; } }; var ClearDepth = function ClearDepth(context ) { this.context = context; this.current = 1; }; ClearDepth.prototype.get = function get () { return this.current; }; ClearDepth.prototype.set = function set (v ) { if (this.current !== v) { this.context.gl.clearDepth(v); this.current = v; } }; var ClearStencil = function ClearStencil(context ) { this.context = context; this.current = 0; }; ClearStencil.prototype.get = function get () { return this.current; }; ClearStencil.prototype.set = function set (v ) { if (this.current !== v) { this.context.gl.clearStencil(v); this.current = v; } }; var ColorMask = function ColorMask(context ) { this.context = context; this.current = [true, true, true, true]; }; ColorMask.prototype.get = function get () { return this.current; }; ColorMask.prototype.set = function set (v ) { var c = this.current; if (v[0] !== c[0] || v[1] !== c[1] || v[2] !== c[2] || v[3] !== c[3]) { this.context.gl.colorMask(v[0], v[1], v[2], v[3]); this.current = v; } }; var DepthMask = function DepthMask(context ) { this.context = context; this.current = true; }; DepthMask.prototype.get = function get () { return this.current; }; DepthMask.prototype.set = function set (v ) { if (this.current !== v) { this.context.gl.depthMask(v); this.current = v; } }; var StencilMask = function StencilMask(context ) { this.context = context; this.current = 0xFF; }; StencilMask.prototype.get = function get () { return this.current; }; StencilMask.prototype.set = function set (v ) { if (this.current !== v) { this.context.gl.stencilMask(v); this.current = v; } }; var StencilFunc = function StencilFunc(context ) { this.context = context; this.current = { func: context.gl.ALWAYS, ref: 0, mask: 0xFF }; }; StencilFunc.prototype.get = function get () { return this.current; }; StencilFunc.prototype.set = function set (v ) { var c = this.current; if (v.func !== c.func || v.ref !== c.ref || v.mask !== c.mask) { this.context.gl.stencilFunc(v.func, v.ref, v.mask); this.current = v; } }; var StencilOp = function StencilOp(context ) { this.context = context; var gl = this.context.gl; this.current = [gl.KEEP, gl.KEEP, gl.KEEP]; }; StencilOp.prototype.get = function get () { return this.current; }; StencilOp.prototype.set = function set (v ) { var c = this.current; if (v[0] !== c[0] || v[1] !== c[1] || v[2] !== c[2]) { this.context.gl.stencilOp(v[0], v[1], v[2]); this.current = v; } }; var StencilTest = function StencilTest(context ) { this.context = context; this.current = false; }; StencilTest.prototype.get = function get () { return this.current; }; StencilTest.prototype.set = function set (v ) { if (this.current !== v) { var gl = this.context.gl; if (v) { gl.enable(gl.STENCIL_TEST); } else { gl.disable(gl.STENCIL_TEST); } this.current = v; } }; var DepthRange = function DepthRange(context ) { this.context = context; this.current = [0, 1]; }; DepthRange.prototype.get = function get () { return this.current; }; DepthRange.prototype.set = function set (v ) { var c = this.current; if (v[0] !== c[0] || v[1] !== c[1]) { this.context.gl.depthRange(v[0], v[1]); this.current = v; } }; var DepthTest = function DepthTest(context ) { this.context = context; this.current = false; }; DepthTest.prototype.get = function get () { return this.current; }; DepthTest.prototype.set = function set (v ) { if (this.current !== v) { var gl = this.context.gl; if (v) { gl.enable(gl.DEPTH_TEST); } else { gl.disable(gl.DEPTH_TEST); } this.current = v; } }; var DepthFunc = function DepthFunc(context ) { this.context = context; this.current = context.gl.LESS; }; DepthFunc.prototype.get = function get () { return this.current; }; DepthFunc.prototype.set = function set (v ) { if (this.current !== v) { this.context.gl.depthFunc(v); this.current = v; } }; var Blend = function Blend(context ) { this.context = context; this.current = false; }; Blend.prototype.get = function get () { return this.current; }; Blend.prototype.set = function set (v ) { if (this.current !== v) { var gl = this.context.gl; if (v) { gl.enable(gl.BLEND); } else { gl.disable(gl.BLEND); } this.current = v; } }; var BlendFunc = function BlendFunc(context ) { this.context = context; var gl = this.context.gl; this.current = [gl.ONE, gl.ZERO]; }; BlendFunc.prototype.get = function get () { return this.current; }; BlendFunc.prototype.set = function set (v ) { var c = this.current; if (v[0] !== c[0] || v[1] !== c[1]) { this.context.gl.blendFunc(v[0], v[1]); this.current = v; } }; var BlendColor = function BlendColor(context ) { this.context = context; this.current = Color.transparent; }; BlendColor.prototype.get = function get () { return this.current; }; BlendColor.prototype.set = function set (v ) { var c = this.current; if (v.r !== c.r || v.g !== c.g || v.b !== c.b || v.a !== c.a) { this.context.gl.blendColor(v.r, v.g, v.b, v.a); this.current = v; } }; var Program = function Program(context ) { this.context = context; this.current = null; }; Program.prototype.get = function get () { return this.current; }; Program.prototype.set = function set (v ) { if (this.current !== v) { this.context.gl.useProgram(v); this.current = v; } }; var LineWidth = function LineWidth(context ) { this.context = context; this.current = 1; }; LineWidth.prototype.get = function get () { return this.current; }; LineWidth.prototype.set = function set (v ) { var range = this.context.lineWidthRange; var clamped = util.clamp(v, range[0], range[1]); if (this.current !== clamped) { this.context.gl.lineWidth(clamped); this.current = v; } }; var ActiveTextureUnit = function ActiveTextureUnit(context ) { this.context = context; this.current = context.gl.TEXTURE0; }; ActiveTextureUnit.prototype.get = function get () { return this.current; }; ActiveTextureUnit.prototype.set = function set (v ) { if (this.current !== v) { this.context.gl.activeTexture(v); this.current = v; } }; var Viewport = function Viewport(context ) { this.context = context; var gl = this.context.gl; this.current = [0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight]; }; Viewport.prototype.get = function get () { return this.current; }; Viewport.prototype.set = function set (v ) { var c = this.current; if (v[0] !== c[0] || v[1] !== c[1] || v[2] !== c[2] || v[3] !== c[3]) { this.context.gl.viewport(v[0], v[1], v[2], v[3]); this.current = v; } }; var BindFramebuffer = function BindFramebuffer(context ) { this.context = context; this.current = null; }; BindFramebuffer.prototype.get = function get () { return this.current; }; BindFramebuffer.prototype.set = function set (v ) { if (this.current !== v) { var gl = this.context.gl; gl.bindFramebuffer(gl.FRAMEBUFFER, v); this.current = v; } }; var BindRenderbuffer = function BindRenderbuffer(context ) { this.context = context; this.current = null; }; BindRenderbuffer.prototype.get = function get () { return this.current; }; BindRenderbuffer.prototype.set = function set (v ) { if (this.current !== v) { var gl = this.context.gl; gl.bindRenderbuffer(gl.RENDERBUFFER, v); this.current = v; } }; var BindTexture = function BindTexture(context ) { this.context = context; this.current = null; }; BindTexture.prototype.get = function get () { return this.current; }; BindTexture.prototype.set = function set (v ) { if (this.current !== v) { var gl = this.context.gl; gl.bindTexture(gl.TEXTURE_2D, v); this.current = v; } }; var BindVertexBuffer = function BindVertexBuffer(context ) { this.context = context; this.current = null; }; BindVertexBuffer.prototype.get = function get () { return this.current; }; BindVertexBuffer.prototype.set = function set (v ) { if (this.current !== v) { var gl = this.context.gl; gl.bindBuffer(gl.ARRAY_BUFFER, v); this.current = v; } }; var BindElementBuffer = function BindElementBuffer(context ) { this.context = context; this.current = null; }; BindElementBuffer.prototype.get = function get () { return this.current; }; BindElementBuffer.prototype.set = function set (v ) { // Always rebind var gl = this.context.gl; gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, v); this.current = v; }; var BindVertexArrayOES = function BindVertexArrayOES(context ) { this.context = context; this.current = null; }; BindVertexArrayOES.prototype.get = function get () { return this.current; }; BindVertexArrayOES.prototype.set = function set (v ) { if (this.current !== v && this.context.extVertexArrayObject) { this.context.extVertexArrayObject.bindVertexArrayOES(v); this.current = v; } }; var PixelStoreUnpack = function PixelStoreUnpack(context ) { this.context = context; this.current = 4; }; PixelStoreUnpack.prototype.get = function get () { return this.current; }; PixelStoreUnpack.prototype.set = function set (v ) { if (this.current !== v) { var gl = this.context.gl; gl.pixelStorei(gl.UNPACK_ALIGNMENT, v); this.current = v; } }; var PixelStoreUnpackPremultiplyAlpha = function PixelStoreUnpackPremultiplyAlpha(context ) { this.context = context; this.current = false; }; PixelStoreUnpackPremultiplyAlpha.prototype.get = function get () { return this.current; }; PixelStoreUnpackPremultiplyAlpha.prototype.set = function set (v ) { if (this.current !== v) { var gl = this.context.gl; gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, (v )); this.current = v; } }; /** * Framebuffer values * @private */ var FramebufferValue = function FramebufferValue(context , parent ) { this.context = context; this.current = null; this.parent = parent; }; FramebufferValue.prototype.get = function get () { return this.current; }; var ColorAttachment = (function (FramebufferValue) { function ColorAttachment(context , parent ) { FramebufferValue.call(this, context, parent); this.dirty = false; } if ( FramebufferValue ) ColorAttachment.__proto__ = FramebufferValue; ColorAttachment.prototype = Object.create( FramebufferValue && FramebufferValue.prototype ); ColorAttachment.prototype.constructor = ColorAttachment; ColorAttachment.prototype.set = function set (v ) { if (this.dirty || this.current !== v) { var gl = this.context.gl; this.context.bindFramebuffer.set(this.parent); // note: it's possible to attach a renderbuffer to the color // attachment point, but thus far MBGL only uses textures for color gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, v, 0); this.current = v; this.dirty = false; } }; ColorAttachment.prototype.setDirty = function setDirty () { this.dirty = true; }; return ColorAttachment; }(FramebufferValue)); var DepthAttachment = (function (FramebufferValue) { function DepthAttachment () { FramebufferValue.apply(this, arguments); } if ( FramebufferValue ) DepthAttachment.__proto__ = FramebufferValue; DepthAttachment.prototype = Object.create( FramebufferValue && FramebufferValue.prototype ); DepthAttachment.prototype.constructor = DepthAttachment; DepthAttachment.prototype.set = function set (v ) { if (this.current !== v) { var gl = this.context.gl; this.context.bindFramebuffer.set(this.parent); // note: it's possible to attach a texture to the depth attachment // point, but thus far MBGL only uses renderbuffers for depth gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, v); this.current = v; } }; return DepthAttachment; }(FramebufferValue)); module.exports = { ClearColor: ClearColor, ClearDepth: ClearDepth, ClearStencil: ClearStencil, ColorMask: ColorMask, DepthMask: DepthMask, StencilMask: StencilMask, StencilFunc: StencilFunc, StencilOp: StencilOp, StencilTest: StencilTest, DepthRange: DepthRange, DepthTest: DepthTest, DepthFunc: DepthFunc, Blend: Blend, BlendFunc: BlendFunc, BlendColor: BlendColor, Program: Program, LineWidth: LineWidth, ActiveTextureUnit: ActiveTextureUnit, Viewport: Viewport, BindFramebuffer: BindFramebuffer, BindRenderbuffer: BindRenderbuffer, BindTexture: BindTexture, BindVertexBuffer: BindVertexBuffer, BindElementBuffer: BindElementBuffer, BindVertexArrayOES: BindVertexArrayOES, PixelStoreUnpack: PixelStoreUnpack, PixelStoreUnpackPremultiplyAlpha: PixelStoreUnpackPremultiplyAlpha, ColorAttachment: ColorAttachment, DepthAttachment: DepthAttachment, }; },{"../style-spec/util/color":158,"../util/util":280}],77:[function(require,module,exports){ 'use strict';// var assert = require('assert'); /** * @enum {string} AttributeType * @private * @readonly */ var AttributeType = { Int8: 'BYTE', Uint8: 'UNSIGNED_BYTE', Int16: 'SHORT', Uint16: 'UNSIGNED_SHORT', Int32: 'INT', Uint32: 'UNSIGNED_INT', Float32: 'FLOAT' }; /** * The `VertexBuffer` class turns a `StructArray` into a WebGL buffer. Each member of the StructArray's * Struct type is converted to a WebGL atribute. * @private */ var VertexBuffer = function VertexBuffer(context , array , attributes , dynamicDraw ) { this.length = array.length; this.attributes = attributes; this.itemSize = array.bytesPerElement; this.dynamicDraw = dynamicDraw; this.context = context; var gl = context.gl; this.buffer = gl.createBuffer(); context.bindVertexBuffer.set(this.buffer); gl.bufferData(gl.ARRAY_BUFFER, array.arrayBuffer, this.dynamicDraw ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW); if (!this.dynamicDraw) { delete array.arrayBuffer; } }; VertexBuffer.prototype.bind = function bind () { this.context.bindVertexBuffer.set(this.buffer); }; VertexBuffer.prototype.updateData = function updateData (array ) { assert(array.length === this.length); var gl = this.context.gl; this.bind(); gl.bufferSubData(gl.ARRAY_BUFFER, 0, array.arrayBuffer); }; VertexBuffer.prototype.enableAttributes = function enableAttributes (gl , program ) { var this$1 = this; for (var j = 0; j < this.attributes.length; j++) { var member = this$1.attributes[j]; var attribIndex = program.attributes[member.name]; if (attribIndex !== undefined) { gl.enableVertexAttribArray(attribIndex); } } }; /** * Set the attribute pointers in a WebGL context * @param gl The WebGL context * @param program The active WebGL program * @param vertexOffset Index of the starting vertex of the segment */ VertexBuffer.prototype.setVertexAttribPointers = function setVertexAttribPointers (gl , program , vertexOffset ) { var this$1 = this; for (var j = 0; j < this.attributes.length; j++) { var member = this$1.attributes[j]; var attribIndex = program.attributes[member.name]; if (attribIndex !== undefined) { gl.vertexAttribPointer( attribIndex, member.components, (gl )[AttributeType[member.type]], false, this$1.itemSize, member.offset + (this$1.itemSize * (vertexOffset || 0)) ); } } }; /** * Destroy the GL buffer bound to the given WebGL context */ VertexBuffer.prototype.destroy = function destroy () { var gl = this.context.gl; if (this.buffer) { gl.deleteBuffer(this.buffer); delete this.buffer; } }; module.exports = VertexBuffer; },{"assert":13}],78:[function(require,module,exports){ 'use strict';// var supported = require('@mapbox/mapbox-gl-supported'); var browser = require('./util/browser'); var version = require('../package.json').version; var Map = require('./ui/map'); var NavigationControl = require('./ui/control/navigation_control'); var GeolocateControl = require('./ui/control/geolocate_control'); var AttributionControl = require('./ui/control/attribution_control'); var ScaleControl = require('./ui/control/scale_control'); var FullscreenControl = require('./ui/control/fullscreen_control'); var Popup = require('./ui/popup'); var Marker = require('./ui/marker'); var Style = require('./style/style'); var LngLat = require('./geo/lng_lat'); var LngLatBounds = require('./geo/lng_lat_bounds'); var Point = require('@mapbox/point-geometry'); var Evented = require('./util/evented'); var config = require('./util/config'); var rtlTextPlugin = require('./source/rtl_text_plugin'); module.exports = { version: version, supported: supported, workerCount: Math.max(Math.floor(browser.hardwareConcurrency / 2), 1), setRTLTextPlugin: rtlTextPlugin.setRTLTextPlugin, Map: Map, NavigationControl: NavigationControl, GeolocateControl: GeolocateControl, AttributionControl: AttributionControl, ScaleControl: ScaleControl, FullscreenControl: FullscreenControl, Popup: Popup, Marker: Marker, Style: Style, LngLat: LngLat, LngLatBounds: LngLatBounds, Point: Point, Evented: Evented, config: config, /** * Gets and sets the map's [access token](https://www.mapbox.com/help/define-access-token/). * * @var {string} accessToken * @example * mapboxgl.accessToken = myAccessToken; * @see [Display a map](https://www.mapbox.com/mapbox-gl-js/examples/) */ get accessToken() { return config.ACCESS_TOKEN; }, set accessToken(token ) { config.ACCESS_TOKEN = token; } }; /** * The version of Mapbox GL JS in use as specified in `package.json`, * `CHANGELOG.md`, and the GitHub release. * * @var {string} version */ /** * Test whether the browser [supports Mapbox GL JS](https://www.mapbox.com/help/mapbox-browser-support/#mapbox-gl-js). * * @function supported * @param {Object} [options] * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, * the function will return `false` if the performance of Mapbox GL JS would * be dramatically worse than expected (e.g. a software WebGL renderer would be used). * @return {boolean} * @example * mapboxgl.supported() // = true * @see [Check for browser support](https://www.mapbox.com/mapbox-gl-js/example/check-for-support/) */ /** * Sets the map's [RTL text plugin](https://www.mapbox.com/mapbox-gl-js/plugins/#mapbox-gl-rtl-text). * Necessary for supporting languages like Arabic and Hebrew that are written right-to-left. * * @function setRTLTextPlugin * @param {string} pluginURL URL pointing to the Mapbox RTL text plugin source. * @param {Function} callback Called with an error argument if there is an error. * @example * mapboxgl.setRTLTextPlugin('https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-rtl-text/v0.1.1/mapbox-gl-rtl-text.js'); * @see [Add support for right-to-left scripts](https://www.mapbox.com/mapbox-gl-js/example/mapbox-gl-rtl-text/) */ },{"../package.json":43,"./geo/lng_lat":67,"./geo/lng_lat_bounds":68,"./source/rtl_text_plugin":114,"./style/style":195,"./ui/control/attribution_control":237,"./ui/control/fullscreen_control":238,"./ui/control/geolocate_control":239,"./ui/control/navigation_control":241,"./ui/control/scale_control":242,"./ui/map":252,"./ui/marker":253,"./ui/popup":254,"./util/browser":257,"./util/config":261,"./util/evented":265,"@mapbox/mapbox-gl-supported":3,"@mapbox/point-geometry":4}],79:[function(require,module,exports){ 'use strict';// var pattern = require('./pattern'); var StencilMode = require('../gl/stencil_mode'); var DepthMode = require('../gl/depth_mode'); module.exports = drawBackground; function drawBackground(painter , sourceCache , layer ) { var color = layer.paint.get('background-color'); var opacity = layer.paint.get('background-opacity'); if (opacity === 0) { return; } var context = painter.context; var gl = context.gl; var transform = painter.transform; var tileSize = transform.tileSize; var image = layer.paint.get('background-pattern'); var pass = (!image && color.a === 1 && opacity === 1) ? 'opaque' : 'translucent'; if (painter.renderPass !== pass) { return; } context.setStencilMode(StencilMode.disabled); context.setDepthMode(painter.depthModeForSublayer(0, pass === 'opaque' ? DepthMode.ReadWrite : DepthMode.ReadOnly)); context.setColorMode(painter.colorModeForRenderPass()); var program; if (image) { if (pattern.isPatternMissing(image, painter)) { return; } program = painter.useProgram('backgroundPattern'); pattern.prepare(image, painter, program); painter.tileExtentPatternVAO.bind(context, program, painter.tileExtentBuffer, []); } else { program = painter.useProgram('background'); gl.uniform4fv(program.uniforms.u_color, [color.r, color.g, color.b, color.a]); painter.tileExtentVAO.bind(context, program, painter.tileExtentBuffer, []); } gl.uniform1f(program.uniforms.u_opacity, opacity); var tileIDs = transform.coveringTiles({tileSize: tileSize}); for (var i = 0, list = tileIDs; i < list.length; i += 1) { var tileID = list[i]; if (image) { pattern.setTile({tileID: tileID, tileSize: tileSize}, painter, program); } gl.uniformMatrix4fv(program.uniforms.u_matrix, false, painter.transform.calculatePosMatrix(tileID.toUnwrapped())); gl.drawArrays(gl.TRIANGLE_STRIP, 0, painter.tileExtentBuffer.length); } } },{"../gl/depth_mode":72,"../gl/stencil_mode":75,"./pattern":96}],80:[function(require,module,exports){ 'use strict';// var pixelsToTileUnits = require('../source/pixels_to_tile_units'); var StencilMode = require('../gl/stencil_mode'); var DepthMode = require('../gl/depth_mode'); module.exports = drawCircles; function drawCircles(painter , sourceCache , layer , coords ) { if (painter.renderPass !== 'translucent') { return; } var opacity = layer.paint.get('circle-opacity'); var strokeWidth = layer.paint.get('circle-stroke-width'); var strokeOpacity = layer.paint.get('circle-stroke-opacity'); if (opacity.constantOr(1) === 0 && (strokeWidth.constantOr(1) === 0 || strokeOpacity.constantOr(1) === 0)) { return; } var context = painter.context; var gl = context.gl; context.setDepthMode(painter.depthModeForSublayer(0, DepthMode.ReadOnly)); // Allow circles to be drawn across boundaries, so that // large circles are not clipped to tiles context.setStencilMode(StencilMode.disabled); context.setColorMode(painter.colorModeForRenderPass()); var first = true; for (var i = 0; i < coords.length; i++) { var coord = coords[i]; var tile = sourceCache.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var prevProgram = painter.context.program.get(); var programConfiguration = bucket.programConfigurations.get(layer.id); var program = painter.useProgram('circle', programConfiguration); if (first || program.program !== prevProgram) { programConfiguration.setUniforms(context, program, layer.paint, {zoom: painter.transform.zoom}); first = false; } gl.uniform1f(program.uniforms.u_camera_to_center_distance, painter.transform.cameraToCenterDistance); gl.uniform1i(program.uniforms.u_scale_with_map, layer.paint.get('circle-pitch-scale') === 'map' ? 1 : 0); if (layer.paint.get('circle-pitch-alignment') === 'map') { gl.uniform1i(program.uniforms.u_pitch_with_map, 1); var pixelRatio = pixelsToTileUnits(tile, 1, painter.transform.zoom); gl.uniform2f(program.uniforms.u_extrude_scale, pixelRatio, pixelRatio); } else { gl.uniform1i(program.uniforms.u_pitch_with_map, 0); gl.uniform2fv(program.uniforms.u_extrude_scale, painter.transform.pixelsToGLUnits); } gl.uniformMatrix4fv(program.uniforms.u_matrix, false, painter.translatePosMatrix( coord.posMatrix, tile, layer.paint.get('circle-translate'), layer.paint.get('circle-translate-anchor') )); program.draw( context, gl.TRIANGLES, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, programConfiguration); } } },{"../gl/depth_mode":72,"../gl/stencil_mode":75,"../source/pixels_to_tile_units":109}],81:[function(require,module,exports){ 'use strict';// var pixelsToTileUnits = require('../source/pixels_to_tile_units'); var DepthMode = require('../gl/depth_mode'); var StencilMode = require('../gl/stencil_mode'); module.exports = drawCollisionDebug; function drawCollisionDebugGeometry(painter , sourceCache , layer , coords , drawCircles ) { var context = painter.context; var gl = context.gl; var program = drawCircles ? painter.useProgram('collisionCircle') : painter.useProgram('collisionBox'); context.setDepthMode(DepthMode.disabled); context.setStencilMode(StencilMode.disabled); context.setColorMode(painter.colorModeForRenderPass()); for (var i = 0; i < coords.length; i++) { var coord = coords[i]; var tile = sourceCache.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var buffers = drawCircles ? bucket.collisionCircle : bucket.collisionBox; if (!buffers) { continue; } gl.uniformMatrix4fv(program.uniforms.u_matrix, false, coord.posMatrix); if (!drawCircles) { context.lineWidth.set(1); } gl.uniform1f(program.uniforms.u_camera_to_center_distance, painter.transform.cameraToCenterDistance); var pixelRatio = pixelsToTileUnits(tile, 1, painter.transform.zoom); var scale = Math.pow(2, painter.transform.zoom - tile.tileID.overscaledZ); gl.uniform1f(program.uniforms.u_pixels_to_tile_units, pixelRatio); gl.uniform2f(program.uniforms.u_extrude_scale, painter.transform.pixelsToGLUnits[0] / (pixelRatio * scale), painter.transform.pixelsToGLUnits[1] / (pixelRatio * scale)); program.draw( context, drawCircles ? gl.TRIANGLES : gl.LINES, layer.id, buffers.layoutVertexBuffer, buffers.indexBuffer, buffers.segments, null, buffers.collisionVertexBuffer, null); } } function drawCollisionDebug(painter , sourceCache , layer , coords ) { drawCollisionDebugGeometry(painter, sourceCache, layer, coords, false); drawCollisionDebugGeometry(painter, sourceCache, layer, coords, true); } },{"../gl/depth_mode":72,"../gl/stencil_mode":75,"../source/pixels_to_tile_units":109}],82:[function(require,module,exports){ 'use strict';// var browser = require('../util/browser'); var mat4 = require('@mapbox/gl-matrix').mat4; var EXTENT = require('../data/extent'); var VertexArrayObject = require('./vertex_array_object'); var ref = require('../data/array_types'); var PosArray = ref.PosArray; var posAttributes = require('../data/pos_attributes'); var DepthMode = require('../gl/depth_mode'); var StencilMode = require('../gl/stencil_mode'); module.exports = drawDebug; function drawDebug(painter , sourceCache , coords ) { for (var i = 0; i < coords.length; i++) { drawDebugTile(painter, sourceCache, coords[i]); } } function drawDebugTile(painter, sourceCache, coord) { var context = painter.context; var gl = context.gl; context.lineWidth.set(1 * browser.devicePixelRatio); var posMatrix = coord.posMatrix; var program = painter.useProgram('debug'); context.setDepthMode(DepthMode.disabled); context.setStencilMode(StencilMode.disabled); context.setColorMode(painter.colorModeForRenderPass()); gl.uniformMatrix4fv(program.uniforms.u_matrix, false, posMatrix); gl.uniform4f(program.uniforms.u_color, 1, 0, 0, 1); painter.debugVAO.bind(context, program, painter.debugBuffer, []); gl.drawArrays(gl.LINE_STRIP, 0, painter.debugBuffer.length); var vertices = createTextVerticies(coord.toString(), 50, 200, 5); var debugTextArray = new PosArray(); for (var v = 0; v < vertices.length; v += 2) { debugTextArray.emplaceBack(vertices[v], vertices[v + 1]); } var debugTextBuffer = context.createVertexBuffer(debugTextArray, posAttributes.members); var debugTextVAO = new VertexArrayObject(); debugTextVAO.bind(context, program, debugTextBuffer, []); gl.uniform4f(program.uniforms.u_color, 1, 1, 1, 1); // Draw the halo with multiple 1px lines instead of one wider line because // the gl spec doesn't guarantee support for lines with width > 1. var tileSize = sourceCache.getTile(coord).tileSize; var onePixel = EXTENT / (Math.pow(2, painter.transform.zoom - coord.overscaledZ) * tileSize); var translations = [[-1, -1], [-1, 1], [1, -1], [1, 1]]; for (var i = 0; i < translations.length; i++) { var translation = translations[i]; gl.uniformMatrix4fv(program.uniforms.u_matrix, false, mat4.translate([], posMatrix, [onePixel * translation[0], onePixel * translation[1], 0])); gl.drawArrays(gl.LINES, 0, debugTextBuffer.length); } gl.uniform4f(program.uniforms.u_color, 0, 0, 0, 1); gl.uniformMatrix4fv(program.uniforms.u_matrix, false, posMatrix); gl.drawArrays(gl.LINES, 0, debugTextBuffer.length); } // Font data From Hershey Simplex Font // http://paulbourke.net/dataformats/hershey/ var simplexFont = { " ": [16, []], "!": [10, [5, 21, 5, 7, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]], "\"": [16, [4, 21, 4, 14, -1, -1, 12, 21, 12, 14]], "#": [21, [11, 25, 4, -7, -1, -1, 17, 25, 10, -7, -1, -1, 4, 12, 18, 12, -1, -1, 3, 6, 17, 6]], "$": [20, [8, 25, 8, -4, -1, -1, 12, 25, 12, -4, -1, -1, 17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]], "%": [24, [21, 21, 3, 0, -1, -1, 8, 21, 10, 19, 10, 17, 9, 15, 7, 14, 5, 14, 3, 16, 3, 18, 4, 20, 6, 21, 8, 21, 10, 20, 13, 19, 16, 19, 19, 20, 21, 21, -1, -1, 17, 7, 15, 6, 14, 4, 14, 2, 16, 0, 18, 0, 20, 1, 21, 3, 21, 5, 19, 7, 17, 7]], "&": [26, [23, 12, 23, 13, 22, 14, 21, 14, 20, 13, 19, 11, 17, 6, 15, 3, 13, 1, 11, 0, 7, 0, 5, 1, 4, 2, 3, 4, 3, 6, 4, 8, 5, 9, 12, 13, 13, 14, 14, 16, 14, 18, 13, 20, 11, 21, 9, 20, 8, 18, 8, 16, 9, 13, 11, 10, 16, 3, 18, 1, 20, 0, 22, 0, 23, 1, 23, 2]], "'": [10, [5, 19, 4, 20, 5, 21, 6, 20, 6, 18, 5, 16, 4, 15]], "(": [14, [11, 25, 9, 23, 7, 20, 5, 16, 4, 11, 4, 7, 5, 2, 7, -2, 9, -5, 11, -7]], ")": [14, [3, 25, 5, 23, 7, 20, 9, 16, 10, 11, 10, 7, 9, 2, 7, -2, 5, -5, 3, -7]], "*": [16, [8, 21, 8, 9, -1, -1, 3, 18, 13, 12, -1, -1, 13, 18, 3, 12]], "+": [26, [13, 18, 13, 0, -1, -1, 4, 9, 22, 9]], ",": [10, [6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]], "-": [26, [4, 9, 22, 9]], ".": [10, [5, 2, 4, 1, 5, 0, 6, 1, 5, 2]], "/": [22, [20, 25, 2, -7]], "0": [20, [9, 21, 6, 20, 4, 17, 3, 12, 3, 9, 4, 4, 6, 1, 9, 0, 11, 0, 14, 1, 16, 4, 17, 9, 17, 12, 16, 17, 14, 20, 11, 21, 9, 21]], "1": [20, [6, 17, 8, 18, 11, 21, 11, 0]], "2": [20, [4, 16, 4, 17, 5, 19, 6, 20, 8, 21, 12, 21, 14, 20, 15, 19, 16, 17, 16, 15, 15, 13, 13, 10, 3, 0, 17, 0]], "3": [20, [5, 21, 16, 21, 10, 13, 13, 13, 15, 12, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]], "4": [20, [13, 21, 3, 7, 18, 7, -1, -1, 13, 21, 13, 0]], "5": [20, [15, 21, 5, 21, 4, 12, 5, 13, 8, 14, 11, 14, 14, 13, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]], "6": [20, [16, 18, 15, 20, 12, 21, 10, 21, 7, 20, 5, 17, 4, 12, 4, 7, 5, 3, 7, 1, 10, 0, 11, 0, 14, 1, 16, 3, 17, 6, 17, 7, 16, 10, 14, 12, 11, 13, 10, 13, 7, 12, 5, 10, 4, 7]], "7": [20, [17, 21, 7, 0, -1, -1, 3, 21, 17, 21]], "8": [20, [8, 21, 5, 20, 4, 18, 4, 16, 5, 14, 7, 13, 11, 12, 14, 11, 16, 9, 17, 7, 17, 4, 16, 2, 15, 1, 12, 0, 8, 0, 5, 1, 4, 2, 3, 4, 3, 7, 4, 9, 6, 11, 9, 12, 13, 13, 15, 14, 16, 16, 16, 18, 15, 20, 12, 21, 8, 21]], "9": [20, [16, 14, 15, 11, 13, 9, 10, 8, 9, 8, 6, 9, 4, 11, 3, 14, 3, 15, 4, 18, 6, 20, 9, 21, 10, 21, 13, 20, 15, 18, 16, 14, 16, 9, 15, 4, 13, 1, 10, 0, 8, 0, 5, 1, 4, 3]], ":": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]], ";": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]], "<": [24, [20, 18, 4, 9, 20, 0]], "=": [26, [4, 12, 22, 12, -1, -1, 4, 6, 22, 6]], ">": [24, [4, 18, 20, 9, 4, 0]], "?": [18, [3, 16, 3, 17, 4, 19, 5, 20, 7, 21, 11, 21, 13, 20, 14, 19, 15, 17, 15, 15, 14, 13, 13, 12, 9, 10, 9, 7, -1, -1, 9, 2, 8, 1, 9, 0, 10, 1, 9, 2]], "@": [27, [18, 13, 17, 15, 15, 16, 12, 16, 10, 15, 9, 14, 8, 11, 8, 8, 9, 6, 11, 5, 14, 5, 16, 6, 17, 8, -1, -1, 12, 16, 10, 14, 9, 11, 9, 8, 10, 6, 11, 5, -1, -1, 18, 16, 17, 8, 17, 6, 19, 5, 21, 5, 23, 7, 24, 10, 24, 12, 23, 15, 22, 17, 20, 19, 18, 20, 15, 21, 12, 21, 9, 20, 7, 19, 5, 17, 4, 15, 3, 12, 3, 9, 4, 6, 5, 4, 7, 2, 9, 1, 12, 0, 15, 0, 18, 1, 20, 2, 21, 3, -1, -1, 19, 16, 18, 8, 18, 6, 19, 5]], "A": [18, [9, 21, 1, 0, -1, -1, 9, 21, 17, 0, -1, -1, 4, 7, 14, 7]], "B": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, -1, -1, 4, 11, 13, 11, 16, 10, 17, 9, 18, 7, 18, 4, 17, 2, 16, 1, 13, 0, 4, 0]], "C": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5]], "D": [21, [4, 21, 4, 0, -1, -1, 4, 21, 11, 21, 14, 20, 16, 18, 17, 16, 18, 13, 18, 8, 17, 5, 16, 3, 14, 1, 11, 0, 4, 0]], "E": [19, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11, -1, -1, 4, 0, 17, 0]], "F": [18, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11]], "G": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 18, 8, -1, -1, 13, 8, 18, 8]], "H": [22, [4, 21, 4, 0, -1, -1, 18, 21, 18, 0, -1, -1, 4, 11, 18, 11]], "I": [8, [4, 21, 4, 0]], "J": [16, [12, 21, 12, 5, 11, 2, 10, 1, 8, 0, 6, 0, 4, 1, 3, 2, 2, 5, 2, 7]], "K": [21, [4, 21, 4, 0, -1, -1, 18, 21, 4, 7, -1, -1, 9, 12, 18, 0]], "L": [17, [4, 21, 4, 0, -1, -1, 4, 0, 16, 0]], "M": [24, [4, 21, 4, 0, -1, -1, 4, 21, 12, 0, -1, -1, 20, 21, 12, 0, -1, -1, 20, 21, 20, 0]], "N": [22, [4, 21, 4, 0, -1, -1, 4, 21, 18, 0, -1, -1, 18, 21, 18, 0]], "O": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21]], "P": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 14, 17, 12, 16, 11, 13, 10, 4, 10]], "Q": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21, -1, -1, 12, 4, 18, -2]], "R": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, 4, 11, -1, -1, 11, 11, 18, 0]], "S": [20, [17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]], "T": [16, [8, 21, 8, 0, -1, -1, 1, 21, 15, 21]], "U": [22, [4, 21, 4, 6, 5, 3, 7, 1, 10, 0, 12, 0, 15, 1, 17, 3, 18, 6, 18, 21]], "V": [18, [1, 21, 9, 0, -1, -1, 17, 21, 9, 0]], "W": [24, [2, 21, 7, 0, -1, -1, 12, 21, 7, 0, -1, -1, 12, 21, 17, 0, -1, -1, 22, 21, 17, 0]], "X": [20, [3, 21, 17, 0, -1, -1, 17, 21, 3, 0]], "Y": [18, [1, 21, 9, 11, 9, 0, -1, -1, 17, 21, 9, 11]], "Z": [20, [17, 21, 3, 0, -1, -1, 3, 21, 17, 21, -1, -1, 3, 0, 17, 0]], "[": [14, [4, 25, 4, -7, -1, -1, 5, 25, 5, -7, -1, -1, 4, 25, 11, 25, -1, -1, 4, -7, 11, -7]], "\\": [14, [0, 21, 14, -3]], "]": [14, [9, 25, 9, -7, -1, -1, 10, 25, 10, -7, -1, -1, 3, 25, 10, 25, -1, -1, 3, -7, 10, -7]], "^": [16, [6, 15, 8, 18, 10, 15, -1, -1, 3, 12, 8, 17, 13, 12, -1, -1, 8, 17, 8, 0]], "_": [16, [0, -2, 16, -2]], "`": [10, [6, 21, 5, 20, 4, 18, 4, 16, 5, 15, 6, 16, 5, 17]], "a": [19, [15, 14, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], "b": [19, [4, 21, 4, 0, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]], "c": [18, [15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], "d": [19, [15, 21, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], "e": [18, [3, 8, 15, 8, 15, 10, 14, 12, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], "f": [12, [10, 21, 8, 21, 6, 20, 5, 17, 5, 0, -1, -1, 2, 14, 9, 14]], "g": [19, [15, 14, 15, -2, 14, -5, 13, -6, 11, -7, 8, -7, 6, -6, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], "h": [19, [4, 21, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]], "i": [8, [3, 21, 4, 20, 5, 21, 4, 22, 3, 21, -1, -1, 4, 14, 4, 0]], "j": [10, [5, 21, 6, 20, 7, 21, 6, 22, 5, 21, -1, -1, 6, 14, 6, -3, 5, -6, 3, -7, 1, -7]], "k": [17, [4, 21, 4, 0, -1, -1, 14, 14, 4, 4, -1, -1, 8, 8, 15, 0]], "l": [8, [4, 21, 4, 0]], "m": [30, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0, -1, -1, 15, 10, 18, 13, 20, 14, 23, 14, 25, 13, 26, 10, 26, 0]], "n": [19, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]], "o": [19, [8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3, 16, 6, 16, 8, 15, 11, 13, 13, 11, 14, 8, 14]], "p": [19, [4, 14, 4, -7, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]], "q": [19, [15, 14, 15, -7, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], "r": [13, [4, 14, 4, 0, -1, -1, 4, 8, 5, 11, 7, 13, 9, 14, 12, 14]], "s": [17, [14, 11, 13, 13, 10, 14, 7, 14, 4, 13, 3, 11, 4, 9, 6, 8, 11, 7, 13, 6, 14, 4, 14, 3, 13, 1, 10, 0, 7, 0, 4, 1, 3, 3]], "t": [12, [5, 21, 5, 4, 6, 1, 8, 0, 10, 0, -1, -1, 2, 14, 9, 14]], "u": [19, [4, 14, 4, 4, 5, 1, 7, 0, 10, 0, 12, 1, 15, 4, -1, -1, 15, 14, 15, 0]], "v": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0]], "w": [22, [3, 14, 7, 0, -1, -1, 11, 14, 7, 0, -1, -1, 11, 14, 15, 0, -1, -1, 19, 14, 15, 0]], "x": [17, [3, 14, 14, 0, -1, -1, 14, 14, 3, 0]], "y": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0, 6, -4, 4, -6, 2, -7, 1, -7]], "z": [17, [14, 14, 3, 0, -1, -1, 3, 14, 14, 14, -1, -1, 3, 0, 14, 0]], "{": [14, [9, 25, 7, 24, 6, 23, 5, 21, 5, 19, 6, 17, 7, 16, 8, 14, 8, 12, 6, 10, -1, -1, 7, 24, 6, 22, 6, 20, 7, 18, 8, 17, 9, 15, 9, 13, 8, 11, 4, 9, 8, 7, 9, 5, 9, 3, 8, 1, 7, 0, 6, -2, 6, -4, 7, -6, -1, -1, 6, 8, 8, 6, 8, 4, 7, 2, 6, 1, 5, -1, 5, -3, 6, -5, 7, -6, 9, -7]], "|": [8, [4, 25, 4, -7]], "}": [14, [5, 25, 7, 24, 8, 23, 9, 21, 9, 19, 8, 17, 7, 16, 6, 14, 6, 12, 8, 10, -1, -1, 7, 24, 8, 22, 8, 20, 7, 18, 6, 17, 5, 15, 5, 13, 6, 11, 10, 9, 6, 7, 5, 5, 5, 3, 6, 1, 7, 0, 8, -2, 8, -4, 7, -6, -1, -1, 8, 8, 6, 6, 6, 4, 7, 2, 8, 1, 9, -1, 9, -3, 8, -5, 7, -6, 5, -7]], "~": [24, [3, 6, 3, 8, 4, 11, 6, 12, 8, 12, 10, 11, 14, 8, 16, 7, 18, 7, 20, 8, 21, 10, -1, -1, 3, 8, 4, 10, 6, 11, 8, 11, 10, 10, 14, 7, 16, 6, 18, 6, 20, 7, 21, 10, 21, 12]] }; function createTextVerticies(text, left, baseline, scale) { scale = scale || 1; var strokes = []; var i, len, j, len2, glyph, x, y, prev; for (i = 0, len = text.length; i < len; i++) { glyph = simplexFont[text[i]]; if (!glyph) { continue; } prev = null; for (j = 0, len2 = glyph[1].length; j < len2; j += 2) { if (glyph[1][j] === -1 && glyph[1][j + 1] === -1) { prev = null; } else { x = left + glyph[1][j] * scale; y = baseline - glyph[1][j + 1] * scale; if (prev) { strokes.push(prev.x, prev.y, x, y); } prev = {x: x, y: y}; } } left += glyph[0] * scale; } return strokes; } },{"../data/array_types":44,"../data/extent":58,"../data/pos_attributes":62,"../gl/depth_mode":72,"../gl/stencil_mode":75,"../util/browser":257,"./vertex_array_object":100,"@mapbox/gl-matrix":2}],83:[function(require,module,exports){ 'use strict';// var pattern = require('./pattern'); var Color = require('../style-spec/util/color'); var DepthMode = require('../gl/depth_mode'); module.exports = drawFill; function drawFill(painter , sourceCache , layer , coords ) { var color = layer.paint.get('fill-color'); var opacity = layer.paint.get('fill-opacity'); if (opacity.constantOr(1) === 0) { return; } var context = painter.context; context.setColorMode(painter.colorModeForRenderPass()); var pass = (!layer.paint.get('fill-pattern') && color.constantOr(Color.transparent).a === 1 && opacity.constantOr(0) === 1) ? 'opaque' : 'translucent'; // Draw fill if (painter.renderPass === pass) { // Once we switch to earcut drawing we can pull most of the WebGL setup // outside of this coords loop. context.setDepthMode(painter.depthModeForSublayer(1, painter.renderPass === 'opaque' ? DepthMode.ReadWrite : DepthMode.ReadOnly)); drawFillTiles(painter, sourceCache, layer, coords, drawFillTile); } // Draw stroke if (painter.renderPass === 'translucent' && layer.paint.get('fill-antialias')) { context.lineWidth.set(2); // If we defined a different color for the fill outline, we are // going to ignore the bits in 0x07 and just care about the global // clipping mask. // Otherwise, we only want to drawFill the antialiased parts that are // *outside* the current shape. This is important in case the fill // or stroke color is translucent. If we wouldn't clip to outside // the current shape, some pixels from the outline stroke overlapped // the (non-antialiased) fill. context.setDepthMode(painter.depthModeForSublayer( layer.getPaintProperty('fill-outline-color') ? 2 : 0, DepthMode.ReadOnly)); drawFillTiles(painter, sourceCache, layer, coords, drawStrokeTile); } } function drawFillTiles(painter, sourceCache, layer, coords, drawFn) { if (pattern.isPatternMissing(layer.paint.get('fill-pattern'), painter)) { return; } var firstTile = true; for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; var tile = sourceCache.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } painter.context.setStencilMode(painter.stencilModeForClipping(coord)); drawFn(painter, sourceCache, layer, tile, coord, bucket, firstTile); firstTile = false; } } function drawFillTile(painter, sourceCache, layer, tile, coord, bucket, firstTile) { var gl = painter.context.gl; var programConfiguration = bucket.programConfigurations.get(layer.id); var program = setFillProgram('fill', layer.paint.get('fill-pattern'), painter, programConfiguration, layer, tile, coord, firstTile); program.draw( painter.context, gl.TRIANGLES, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, programConfiguration); } function drawStrokeTile(painter, sourceCache, layer, tile, coord, bucket, firstTile) { var gl = painter.context.gl; var programConfiguration = bucket.programConfigurations.get(layer.id); var pattern = layer.getPaintProperty('fill-outline-color') ? null : layer.paint.get('fill-pattern'); var program = setFillProgram('fillOutline', pattern, painter, programConfiguration, layer, tile, coord, firstTile); gl.uniform2f(program.uniforms.u_world, gl.drawingBufferWidth, gl.drawingBufferHeight); program.draw( painter.context, gl.LINES, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer2, bucket.segments2, programConfiguration); } function setFillProgram(programId, pat , painter, programConfiguration, layer, tile, coord, firstTile) { var program; var prevProgram = painter.context.program.get(); if (!pat) { program = painter.useProgram(programId, programConfiguration); if (firstTile || program.program !== prevProgram) { programConfiguration.setUniforms(painter.context, program, layer.paint, {zoom: painter.transform.zoom}); } } else { program = painter.useProgram((programId + "Pattern"), programConfiguration); if (firstTile || program.program !== prevProgram) { programConfiguration.setUniforms(painter.context, program, layer.paint, {zoom: painter.transform.zoom}); pattern.prepare(pat, painter, program); } pattern.setTile(tile, painter, program); } painter.context.gl.uniformMatrix4fv(program.uniforms.u_matrix, false, painter.translatePosMatrix( coord.posMatrix, tile, layer.paint.get('fill-translate'), layer.paint.get('fill-translate-anchor') )); return program; } },{"../gl/depth_mode":72,"../style-spec/util/color":158,"./pattern":96}],84:[function(require,module,exports){ 'use strict';// var glMatrix = require('@mapbox/gl-matrix'); var pattern = require('./pattern'); var Texture = require('./texture'); var Color = require('../style-spec/util/color'); var DepthMode = require('../gl/depth_mode'); var mat3 = glMatrix.mat3; var mat4 = glMatrix.mat4; var vec3 = glMatrix.vec3; var StencilMode = require('../gl/stencil_mode'); module.exports = draw; function draw(painter , source , layer , coords ) { if (layer.paint.get('fill-extrusion-opacity') === 0) { return; } if (painter.renderPass === 'offscreen') { drawToExtrusionFramebuffer(painter, layer); var first = true; for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; var tile = source.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } drawExtrusion(painter, source, layer, tile, coord, bucket, first); first = false; } } else if (painter.renderPass === 'translucent') { drawExtrusionTexture(painter, layer); } } function drawToExtrusionFramebuffer(painter, layer) { var context = painter.context; var gl = context.gl; var renderTarget = layer.viewportFrame; if (painter.depthRboNeedsClear) { painter.setupOffscreenDepthRenderbuffer(); } if (!renderTarget) { var texture = new Texture(context, {width: painter.width, height: painter.height, data: null}, gl.RGBA); texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); renderTarget = layer.viewportFrame = context.createFramebuffer(painter.width, painter.height); renderTarget.colorAttachment.set(texture.texture); } context.bindFramebuffer.set(renderTarget.framebuffer); renderTarget.depthAttachment.set(painter.depthRbo); if (painter.depthRboNeedsClear) { context.clear({ depth: 1 }); painter.depthRboNeedsClear = false; } context.clear({ color: Color.transparent }); context.setStencilMode(StencilMode.disabled); context.setDepthMode(new DepthMode(gl.LEQUAL, DepthMode.ReadWrite, [0, 1])); context.setColorMode(painter.colorModeForRenderPass()); } function drawExtrusionTexture(painter, layer) { var renderedTexture = layer.viewportFrame; if (!renderedTexture) { return; } var context = painter.context; var gl = context.gl; var program = painter.useProgram('extrusionTexture'); context.setStencilMode(StencilMode.disabled); context.setDepthMode(DepthMode.disabled); context.setColorMode(painter.colorModeForRenderPass()); context.activeTexture.set(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, renderedTexture.colorAttachment.get()); gl.uniform1f(program.uniforms.u_opacity, layer.paint.get('fill-extrusion-opacity')); gl.uniform1i(program.uniforms.u_image, 0); var matrix = mat4.create(); mat4.ortho(matrix, 0, painter.width, painter.height, 0, 0, 1); gl.uniformMatrix4fv(program.uniforms.u_matrix, false, matrix); gl.uniform2f(program.uniforms.u_world, gl.drawingBufferWidth, gl.drawingBufferHeight); painter.viewportVAO.bind(context, program, painter.viewportBuffer, []); gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); } function drawExtrusion(painter, source, layer, tile, coord, bucket, first) { var context = painter.context; var gl = context.gl; var image = layer.paint.get('fill-extrusion-pattern'); var prevProgram = painter.context.program.get(); var programConfiguration = bucket.programConfigurations.get(layer.id); var program = painter.useProgram(image ? 'fillExtrusionPattern' : 'fillExtrusion', programConfiguration); if (first || program.program !== prevProgram) { programConfiguration.setUniforms(context, program, layer.paint, {zoom: painter.transform.zoom}); } if (image) { if (pattern.isPatternMissing(image, painter)) { return; } pattern.prepare(image, painter, program); pattern.setTile(tile, painter, program); gl.uniform1f(program.uniforms.u_height_factor, -Math.pow(2, coord.overscaledZ) / tile.tileSize / 8); } painter.context.gl.uniformMatrix4fv(program.uniforms.u_matrix, false, painter.translatePosMatrix( coord.posMatrix, tile, layer.paint.get('fill-extrusion-translate'), layer.paint.get('fill-extrusion-translate-anchor') )); setLight(program, painter); program.draw( context, gl.TRIANGLES, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, programConfiguration); } function setLight(program, painter) { var gl = painter.context.gl; var light = painter.style.light; var _lp = light.properties.get('position'); var lightPos = [_lp.x, _lp.y, _lp.z]; var lightMat = mat3.create(); if (light.properties.get('anchor') === 'viewport') { mat3.fromRotation(lightMat, -painter.transform.angle); } vec3.transformMat3(lightPos, lightPos, lightMat); var color = light.properties.get('color'); gl.uniform3fv(program.uniforms.u_lightpos, lightPos); gl.uniform1f(program.uniforms.u_lightintensity, light.properties.get('intensity')); gl.uniform3f(program.uniforms.u_lightcolor, color.r, color.g, color.b); } },{"../gl/depth_mode":72,"../gl/stencil_mode":75,"../style-spec/util/color":158,"./pattern":96,"./texture":98,"@mapbox/gl-matrix":2}],85:[function(require,module,exports){ 'use strict';// var mat4 = require('@mapbox/gl-matrix').mat4; var Texture = require('./texture'); var pixelsToTileUnits = require('../source/pixels_to_tile_units'); var Color = require('../style-spec/util/color'); var DepthMode = require('../gl/depth_mode'); var StencilMode = require('../gl/stencil_mode'); var ColorMode = require('../gl/color_mode'); module.exports = drawHeatmap; function drawHeatmap(painter , sourceCache , layer , coords ) { if (layer.paint.get('heatmap-opacity') === 0) { return; } if (painter.renderPass === 'offscreen') { var context = painter.context; var gl = context.gl; context.setDepthMode(painter.depthModeForSublayer(0, DepthMode.ReadOnly)); // Allow kernels to be drawn across boundaries, so that // large kernels are not clipped to tiles context.setStencilMode(StencilMode.disabled); bindFramebuffer(context, painter, layer); context.clear({ color: Color.transparent }); // Turn on additive blending for kernels, which is a key aspect of kernel density estimation formula context.setColorMode(new ColorMode([gl.ONE, gl.ONE], Color.transparent, [true, true, true, true])); var first = true; for (var i = 0; i < coords.length; i++) { var coord = coords[i]; // Skip tiles that have uncovered parents to avoid flickering; we don't need // to use complex tile masking here because the change between zoom levels is subtle, // so it's fine to simply render the parent until all its 4 children are loaded if (sourceCache.hasRenderableParent(coord)) { continue; } var tile = sourceCache.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var prevProgram = painter.context.program.get(); var programConfiguration = bucket.programConfigurations.get(layer.id); var program = painter.useProgram('heatmap', programConfiguration); var ref = painter.transform; var zoom = ref.zoom; if (first || program.program !== prevProgram) { programConfiguration.setUniforms(painter.context, program, layer.paint, {zoom: zoom}); first = false; } gl.uniform1f(program.uniforms.u_extrude_scale, pixelsToTileUnits(tile, 1, zoom)); gl.uniform1f(program.uniforms.u_intensity, layer.paint.get('heatmap-intensity')); gl.uniformMatrix4fv(program.uniforms.u_matrix, false, coord.posMatrix); program.draw( context, gl.TRIANGLES, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, programConfiguration); } context.viewport.set([0, 0, painter.width, painter.height]); } else if (painter.renderPass === 'translucent') { painter.context.setColorMode(painter.colorModeForRenderPass()); renderTextureToMap(painter, layer); } } function bindFramebuffer(context, painter, layer) { var gl = context.gl; context.activeTexture.set(gl.TEXTURE1); // Use a 4x downscaled screen texture for better performance context.viewport.set([0, 0, painter.width / 4, painter.height / 4]); var fbo = layer.heatmapFbo; if (!fbo) { var texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, texture); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); fbo = layer.heatmapFbo = context.createFramebuffer(painter.width / 4, painter.height / 4); bindTextureToFramebuffer(context, painter, texture, fbo); } else { gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); context.bindFramebuffer.set(fbo.framebuffer); } } function bindTextureToFramebuffer(context, painter, texture, fbo) { var gl = context.gl; // Use the higher precision half-float texture where available (producing much smoother looking heatmaps); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, painter.width / 4, painter.height / 4, 0, gl.RGBA, context.extTextureHalfFloat ? context.extTextureHalfFloat.HALF_FLOAT_OES : gl.UNSIGNED_BYTE, null); fbo.colorAttachment.set(texture); // If using half-float texture as a render target is not supported, fall back to a low precision texture if (context.extTextureHalfFloat && gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) { context.extTextureHalfFloat = null; fbo.colorAttachment.setDirty(); bindTextureToFramebuffer(context, painter, texture, fbo); } } function renderTextureToMap(painter, layer) { var context = painter.context; var gl = context.gl; // Here we bind two different textures from which we'll sample in drawing // heatmaps: the kernel texture, prepared in the offscreen pass, and a // color ramp texture. var fbo = layer.heatmapFbo; if (!fbo) { return; } context.activeTexture.set(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); context.activeTexture.set(gl.TEXTURE1); var colorRampTexture = layer.colorRampTexture; if (!colorRampTexture) { colorRampTexture = layer.colorRampTexture = new Texture(context, layer.colorRamp, gl.RGBA); } colorRampTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); context.setDepthMode(DepthMode.disabled); var program = painter.useProgram('heatmapTexture'); var opacity = layer.paint.get('heatmap-opacity'); gl.uniform1f(program.uniforms.u_opacity, opacity); gl.uniform1i(program.uniforms.u_image, 0); gl.uniform1i(program.uniforms.u_color_ramp, 1); var matrix = mat4.create(); mat4.ortho(matrix, 0, painter.width, painter.height, 0, 0, 1); gl.uniformMatrix4fv(program.uniforms.u_matrix, false, matrix); gl.uniform2f(program.uniforms.u_world, gl.drawingBufferWidth, gl.drawingBufferHeight); painter.viewportVAO.bind(painter.context, program, painter.viewportBuffer, []); gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); } },{"../gl/color_mode":70,"../gl/depth_mode":72,"../gl/stencil_mode":75,"../source/pixels_to_tile_units":109,"../style-spec/util/color":158,"./texture":98,"@mapbox/gl-matrix":2}],86:[function(require,module,exports){ 'use strict';// var Coordinate = require('../geo/coordinate'); var Texture = require('./texture'); var EXTENT = require('../data/extent'); var mat4 = require('@mapbox/gl-matrix').mat4; var StencilMode = require('../gl/stencil_mode'); var DepthMode = require('../gl/depth_mode'); module.exports = drawHillshade; function drawHillshade(painter , sourceCache , layer , tileIDs ) { if (painter.renderPass !== 'offscreen' && painter.renderPass !== 'translucent') { return; } var context = painter.context; context.setDepthMode(painter.depthModeForSublayer(0, DepthMode.ReadOnly)); context.setStencilMode(StencilMode.disabled); context.setColorMode(painter.colorModeForRenderPass()); for (var i = 0, list = tileIDs; i < list.length; i += 1) { var tileID = list[i]; var tile = sourceCache.getTile(tileID); if (tile.needsHillshadePrepare && painter.renderPass === 'offscreen') { prepareHillshade(painter, tile); continue; } else if (painter.renderPass === 'translucent') { renderHillshade(painter, tile, layer); } } context.viewport.set([0, 0, painter.width, painter.height]); } function setLight(program, painter, layer) { var azimuthal = layer.paint.get('hillshade-illumination-direction') * (Math.PI / 180); // modify azimuthal angle by map rotation if light is anchored at the viewport if (layer.paint.get('hillshade-illumination-anchor') === 'viewport') { azimuthal -= painter.transform.angle; } painter.context.gl.uniform2f(program.uniforms.u_light, layer.paint.get('hillshade-exaggeration'), azimuthal); } function getTileLatRange(painter, tileID ) { var coordinate0 = tileID.toCoordinate(); var coordinate1 = new Coordinate(coordinate0.column, coordinate0.row + 1, coordinate0.zoom); return [painter.transform.coordinateLocation(coordinate0).lat, painter.transform.coordinateLocation(coordinate1).lat]; } function renderHillshade(painter, tile, layer) { var context = painter.context; var gl = context.gl; var fbo = tile.fbo; if (!fbo) { return; } var program = painter.useProgram('hillshade'); var posMatrix = painter.transform.calculatePosMatrix(tile.tileID.toUnwrapped()); setLight(program, painter, layer); // for scaling the magnitude of a points slope by its latitude var latRange = getTileLatRange(painter, tile.tileID); context.activeTexture.set(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); gl.uniformMatrix4fv(program.uniforms.u_matrix, false, posMatrix); gl.uniform2fv(program.uniforms.u_latrange, latRange); gl.uniform1i(program.uniforms.u_image, 0); var shadowColor = layer.paint.get("hillshade-shadow-color"); gl.uniform4f(program.uniforms.u_shadow, shadowColor.r, shadowColor.g, shadowColor.b, shadowColor.a); var highlightColor = layer.paint.get("hillshade-highlight-color"); gl.uniform4f(program.uniforms.u_highlight, highlightColor.r, highlightColor.g, highlightColor.b, highlightColor.a); var accentColor = layer.paint.get("hillshade-accent-color"); gl.uniform4f(program.uniforms.u_accent, accentColor.r, accentColor.g, accentColor.b, accentColor.a); if (tile.maskedBoundsBuffer && tile.maskedIndexBuffer && tile.segments) { program.draw( context, gl.TRIANGLES, layer.id, tile.maskedBoundsBuffer, tile.maskedIndexBuffer, tile.segments ); } else { var buffer = painter.rasterBoundsBuffer; var vao = painter.rasterBoundsVAO; vao.bind(context, program, buffer, []); gl.drawArrays(gl.TRIANGLE_STRIP, 0, buffer.length); } } // hillshade rendering is done in two steps. the prepare step first calculates the slope of the terrain in the x and y // directions for each pixel, and saves those values to a framebuffer texture in the r and g channels. function prepareHillshade(painter, tile) { var context = painter.context; var gl = context.gl; // decode rgba levels by using integer overflow to convert each Uint32Array element -> 4 Uint8Array elements. // ex. // Uint32: // base 10 - 67308 // base 2 - 0000 0000 0000 0001 0000 0110 1110 1100 // // Uint8: // base 10 - 0, 1, 6, 236 (this order is reversed in the resulting array via the overflow. // first 8 bits represent 236, so the r component of the texture pixel will be 236 etc.) // base 2 - 0000 0000, 0000 0001, 0000 0110, 1110 1100 if (tile.dem && tile.dem.level) { var tileSize = tile.dem.level.dim; var pixelData = tile.dem.getPixels(); context.activeTexture.set(gl.TEXTURE1); // if UNPACK_PREMULTIPLY_ALPHA_WEBGL is set to true prior to drawHillshade being called // tiles will appear blank, because as you can see above the alpha value for these textures // is always 0 context.pixelStoreUnpackPremultiplyAlpha.set(false); tile.demTexture = tile.demTexture || painter.getTileTexture(tile.tileSize); if (tile.demTexture) { var demTexture = tile.demTexture; demTexture.update(pixelData, false); demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); } else { tile.demTexture = new Texture(context, pixelData, gl.RGBA, false); tile.demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); } context.activeTexture.set(gl.TEXTURE0); var fbo = tile.fbo; if (!fbo) { var renderTexture = new Texture(context, {width: tileSize, height: tileSize, data: null}, gl.RGBA); renderTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); fbo = tile.fbo = context.createFramebuffer(tileSize, tileSize); fbo.colorAttachment.set(renderTexture.texture); } context.bindFramebuffer.set(fbo.framebuffer); context.viewport.set([0, 0, tileSize, tileSize]); var matrix = mat4.create(); // Flip rendering at y axis. mat4.ortho(matrix, 0, EXTENT, -EXTENT, 0, 0, 1); mat4.translate(matrix, matrix, [0, -EXTENT, 0]); var program = painter.useProgram('hillshadePrepare'); gl.uniformMatrix4fv(program.uniforms.u_matrix, false, matrix); gl.uniform1f(program.uniforms.u_zoom, tile.tileID.overscaledZ); gl.uniform2fv(program.uniforms.u_dimension, [tileSize * 2, tileSize * 2]); gl.uniform1i(program.uniforms.u_image, 1); var buffer = painter.rasterBoundsBuffer; var vao = painter.rasterBoundsVAO; vao.bind(context, program, buffer, []); gl.drawArrays(gl.TRIANGLE_STRIP, 0, buffer.length); tile.needsHillshadePrepare = false; } } },{"../data/extent":58,"../geo/coordinate":66,"../gl/depth_mode":72,"../gl/stencil_mode":75,"./texture":98,"@mapbox/gl-matrix":2}],87:[function(require,module,exports){ 'use strict';// var browser = require('../util/browser'); var pixelsToTileUnits = require('../source/pixels_to_tile_units'); var DepthMode = require('../gl/depth_mode'); module.exports = function drawLine(painter , sourceCache , layer , coords ) { if (painter.renderPass !== 'translucent') { return; } var opacity = layer.paint.get('line-opacity'); if (opacity.constantOr(1) === 0) { return; } var context = painter.context; context.setDepthMode(painter.depthModeForSublayer(0, DepthMode.ReadOnly)); context.setColorMode(painter.colorModeForRenderPass()); var programId = layer.paint.get('line-dasharray') ? 'lineSDF' : layer.paint.get('line-pattern') ? 'linePattern' : 'line'; var prevTileZoom; var firstTile = true; for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; var tile = sourceCache.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var programConfiguration = bucket.programConfigurations.get(layer.id); var prevProgram = painter.context.program.get(); var program = painter.useProgram(programId, programConfiguration); var programChanged = firstTile || program.program !== prevProgram; var tileRatioChanged = prevTileZoom !== tile.tileID.overscaledZ; if (programChanged) { programConfiguration.setUniforms(painter.context, program, layer.paint, {zoom: painter.transform.zoom}); } drawLineTile(program, painter, tile, bucket, layer, coord, programConfiguration, programChanged, tileRatioChanged); prevTileZoom = tile.tileID.overscaledZ; firstTile = false; } }; function drawLineTile(program, painter, tile, bucket, layer, coord, programConfiguration, programChanged, tileRatioChanged) { var context = painter.context; var gl = context.gl; var dasharray = layer.paint.get('line-dasharray'); var image = layer.paint.get('line-pattern'); var posA, posB, imagePosA, imagePosB; if (programChanged || tileRatioChanged) { var tileRatio = 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom); if (dasharray) { posA = painter.lineAtlas.getDash(dasharray.from, layer.layout.get('line-cap') === 'round'); posB = painter.lineAtlas.getDash(dasharray.to, layer.layout.get('line-cap') === 'round'); var widthA = posA.width * dasharray.fromScale; var widthB = posB.width * dasharray.toScale; gl.uniform2f(program.uniforms.u_patternscale_a, tileRatio / widthA, -posA.height / 2); gl.uniform2f(program.uniforms.u_patternscale_b, tileRatio / widthB, -posB.height / 2); gl.uniform1f(program.uniforms.u_sdfgamma, painter.lineAtlas.width / (Math.min(widthA, widthB) * 256 * browser.devicePixelRatio) / 2); } else if (image) { imagePosA = painter.imageManager.getPattern(image.from); imagePosB = painter.imageManager.getPattern(image.to); if (!imagePosA || !imagePosB) { return; } gl.uniform2f(program.uniforms.u_pattern_size_a, imagePosA.displaySize[0] * image.fromScale / tileRatio, imagePosB.displaySize[1]); gl.uniform2f(program.uniforms.u_pattern_size_b, imagePosB.displaySize[0] * image.toScale / tileRatio, imagePosB.displaySize[1]); var ref = painter.imageManager.getPixelSize(); var width = ref.width; var height = ref.height; gl.uniform2fv(program.uniforms.u_texsize, [width, height]); } gl.uniform2f(program.uniforms.u_gl_units_to_pixels, 1 / painter.transform.pixelsToGLUnits[0], 1 / painter.transform.pixelsToGLUnits[1]); } if (programChanged) { if (dasharray) { gl.uniform1i(program.uniforms.u_image, 0); context.activeTexture.set(gl.TEXTURE0); painter.lineAtlas.bind(context); gl.uniform1f(program.uniforms.u_tex_y_a, (posA ).y); gl.uniform1f(program.uniforms.u_tex_y_b, (posB ).y); gl.uniform1f(program.uniforms.u_mix, dasharray.t); } else if (image) { gl.uniform1i(program.uniforms.u_image, 0); context.activeTexture.set(gl.TEXTURE0); painter.imageManager.bind(context); gl.uniform2fv(program.uniforms.u_pattern_tl_a, (imagePosA ).tl); gl.uniform2fv(program.uniforms.u_pattern_br_a, (imagePosA ).br); gl.uniform2fv(program.uniforms.u_pattern_tl_b, (imagePosB ).tl); gl.uniform2fv(program.uniforms.u_pattern_br_b, (imagePosB ).br); gl.uniform1f(program.uniforms.u_fade, image.t); } } context.setStencilMode(painter.stencilModeForClipping(coord)); var posMatrix = painter.translatePosMatrix(coord.posMatrix, tile, layer.paint.get('line-translate'), layer.paint.get('line-translate-anchor')); gl.uniformMatrix4fv(program.uniforms.u_matrix, false, posMatrix); gl.uniform1f(program.uniforms.u_ratio, 1 / pixelsToTileUnits(tile, 1, painter.transform.zoom)); program.draw( context, gl.TRIANGLES, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, programConfiguration); } },{"../gl/depth_mode":72,"../source/pixels_to_tile_units":109,"../util/browser":257}],88:[function(require,module,exports){ 'use strict';// var util = require('../util/util'); var ImageSource = require('../source/image_source'); var browser = require('../util/browser'); var StencilMode = require('../gl/stencil_mode'); var DepthMode = require('../gl/depth_mode'); module.exports = drawRaster; function drawRaster(painter , sourceCache , layer , coords ) { if (painter.renderPass !== 'translucent') { return; } if (layer.paint.get('raster-opacity') === 0) { return; } var context = painter.context; var gl = context.gl; var source = sourceCache.getSource(); var program = painter.useProgram('raster'); context.setStencilMode(StencilMode.disabled); context.setColorMode(painter.colorModeForRenderPass()); // Constant parameters. gl.uniform1f(program.uniforms.u_brightness_low, layer.paint.get('raster-brightness-min')); gl.uniform1f(program.uniforms.u_brightness_high, layer.paint.get('raster-brightness-max')); gl.uniform1f(program.uniforms.u_saturation_factor, saturationFactor(layer.paint.get('raster-saturation'))); gl.uniform1f(program.uniforms.u_contrast_factor, contrastFactor(layer.paint.get('raster-contrast'))); gl.uniform3fv(program.uniforms.u_spin_weights, spinWeights(layer.paint.get('raster-hue-rotate'))); gl.uniform1f(program.uniforms.u_buffer_scale, 1); gl.uniform1i(program.uniforms.u_image0, 0); gl.uniform1i(program.uniforms.u_image1, 1); var minTileZ = coords.length && coords[0].overscaledZ; for (var i = 0, list = coords; i < list.length; i += 1) { // Set the lower zoom level to sublayer 0, and higher zoom levels to higher sublayers // Use gl.LESS to prevent double drawing in areas where tiles overlap. var coord = list[i]; context.setDepthMode(painter.depthModeForSublayer(coord.overscaledZ - minTileZ, layer.paint.get('raster-opacity') === 1 ? DepthMode.ReadWrite : DepthMode.ReadOnly, gl.LESS)); var tile = sourceCache.getTile(coord); var posMatrix = painter.transform.calculatePosMatrix(coord.toUnwrapped(), true); tile.registerFadeDuration(layer.paint.get('raster-fade-duration')); gl.uniformMatrix4fv(program.uniforms.u_matrix, false, posMatrix); var parentTile = sourceCache.findLoadedParent(coord, 0, {}), fade = getFadeValues(tile, parentTile, sourceCache, layer, painter.transform); var parentScaleBy = (void 0), parentTL = (void 0); context.activeTexture.set(gl.TEXTURE0); tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); context.activeTexture.set(gl.TEXTURE1); if (parentTile) { parentTile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); parentScaleBy = Math.pow(2, parentTile.tileID.overscaledZ - tile.tileID.overscaledZ); parentTL = [tile.tileID.canonical.x * parentScaleBy % 1, tile.tileID.canonical.y * parentScaleBy % 1]; } else { tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); } // cross-fade parameters gl.uniform2fv(program.uniforms.u_tl_parent, parentTL || [0, 0]); gl.uniform1f(program.uniforms.u_scale_parent, parentScaleBy || 1); gl.uniform1f(program.uniforms.u_fade_t, fade.mix); gl.uniform1f(program.uniforms.u_opacity, fade.opacity * layer.paint.get('raster-opacity')); if (source instanceof ImageSource) { var buffer = source.boundsBuffer; var vao = source.boundsVAO; vao.bind(context, program, buffer, []); gl.drawArrays(gl.TRIANGLE_STRIP, 0, buffer.length); } else if (tile.maskedBoundsBuffer && tile.maskedIndexBuffer && tile.segments) { program.draw( context, gl.TRIANGLES, layer.id, tile.maskedBoundsBuffer, tile.maskedIndexBuffer, tile.segments ); } else { var buffer$1 = painter.rasterBoundsBuffer; var vao$1 = painter.rasterBoundsVAO; vao$1.bind(context, program, buffer$1, []); gl.drawArrays(gl.TRIANGLE_STRIP, 0, buffer$1.length); } } } function spinWeights(angle) { angle *= Math.PI / 180; var s = Math.sin(angle); var c = Math.cos(angle); return [ (2 * c + 1) / 3, (-Math.sqrt(3) * s - c + 1) / 3, (Math.sqrt(3) * s - c + 1) / 3 ]; } function contrastFactor(contrast) { return contrast > 0 ? 1 / (1 - contrast) : 1 + contrast; } function saturationFactor(saturation) { return saturation > 0 ? 1 - 1 / (1.001 - saturation) : -saturation; } function getFadeValues(tile, parentTile, sourceCache, layer, transform) { var fadeDuration = layer.paint.get('raster-fade-duration'); if (fadeDuration > 0) { var now = browser.now(); var sinceTile = (now - tile.timeAdded) / fadeDuration; var sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1; var source = sourceCache.getSource(); var idealZ = transform.coveringZoomLevel({ tileSize: source.tileSize, roundZoom: source.roundZoom }); // if no parent or parent is older, fade in; if parent is younger, fade out var fadeIn = !parentTile || Math.abs(parentTile.tileID.overscaledZ - idealZ) > Math.abs(tile.tileID.overscaledZ - idealZ); var childOpacity = (fadeIn && tile.refreshedUponExpiration) ? 1 : util.clamp(fadeIn ? sinceTile : 1 - sinceParent, 0, 1); // we don't crossfade tiles that were just refreshed upon expiring: // once they're old enough to pass the crossfading threshold // (fadeDuration), unset the `refreshedUponExpiration` flag so we don't // incorrectly fail to crossfade them when zooming if (tile.refreshedUponExpiration && sinceTile >= 1) { tile.refreshedUponExpiration = false; } if (parentTile) { return { opacity: 1, mix: 1 - childOpacity }; } else { return { opacity: childOpacity, mix: 0 }; } } else { return { opacity: 1, mix: 0 }; } } },{"../gl/depth_mode":72,"../gl/stencil_mode":75,"../source/image_source":107,"../util/browser":257,"../util/util":280}],89:[function(require,module,exports){ 'use strict';// var drawCollisionDebug = require('./draw_collision_debug'); var pixelsToTileUnits = require('../source/pixels_to_tile_units'); var symbolProjection = require('../symbol/projection'); var symbolSize = require('../symbol/symbol_size'); var mat4 = require('@mapbox/gl-matrix').mat4; var identityMat4 = mat4.identity(new Float32Array(16)); var symbolLayoutProperties = require('../style/style_layer/symbol_style_layer_properties').layout; var StencilMode = require('../gl/stencil_mode'); var DepthMode = require('../gl/depth_mode'); module.exports = drawSymbols; function drawSymbols(painter , sourceCache , layer , coords ) { if (painter.renderPass !== 'translucent') { return; } var context = painter.context; // Disable the stencil test so that labels aren't clipped to tile boundaries. context.setStencilMode(StencilMode.disabled); context.setColorMode(painter.colorModeForRenderPass()); if (layer.paint.get('icon-opacity').constantOr(1) !== 0) { drawLayerSymbols(painter, sourceCache, layer, coords, false, layer.paint.get('icon-translate'), layer.paint.get('icon-translate-anchor'), layer.layout.get('icon-rotation-alignment'), layer.layout.get('icon-pitch-alignment'), layer.layout.get('icon-keep-upright') ); } if (layer.paint.get('text-opacity').constantOr(1) !== 0) { drawLayerSymbols(painter, sourceCache, layer, coords, true, layer.paint.get('text-translate'), layer.paint.get('text-translate-anchor'), layer.layout.get('text-rotation-alignment'), layer.layout.get('text-pitch-alignment'), layer.layout.get('text-keep-upright') ); } if (sourceCache.map.showCollisionBoxes) { drawCollisionDebug(painter, sourceCache, layer, coords); } } function drawLayerSymbols(painter, sourceCache, layer, coords, isText, translate, translateAnchor, rotationAlignment, pitchAlignment, keepUpright) { var context = painter.context; var gl = context.gl; var tr = painter.transform; var rotateWithMap = rotationAlignment === 'map'; var pitchWithMap = pitchAlignment === 'map'; var alongLine = rotateWithMap && layer.layout.get('symbol-placement') === 'line'; // Line label rotation happens in `updateLineLabels` // Pitched point labels are automatically rotated by the labelPlaneMatrix projection // Unpitched point labels need to have their rotation applied after projection var rotateInShader = rotateWithMap && !pitchWithMap && !alongLine; var depthOn = pitchWithMap; context.setDepthMode(depthOn ? painter.depthModeForSublayer(0, DepthMode.ReadOnly) : DepthMode.disabled); var program; for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; var tile = sourceCache.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var buffers = isText ? bucket.text : bucket.icon; if (!buffers || !buffers.segments.get().length) { continue; } var programConfiguration = buffers.programConfigurations.get(layer.id); var isSDF = isText || bucket.sdfIcons; var sizeData = isText ? bucket.textSizeData : bucket.iconSizeData; if (!program) { program = painter.useProgram(isSDF ? 'symbolSDF' : 'symbolIcon', programConfiguration); programConfiguration.setUniforms(painter.context, program, layer.paint, {zoom: painter.transform.zoom}); setSymbolDrawState(program, painter, layer, isText, rotateInShader, pitchWithMap, sizeData); } context.activeTexture.set(gl.TEXTURE0); gl.uniform1i(program.uniforms.u_texture, 0); if (isText) { tile.glyphAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); gl.uniform2fv(program.uniforms.u_texsize, tile.glyphAtlasTexture.size); } else { var iconScaled = layer.layout.get('icon-size').constantOr(0) !== 1 || bucket.iconsNeedLinear; var iconTransformed = pitchWithMap || tr.pitch !== 0; tile.iconAtlasTexture.bind(isSDF || painter.options.rotating || painter.options.zooming || iconScaled || iconTransformed ? gl.LINEAR : gl.NEAREST, gl.CLAMP_TO_EDGE); gl.uniform2fv(program.uniforms.u_texsize, tile.iconAtlasTexture.size); } gl.uniformMatrix4fv(program.uniforms.u_matrix, false, painter.translatePosMatrix(coord.posMatrix, tile, translate, translateAnchor)); var s = pixelsToTileUnits(tile, 1, painter.transform.zoom); var labelPlaneMatrix = symbolProjection.getLabelPlaneMatrix(coord.posMatrix, pitchWithMap, rotateWithMap, painter.transform, s); var glCoordMatrix = symbolProjection.getGlCoordMatrix(coord.posMatrix, pitchWithMap, rotateWithMap, painter.transform, s); gl.uniformMatrix4fv(program.uniforms.u_gl_coord_matrix, false, painter.translatePosMatrix(glCoordMatrix, tile, translate, translateAnchor, true)); if (alongLine) { gl.uniformMatrix4fv(program.uniforms.u_label_plane_matrix, false, identityMat4); symbolProjection.updateLineLabels(bucket, coord.posMatrix, painter, isText, labelPlaneMatrix, glCoordMatrix, pitchWithMap, keepUpright); } else { gl.uniformMatrix4fv(program.uniforms.u_label_plane_matrix, false, labelPlaneMatrix); } gl.uniform1f(program.uniforms.u_fade_change, painter.options.fadeDuration ? painter.symbolFadeChange : 1); drawTileSymbols(program, programConfiguration, painter, layer, tile, buffers, isText, isSDF, pitchWithMap); } } function setSymbolDrawState(program, painter, layer, isText, rotateInShader, pitchWithMap, sizeData) { var gl = painter.context.gl; var tr = painter.transform; gl.uniform1i(program.uniforms.u_pitch_with_map, pitchWithMap ? 1 : 0); gl.uniform1f(program.uniforms.u_is_text, isText ? 1 : 0); gl.uniform1f(program.uniforms.u_pitch, tr.pitch / 360 * 2 * Math.PI); var isZoomConstant = sizeData.functionType === 'constant' || sizeData.functionType === 'source'; var isFeatureConstant = sizeData.functionType === 'constant' || sizeData.functionType === 'camera'; gl.uniform1i(program.uniforms.u_is_size_zoom_constant, isZoomConstant ? 1 : 0); gl.uniform1i(program.uniforms.u_is_size_feature_constant, isFeatureConstant ? 1 : 0); gl.uniform1f(program.uniforms.u_camera_to_center_distance, tr.cameraToCenterDistance); var size = symbolSize.evaluateSizeForZoom(sizeData, tr.zoom, symbolLayoutProperties.properties[isText ? 'text-size' : 'icon-size']); if (size.uSizeT !== undefined) { gl.uniform1f(program.uniforms.u_size_t, size.uSizeT); } if (size.uSize !== undefined) { gl.uniform1f(program.uniforms.u_size, size.uSize); } gl.uniform1f(program.uniforms.u_aspect_ratio, tr.width / tr.height); gl.uniform1i(program.uniforms.u_rotate_symbol, rotateInShader ? 1 : 0); } function drawTileSymbols(program, programConfiguration, painter, layer, tile, buffers, isText, isSDF, pitchWithMap) { var context = painter.context; var gl = context.gl; var tr = painter.transform; if (isSDF) { var hasHalo = layer.paint.get(isText ? 'text-halo-width' : 'icon-halo-width').constantOr(1) !== 0; var gammaScale = (pitchWithMap ? Math.cos(tr._pitch) * tr.cameraToCenterDistance : 1); gl.uniform1f(program.uniforms.u_gamma_scale, gammaScale); if (hasHalo) { // Draw halo underneath the text. gl.uniform1f(program.uniforms.u_is_halo, 1); drawSymbolElements(buffers, layer, context, program); } gl.uniform1f(program.uniforms.u_is_halo, 0); } drawSymbolElements(buffers, layer, context, program); } function drawSymbolElements(buffers, layer, context, program) { program.draw( context, context.gl.TRIANGLES, layer.id, buffers.layoutVertexBuffer, buffers.indexBuffer, buffers.segments, buffers.programConfigurations.get(layer.id), buffers.dynamicLayoutVertexBuffer, buffers.opacityVertexBuffer); } },{"../gl/depth_mode":72,"../gl/stencil_mode":75,"../source/pixels_to_tile_units":109,"../style/style_layer/symbol_style_layer_properties":214,"../symbol/projection":229,"../symbol/symbol_size":233,"./draw_collision_debug":81,"@mapbox/gl-matrix":2}],90:[function(require,module,exports){ 'use strict';// var ShelfPack = require('@mapbox/shelf-pack'); var ref = require('../util/image'); var AlphaImage = ref.AlphaImage; var padding = 1; function makeGlyphAtlas(stacks ) { var image = new AlphaImage({width: 0, height: 0}); var positions = {}; var pack = new ShelfPack(0, 0, {autoResize: true}); for (var stack in stacks) { var glyphs = stacks[stack]; var stackPositions = positions[stack] = {}; for (var id in glyphs) { var src = glyphs[+id]; if (src && src.bitmap.width !== 0 && src.bitmap.height !== 0) { var bin = pack.packOne( src.bitmap.width + 2 * padding, src.bitmap.height + 2 * padding); image.resize({ width: pack.w, height: pack.h }); AlphaImage.copy( src.bitmap, image, { x: 0, y: 0 }, { x: bin.x + padding, y: bin.y + padding }, src.bitmap); stackPositions[id] = { rect: bin, metrics: src.metrics }; } } } pack.shrink(); image.resize({ width: pack.w, height: pack.h }); return {image: image, positions: positions}; } module.exports = { makeGlyphAtlas: makeGlyphAtlas }; },{"../util/image":268,"@mapbox/shelf-pack":5}],91:[function(require,module,exports){ 'use strict';// var loadGlyphRange = require('../style/load_glyph_range'); var TinySDF = require('@mapbox/tiny-sdf'); var isChar = require('../util/is_char_in_unicode_block'); var ref = require('../util/util'); var asyncAll = ref.asyncAll; var ref$1 = require('../util/image'); var AlphaImage = ref$1.AlphaImage; var GlyphManager = function GlyphManager(requestTransform , localIdeographFontFamily ) { this.requestTransform = requestTransform; this.localIdeographFontFamily = localIdeographFontFamily; this.entries = {}; }; GlyphManager.prototype.setURL = function setURL (url ) { this.url = url; }; GlyphManager.prototype.getGlyphs = function getGlyphs (glyphs , callback ) { var this$1 = this; var all = []; for (var stack in glyphs) { for (var i = 0, list = glyphs[stack]; i < list.length; i += 1) { var id = list[i]; all.push({stack: stack, id: id}); } } asyncAll(all, function (ref, callback ) { var stack = ref.stack; var id = ref.id; var entry = this$1.entries[stack]; if (!entry) { entry = this$1.entries[stack] = { glyphs: {}, requests: {} }; } var glyph = entry.glyphs[id]; if (glyph !== undefined) { callback(null, {stack: stack, id: id, glyph: glyph}); return; } glyph = this$1._tinySDF(entry, stack, id); if (glyph) { callback(null, {stack: stack, id: id, glyph: glyph}); return; } var range = Math.floor(id / 256); if (range * 256 > 65535) { callback(new Error('glyphs > 65535 not supported')); return; } var requests = entry.requests[range]; if (!requests) { requests = entry.requests[range] = []; loadGlyphRange(stack, range, (this$1.url ), this$1.requestTransform, function (err, response ) { if (response) { for (var id in response) { entry.glyphs[+id] = response[+id]; } } for (var i = 0, list = requests; i < list.length; i += 1) { var cb = list[i]; cb(err, response); } delete entry.requests[range]; }); } requests.push(function (err, result ) { if (err) { callback(err); } else if (result) { callback(null, {stack: stack, id: id, glyph: result[id] || null}); } }); }, function (err, glyphs ) { if (err) { callback(err); } else if (glyphs) { var result = {}; for (var i = 0, list = glyphs; i < list.length; i += 1) { // Clone the glyph so that our own copy of its ArrayBuffer doesn't get transferred. var ref = list[i]; var stack = ref.stack; var id = ref.id; var glyph = ref.glyph; (result[stack] || (result[stack] = {}))[id] = glyph && { id: glyph.id, bitmap: glyph.bitmap.clone(), metrics: glyph.metrics }; } callback(null, result); } }); }; GlyphManager.prototype._tinySDF = function _tinySDF (entry , stack , id ) { var family = this.localIdeographFontFamily; if (!family) { return; } if (!isChar['CJK Unified Ideographs'](id) && !isChar['Hangul Syllables'](id)) { // eslint-disable-line new-cap return; } var tinySDF = entry.tinySDF; if (!tinySDF) { var fontWeight = '400'; if (/bold/i.test(stack)) { fontWeight = '900'; } else if (/medium/i.test(stack)) { fontWeight = '500'; } else if (/light/i.test(stack)) { fontWeight = '200'; } tinySDF = entry.tinySDF = new TinySDF(24, 3, 8, .25, family, fontWeight); } return { id: id, bitmap: new AlphaImage({width: 30, height: 30}, tinySDF.draw(String.fromCharCode(id))), metrics: { width: 24, height: 24, left: 0, top: -8, advance: 24 } }; }; module.exports = GlyphManager; },{"../style/load_glyph_range":189,"../util/image":268,"../util/is_char_in_unicode_block":270,"../util/util":280,"@mapbox/tiny-sdf":6}],92:[function(require,module,exports){ 'use strict';// var ShelfPack = require('@mapbox/shelf-pack'); var ref = require('../util/image'); var RGBAImage = ref.RGBAImage; var padding = 1; // This wants to be a class, but is sent to workers, so must be a plain JSON blob. function imagePosition(rect , ref ) { var pixelRatio = ref.pixelRatio; var textureRect = { x: rect.x + padding, y: rect.y + padding, w: rect.w - padding * 2, h: rect.h - padding * 2 }; return { pixelRatio: pixelRatio, textureRect: textureRect, // Redundant calculated members. tl: [ textureRect.x, textureRect.y ], br: [ textureRect.x + textureRect.w, textureRect.y + textureRect.h ], displaySize: [ textureRect.w / pixelRatio, textureRect.h / pixelRatio ] }; } function makeImageAtlas(images ) { var image = new RGBAImage({width: 0, height: 0}); var positions = {}; var pack = new ShelfPack(0, 0, {autoResize: true}); for (var id in images) { var src = images[id]; var bin = pack.packOne( src.data.width + 2 * padding, src.data.height + 2 * padding); image.resize({ width: pack.w, height: pack.h }); RGBAImage.copy( src.data, image, { x: 0, y: 0 }, { x: bin.x + padding, y: bin.y + padding }, src.data); positions[id] = imagePosition(bin, src); } pack.shrink(); image.resize({ width: pack.w, height: pack.h }); return {image: image, positions: positions}; } module.exports = { imagePosition: imagePosition, makeImageAtlas: makeImageAtlas }; },{"../util/image":268,"@mapbox/shelf-pack":5}],93:[function(require,module,exports){ 'use strict';// var ShelfPack = require('@mapbox/shelf-pack'); var ref = require('../util/image'); var RGBAImage = ref.RGBAImage; var ref$1 = require('./image_atlas'); var imagePosition = ref$1.imagePosition; var Texture = require('./texture'); var assert = require('assert'); // When copied into the atlas texture, image data is padded by one pixel on each side. Icon // images are padded with fully transparent pixels, while pattern images are padded with a // copy of the image data wrapped from the opposite side. In both cases, this ensures the // correct behavior of GL_LINEAR texture sampling mode. var padding = 1; /* ImageManager does two things: 1. Tracks requests for icon images from tile workers and sends responses when the requests are fulfilled. 2. Builds a texture atlas for pattern images. These are disparate responsibilities and should eventually be handled by different classes. When we implement data-driven support for `*-pattern`, we'll likely use per-bucket pattern atlases, and that would be a good time to refactor this. */ var ImageManager = function ImageManager() { this.images = {}; this.loaded = false; this.requestors = []; this.shelfPack = new ShelfPack(64, 64, {autoResize: true}); this.patterns = {}; this.atlasImage = new RGBAImage({width: 64, height: 64}); this.dirty = true; }; ImageManager.prototype.isLoaded = function isLoaded () { return this.loaded; }; ImageManager.prototype.setLoaded = function setLoaded (loaded ) { var this$1 = this; if (this.loaded === loaded) { return; } this.loaded = loaded; if (loaded) { for (var i = 0, list = this$1.requestors; i < list.length; i += 1) { var ref = list[i]; var ids = ref.ids; var callback = ref.callback; this$1._notify(ids, callback); } this.requestors = []; } }; ImageManager.prototype.getImage = function getImage (id ) { return this.images[id]; }; ImageManager.prototype.addImage = function addImage (id , image ) { assert(!this.images[id]); this.images[id] = image; }; ImageManager.prototype.removeImage = function removeImage (id ) { assert(this.images[id]); delete this.images[id]; var pattern = this.patterns[id]; if (pattern) { this.shelfPack.unref(pattern.bin); delete this.patterns[id]; } }; ImageManager.prototype.getImages = function getImages (ids , callback ) { var this$1 = this; // If the sprite has been loaded, or if all the icon dependencies are already present // (i.e. if they've been addeded via runtime styling), then notify the requestor immediately. // Otherwise, delay notification until the sprite is loaded. At that point, if any of the // dependencies are still unavailable, we'll just assume they are permanently missing. var hasAllDependencies = true; if (!this.isLoaded()) { for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; if (!this$1.images[id]) { hasAllDependencies = false; } } } if (this.isLoaded() || hasAllDependencies) { this._notify(ids, callback); } else { this.requestors.push({ids: ids, callback: callback}); } }; ImageManager.prototype._notify = function _notify (ids , callback ) { var this$1 = this; var response = {}; for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; var image = this$1.images[id]; if (image) { // Clone the image so that our own copy of its ArrayBuffer doesn't get transferred. response[id] = { data: image.data.clone(), pixelRatio: image.pixelRatio, sdf: image.sdf }; } } callback(null, response); }; // Pattern stuff ImageManager.prototype.getPixelSize = function getPixelSize () { return { width: this.shelfPack.w, height: this.shelfPack.h }; }; ImageManager.prototype.getPattern = function getPattern (id ) { var pattern = this.patterns[id]; if (pattern) { return pattern.position; } var image = this.getImage(id); if (!image) { return null; } var width = image.data.width + padding * 2; var height = image.data.height + padding * 2; var bin = this.shelfPack.packOne(width, height); if (!bin) { return null; } this.atlasImage.resize(this.getPixelSize()); var src = image.data; var dst = this.atlasImage; var x = bin.x + padding; var y = bin.y + padding; var w = src.width; var h = src.height; RGBAImage.copy(src, dst, { x: 0, y: 0 }, { x: x, y: y }, { width: w, height: h }); // Add 1 pixel wrapped padding on each side of the image. RGBAImage.copy(src, dst, { x: 0, y: h - 1 }, { x: x, y: y - 1 }, { width: w, height: 1 }); // T RGBAImage.copy(src, dst, { x: 0, y: 0 }, { x: x, y: y + h }, { width: w, height: 1 }); // B RGBAImage.copy(src, dst, { x: w - 1, y: 0 }, { x: x - 1, y: y }, { width: 1, height: h }); // L RGBAImage.copy(src, dst, { x: 0, y: 0 }, { x: x + w, y: y }, { width: 1, height: h }); // R this.dirty = true; var position = imagePosition(bin, image); this.patterns[id] = { bin: bin, position: position }; return position; }; ImageManager.prototype.bind = function bind (context ) { var gl = context.gl; if (!this.atlasTexture) { this.atlasTexture = new Texture(context, this.atlasImage, gl.RGBA); } else if (this.dirty) { this.atlasTexture.update(this.atlasImage); this.dirty = false; } this.atlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); }; module.exports = ImageManager; },{"../util/image":268,"./image_atlas":92,"./texture":98,"@mapbox/shelf-pack":5,"assert":13}],94:[function(require,module,exports){ 'use strict';// var util = require('../util/util'); /** * A LineAtlas lets us reuse rendered dashed lines * by writing many of them to a texture and then fetching their positions * using .getDash. * * @param {number} width * @param {number} height * @private */ var LineAtlas = function LineAtlas(width , height ) { this.width = width; this.height = height; this.nextRow = 0; this.bytes = 4; this.data = new Uint8Array(this.width * this.height * this.bytes); this.positions = {}; }; /** * Get or create a dash line pattern. * * @param {Array} dasharray * @param {boolean} round whether to add circle caps in between dash segments * @returns {Object} position of dash texture in { y, height, width } * @private */ LineAtlas.prototype.getDash = function getDash (dasharray , round ) { var key = dasharray.join(",") + String(round); if (!this.positions[key]) { this.positions[key] = this.addDash(dasharray, round); } return this.positions[key]; }; LineAtlas.prototype.addDash = function addDash (dasharray , round ) { var this$1 = this; var n = round ? 7 : 0; var height = 2 * n + 1; var offset = 128; if (this.nextRow + height > this.height) { util.warnOnce('LineAtlas out of space'); return null; } var length = 0; for (var i = 0; i < dasharray.length; i++) { length += dasharray[i]; } var stretch = this.width / length; var halfWidth = stretch / 2; // If dasharray has an odd length, both the first and last parts // are dashes and should be joined seamlessly. var oddLength = dasharray.length % 2 === 1; for (var y = -n; y <= n; y++) { var row = this$1.nextRow + n + y; var index = this$1.width * row; var left = oddLength ? -dasharray[dasharray.length - 1] : 0; var right = dasharray[0]; var partIndex = 1; for (var x = 0; x < this.width; x++) { while (right < x / stretch) { left = right; right = right + dasharray[partIndex]; if (oddLength && partIndex === dasharray.length - 1) { right += dasharray[0]; } partIndex++; } var distLeft = Math.abs(x - left * stretch); var distRight = Math.abs(x - right * stretch); var dist = Math.min(distLeft, distRight); var inside = (partIndex % 2) === 1; var signedDistance = (void 0); if (round) { // Add circle caps var distMiddle = n ? y / n * (halfWidth + 1) : 0; if (inside) { var distEdge = halfWidth - Math.abs(distMiddle); signedDistance = Math.sqrt(dist * dist + distEdge * distEdge); } else { signedDistance = halfWidth - Math.sqrt(dist * dist + distMiddle * distMiddle); } } else { signedDistance = (inside ? 1 : -1) * dist; } this$1.data[3 + (index + x) * 4] = Math.max(0, Math.min(255, signedDistance + offset)); } } var pos = { y: (this.nextRow + n + 0.5) / this.height, height: 2 * n / this.height, width: length }; this.nextRow += height; this.dirty = true; return pos; }; LineAtlas.prototype.bind = function bind (context ) { var gl = context.gl; if (!this.texture) { this.texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.data); } else { gl.bindTexture(gl.TEXTURE_2D, this.texture); if (this.dirty) { this.dirty = false; gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.RGBA, gl.UNSIGNED_BYTE, this.data); } } }; module.exports = LineAtlas; },{"../util/util":280}],95:[function(require,module,exports){ 'use strict';// var browser = require('../util/browser'); var mat4 = require('@mapbox/gl-matrix').mat4; var SourceCache = require('../source/source_cache'); var EXTENT = require('../data/extent'); var pixelsToTileUnits = require('../source/pixels_to_tile_units'); var util = require('../util/util'); var VertexArrayObject = require('./vertex_array_object'); var ref = require('../data/array_types'); var RasterBoundsArray = ref.RasterBoundsArray; var PosArray = ref.PosArray; var rasterBoundsAttributes = require('../data/raster_bounds_attributes'); var posAttributes = require('../data/pos_attributes'); var ref$1 = require('../data/program_configuration'); var ProgramConfiguration = ref$1.ProgramConfiguration; var CrossTileSymbolIndex = require('../symbol/cross_tile_symbol_index'); var shaders = require('../shaders'); var Program = require('./program'); var Context = require('../gl/context'); var DepthMode = require('../gl/depth_mode'); var StencilMode = require('../gl/stencil_mode'); var ColorMode = require('../gl/color_mode'); var Texture = require('./texture'); var updateTileMasks = require('./tile_mask'); var Color = require('../style-spec/util/color'); var draw = { symbol: require('./draw_symbol'), circle: require('./draw_circle'), heatmap: require('./draw_heatmap'), line: require('./draw_line'), fill: require('./draw_fill'), 'fill-extrusion': require('./draw_fill_extrusion'), hillshade: require('./draw_hillshade'), raster: require('./draw_raster'), background: require('./draw_background'), debug: require('./draw_debug') }; /** * Initialize a new painter object. * * @param {Canvas} gl an experimental-webgl drawing context * @private */ var Painter = function Painter(gl , transform ) { this.context = new Context(gl); this.transform = transform; this._tileTextures = {}; this.setup(); // Within each layer there are multiple distinct z-planes that can be drawn to. // This is implemented using the WebGL depth buffer. this.numSublayers = SourceCache.maxUnderzooming + SourceCache.maxOverzooming + 1; this.depthEpsilon = 1 / Math.pow(2, 16); this.depthRboNeedsClear = true; this.emptyProgramConfiguration = new ProgramConfiguration(); this.crossTileSymbolIndex = new CrossTileSymbolIndex(); }; /* * Update the GL viewport, projection matrix, and transforms to compensate * for a new width and height value. */ Painter.prototype.resize = function resize (width , height ) { var this$1 = this; var gl = this.context.gl; this.width = width * browser.devicePixelRatio; this.height = height * browser.devicePixelRatio; this.context.viewport.set([0, 0, this.width, this.height]); if (this.style) { for (var i = 0, list = this$1.style._order; i < list.length; i += 1) { var layerId = list[i]; this$1.style._layers[layerId].resize(); } } if (this.depthRbo) { gl.deleteRenderbuffer(this.depthRbo); this.depthRbo = null; } }; Painter.prototype.setup = function setup () { var context = this.context; var tileExtentArray = new PosArray(); tileExtentArray.emplaceBack(0, 0); tileExtentArray.emplaceBack(EXTENT, 0); tileExtentArray.emplaceBack(0, EXTENT); tileExtentArray.emplaceBack(EXTENT, EXTENT); this.tileExtentBuffer = context.createVertexBuffer(tileExtentArray, posAttributes.members); this.tileExtentVAO = new VertexArrayObject(); this.tileExtentPatternVAO = new VertexArrayObject(); var debugArray = new PosArray(); debugArray.emplaceBack(0, 0); debugArray.emplaceBack(EXTENT, 0); debugArray.emplaceBack(EXTENT, EXTENT); debugArray.emplaceBack(0, EXTENT); debugArray.emplaceBack(0, 0); this.debugBuffer = context.createVertexBuffer(debugArray, posAttributes.members); this.debugVAO = new VertexArrayObject(); var rasterBoundsArray = new RasterBoundsArray(); rasterBoundsArray.emplaceBack(0, 0, 0, 0); rasterBoundsArray.emplaceBack(EXTENT, 0, EXTENT, 0); rasterBoundsArray.emplaceBack(0, EXTENT, 0, EXTENT); rasterBoundsArray.emplaceBack(EXTENT, EXTENT, EXTENT, EXTENT); this.rasterBoundsBuffer = context.createVertexBuffer(rasterBoundsArray, rasterBoundsAttributes.members); this.rasterBoundsVAO = new VertexArrayObject(); var viewportArray = new PosArray(); viewportArray.emplaceBack(0, 0); viewportArray.emplaceBack(1, 0); viewportArray.emplaceBack(0, 1); viewportArray.emplaceBack(1, 1); this.viewportBuffer = context.createVertexBuffer(viewportArray, posAttributes.members); this.viewportVAO = new VertexArrayObject(); }; /* * Reset the drawing canvas by clearing the stencil buffer so that we can draw * new tiles at the same location, while retaining previously drawn pixels. */ Painter.prototype.clearStencil = function clearStencil () { var context = this.context; var gl = context.gl; // As a temporary workaround for https://github.com/mapbox/mapbox-gl-js/issues/5490, // pending an upstream fix, we draw a fullscreen stencil=0 clipping mask here, // effectively clearing the stencil buffer: once an upstream patch lands, remove // this function in favor of context.clear({ stencil: 0x0 }) context.setColorMode(ColorMode.disabled); context.setDepthMode(DepthMode.disabled); context.setStencilMode(new StencilMode({ func: gl.ALWAYS, mask: 0 }, 0x0, 0xFF, gl.ZERO, gl.ZERO, gl.ZERO)); var matrix = mat4.create(); mat4.ortho(matrix, 0, this.width, this.height, 0, 0, 1); mat4.scale(matrix, matrix, [gl.drawingBufferWidth, gl.drawingBufferHeight, 0]); var program = this.useProgram('clippingMask'); gl.uniformMatrix4fv(program.uniforms.u_matrix, false, matrix); this.viewportVAO.bind(context, program, this.viewportBuffer, []); gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); }; Painter.prototype._renderTileClippingMasks = function _renderTileClippingMasks (tileIDs ) { var this$1 = this; var context = this.context; var gl = context.gl; context.setColorMode(ColorMode.disabled); context.setDepthMode(DepthMode.disabled); var idNext = 1; this._tileClippingMaskIDs = {}; for (var i = 0, list = tileIDs; i < list.length; i += 1) { var tileID = list[i]; var id = this$1._tileClippingMaskIDs[tileID.key] = idNext++; // Tests will always pass, and ref value will be written to stencil buffer. context.setStencilMode(new StencilMode({ func: gl.ALWAYS, mask: 0 }, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE)); var program = this$1.useProgram('clippingMask'); gl.uniformMatrix4fv(program.uniforms.u_matrix, false, tileID.posMatrix); // Draw the clipping mask this$1.tileExtentVAO.bind(this$1.context, program, this$1.tileExtentBuffer, []); gl.drawArrays(gl.TRIANGLE_STRIP, 0, this$1.tileExtentBuffer.length); } }; Painter.prototype.stencilModeForClipping = function stencilModeForClipping (tileID ) { var gl = this.context.gl; return new StencilMode({ func: gl.EQUAL, mask: 0xFF }, this._tileClippingMaskIDs[tileID.key], 0x00, gl.KEEP, gl.KEEP, gl.REPLACE); }; Painter.prototype.colorModeForRenderPass = function colorModeForRenderPass () { var gl = this.context.gl; if (this._showOverdrawInspector) { var numOverdrawSteps = 8; var a = 1 / numOverdrawSteps; return new ColorMode([gl.CONSTANT_COLOR, gl.ONE], new Color(a, a, a, 0), [true, true, true, true]); } else if (this.renderPass === 'opaque') { return ColorMode.unblended; } else { return ColorMode.alphaBlended; } }; Painter.prototype.depthModeForSublayer = function depthModeForSublayer (n , mask , func ) { var farDepth = 1 - ((1 + this.currentLayer) * this.numSublayers + n) * this.depthEpsilon; var nearDepth = farDepth - 1 + this.depthRange; return new DepthMode(func || this.context.gl.LEQUAL, mask, [nearDepth, farDepth]); }; Painter.prototype.render = function render (style , options ) { var this$1 = this; this.style = style; this.options = options; this.lineAtlas = style.lineAtlas; this.imageManager = style.imageManager; this.glyphManager = style.glyphManager; this.symbolFadeChange = style.placement.symbolFadeChange(browser.now()); for (var id in style.sourceCaches) { var sourceCache = this$1.style.sourceCaches[id]; if (sourceCache.used) { sourceCache.prepare(this$1.context); } } var layerIds = this.style._order; var rasterSources = util.filterObject(this.style.sourceCaches, function (sc) { return sc.getSource().type === 'raster' || sc.getSource().type === 'raster-dem'; }); var loop = function ( key ) { var sourceCache$1 = rasterSources[key]; var coords = sourceCache$1.getVisibleCoordinates(); var visibleTiles = coords.map(function (c){ return sourceCache$1.getTile(c); }); updateTileMasks(visibleTiles, this$1.context); }; for (var key in rasterSources) loop( key ); // Offscreen pass // We first do all rendering that requires rendering to a separate // framebuffer, and then save those for rendering back to the map // later: in doing this we avoid doing expensive framebuffer restores. this.renderPass = 'offscreen'; { var sourceCache$2; var coords$1 = []; this.depthRboNeedsClear = true; for (var i = 0; i < layerIds.length; i++) { var layer = this$1.style._layers[layerIds[i]]; if (!layer.hasOffscreenPass() || layer.isHidden(this$1.transform.zoom)) { continue; } if (layer.source !== (sourceCache$2 && sourceCache$2.id)) { sourceCache$2 = this$1.style.sourceCaches[layer.source]; coords$1 = []; if (sourceCache$2) { coords$1 = sourceCache$2.getVisibleCoordinates(); coords$1.reverse(); } } if (!coords$1.length) { continue; } this$1.renderLayer(this$1, (sourceCache$2 ), layer, coords$1); } // Rebind the main framebuffer now that all offscreen layers // have been rendered: this.context.bindFramebuffer.set(null); } // Clear buffers in preparation for drawing to the main framebuffer this.context.clear({ color: options.showOverdrawInspector ? Color.black : Color.transparent, depth: 1 }); this._showOverdrawInspector = options.showOverdrawInspector; this.depthRange = (style._order.length + 2) * this.numSublayers * this.depthEpsilon; // Opaque pass // Draw opaque layers top-to-bottom first. this.renderPass = 'opaque'; { var sourceCache$3; var coords$2 = []; this.currentLayer = layerIds.length - 1; for (this.currentLayer; this.currentLayer >= 0; this.currentLayer--) { var layer$1 = this$1.style._layers[layerIds[this$1.currentLayer]]; if (layer$1.source !== (sourceCache$3 && sourceCache$3.id)) { sourceCache$3 = this$1.style.sourceCaches[layer$1.source]; coords$2 = []; if (sourceCache$3) { this$1.clearStencil(); coords$2 = sourceCache$3.getVisibleCoordinates(); if (sourceCache$3.getSource().isTileClipped) { this$1._renderTileClippingMasks(coords$2); } } } this$1.renderLayer(this$1, (sourceCache$3 ), layer$1, coords$2); } } // Translucent pass // Draw all other layers bottom-to-top. this.renderPass = 'translucent'; { var sourceCache$4; var coords$3 = []; this.currentLayer = 0; for (this.currentLayer; this.currentLayer < layerIds.length; this.currentLayer++) { var layer$2 = this$1.style._layers[layerIds[this$1.currentLayer]]; if (layer$2.source !== (sourceCache$4 && sourceCache$4.id)) { sourceCache$4 = this$1.style.sourceCaches[layer$2.source]; coords$3 = []; if (sourceCache$4) { this$1.clearStencil(); coords$3 = sourceCache$4.getVisibleCoordinates(); if (sourceCache$4.getSource().isTileClipped) { this$1._renderTileClippingMasks(coords$3); } } coords$3.reverse(); } this$1.renderLayer(this$1, (sourceCache$4 ), layer$2, coords$3); } } if (this.options.showTileBoundaries) { var sourceCache$5 = this.style.sourceCaches[Object.keys(this.style.sourceCaches)[0]]; if (sourceCache$5) { draw.debug(this, sourceCache$5, sourceCache$5.getVisibleCoordinates()); } } }; Painter.prototype.setupOffscreenDepthRenderbuffer = function setupOffscreenDepthRenderbuffer () { var context = this.context; // All of the 3D textures will use the same depth renderbuffer. if (!this.depthRbo) { this.depthRbo = context.createRenderbuffer(context.gl.DEPTH_COMPONENT16, this.width, this.height); } }; Painter.prototype.renderLayer = function renderLayer (painter , sourceCache , layer , coords ) { if (layer.isHidden(this.transform.zoom)) { return; } if (layer.type !== 'background' && !coords.length) { return; } this.id = layer.id; draw[layer.type](painter, sourceCache, layer, coords); }; /** * Transform a matrix to incorporate the *-translate and *-translate-anchor properties into it. * @param inViewportPixelUnitsUnits True when the units accepted by the matrix are in viewport pixels instead of tile units. * @returns {Float32Array} matrix */ Painter.prototype.translatePosMatrix = function translatePosMatrix (matrix , tile , translate , translateAnchor , inViewportPixelUnitsUnits ) { if (!translate[0] && !translate[1]) { return matrix; } var angle = inViewportPixelUnitsUnits ? (translateAnchor === 'map' ? this.transform.angle : 0) : (translateAnchor === 'viewport' ? -this.transform.angle : 0); if (angle) { var sinA = Math.sin(angle); var cosA = Math.cos(angle); translate = [ translate[0] * cosA - translate[1] * sinA, translate[0] * sinA + translate[1] * cosA ]; } var translation = [ inViewportPixelUnitsUnits ? translate[0] : pixelsToTileUnits(tile, translate[0], this.transform.zoom), inViewportPixelUnitsUnits ? translate[1] : pixelsToTileUnits(tile, translate[1], this.transform.zoom), 0 ]; var translatedMatrix = new Float32Array(16); mat4.translate(translatedMatrix, matrix, translation); return translatedMatrix; }; Painter.prototype.saveTileTexture = function saveTileTexture (texture ) { var textures = this._tileTextures[texture.size[0]]; if (!textures) { this._tileTextures[texture.size[0]] = [texture]; } else { textures.push(texture); } }; Painter.prototype.getTileTexture = function getTileTexture (size ) { var textures = this._tileTextures[size]; return textures && textures.length > 0 ? textures.pop() : null; }; Painter.prototype._createProgramCached = function _createProgramCached (name , programConfiguration ) { this.cache = this.cache || {}; var key = "" + name + (programConfiguration.cacheKey || '') + (this._showOverdrawInspector ? '/overdraw' : ''); if (!this.cache[key]) { this.cache[key] = new Program(this.context, shaders[name], programConfiguration, this._showOverdrawInspector); } return this.cache[key]; }; Painter.prototype.useProgram = function useProgram (name , programConfiguration ) { var nextProgram = this._createProgramCached(name, programConfiguration || this.emptyProgramConfiguration); this.context.program.set(nextProgram.program); return nextProgram; }; module.exports = Painter; },{"../data/array_types":44,"../data/extent":58,"../data/pos_attributes":62,"../data/program_configuration":63,"../data/raster_bounds_attributes":64,"../gl/color_mode":70,"../gl/context":71,"../gl/depth_mode":72,"../gl/stencil_mode":75,"../shaders":102,"../source/pixels_to_tile_units":109,"../source/source_cache":116,"../style-spec/util/color":158,"../symbol/cross_tile_symbol_index":223,"../util/browser":257,"../util/util":280,"./draw_background":79,"./draw_circle":80,"./draw_debug":82,"./draw_fill":83,"./draw_fill_extrusion":84,"./draw_heatmap":85,"./draw_hillshade":86,"./draw_line":87,"./draw_raster":88,"./draw_symbol":89,"./program":97,"./texture":98,"./tile_mask":99,"./vertex_array_object":100,"@mapbox/gl-matrix":2}],96:[function(require,module,exports){ 'use strict';// var assert = require('assert'); var pixelsToTileUnits = require('../source/pixels_to_tile_units'); /** * Checks whether a pattern image is needed, and if it is, whether it is not loaded. * @private * @returns true if a needed image is missing and rendering needs to be skipped. */ exports.isPatternMissing = function(image , painter ) { if (!image) { return false; } var imagePosA = painter.imageManager.getPattern(image.from); var imagePosB = painter.imageManager.getPattern(image.to); return !imagePosA || !imagePosB; }; exports.prepare = function (image , painter , program ) { var context = painter.context; var gl = context.gl; var imagePosA = painter.imageManager.getPattern(image.from); var imagePosB = painter.imageManager.getPattern(image.to); assert(imagePosA && imagePosB); gl.uniform1i(program.uniforms.u_image, 0); gl.uniform2fv(program.uniforms.u_pattern_tl_a, (imagePosA ).tl); gl.uniform2fv(program.uniforms.u_pattern_br_a, (imagePosA ).br); gl.uniform2fv(program.uniforms.u_pattern_tl_b, (imagePosB ).tl); gl.uniform2fv(program.uniforms.u_pattern_br_b, (imagePosB ).br); var ref = painter.imageManager.getPixelSize(); var width = ref.width; var height = ref.height; gl.uniform2fv(program.uniforms.u_texsize, [width, height]); gl.uniform1f(program.uniforms.u_mix, image.t); gl.uniform2fv(program.uniforms.u_pattern_size_a, (imagePosA ).displaySize); gl.uniform2fv(program.uniforms.u_pattern_size_b, (imagePosB ).displaySize); gl.uniform1f(program.uniforms.u_scale_a, image.fromScale); gl.uniform1f(program.uniforms.u_scale_b, image.toScale); context.activeTexture.set(gl.TEXTURE0); painter.imageManager.bind(painter.context); }; exports.setTile = function (tile , painter , program ) { var gl = painter.context.gl; gl.uniform1f(program.uniforms.u_tile_units_to_pixels, 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom)); var numTiles = Math.pow(2, tile.tileID.overscaledZ); var tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles; var pixelX = tileSizeAtNearestZoom * (tile.tileID.canonical.x + tile.tileID.wrap * numTiles); var pixelY = tileSizeAtNearestZoom * tile.tileID.canonical.y; // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision. gl.uniform2f(program.uniforms.u_pixel_coord_upper, pixelX >> 16, pixelY >> 16); gl.uniform2f(program.uniforms.u_pixel_coord_lower, pixelX & 0xFFFF, pixelY & 0xFFFF); }; },{"../source/pixels_to_tile_units":109,"assert":13}],97:[function(require,module,exports){ 'use strict';// var browser = require('../util/browser'); var shaders = require('../shaders'); var assert = require('assert'); var ref = require('../data/program_configuration'); var ProgramConfiguration = ref.ProgramConfiguration; var VertexArrayObject = require('./vertex_array_object'); var Context = require('../gl/context'); var Program = function Program(context , source , configuration , showOverdrawInspector ) { var this$1 = this; var gl = context.gl; this.program = gl.createProgram(); var defines = configuration.defines().concat( ("#define DEVICE_PIXEL_RATIO " + (browser.devicePixelRatio.toFixed(1)))); if (showOverdrawInspector) { defines.push('#define OVERDRAW_INSPECTOR;'); } var fragmentSource = defines.concat(shaders.prelude.fragmentSource, source.fragmentSource).join('\n'); var vertexSource = defines.concat(shaders.prelude.vertexSource, source.vertexSource).join('\n'); var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(fragmentShader, fragmentSource); gl.compileShader(fragmentShader); assert(gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS), (gl.getShaderInfoLog(fragmentShader) )); gl.attachShader(this.program, fragmentShader); var vertexShader = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vertexShader, vertexSource); gl.compileShader(vertexShader); assert(gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS), (gl.getShaderInfoLog(vertexShader) )); gl.attachShader(this.program, vertexShader); // Manually bind layout attributes in the order defined by their // ProgramInterface so that we don't dynamically link an unused // attribute at position 0, which can cause rendering to fail for an // entire layer (see #4607, #4728) var layoutAttributes = configuration.layoutAttributes || []; for (var i = 0; i < layoutAttributes.length; i++) { gl.bindAttribLocation(this$1.program, i, layoutAttributes[i].name); } gl.linkProgram(this.program); assert(gl.getProgramParameter(this.program, gl.LINK_STATUS), (gl.getProgramInfoLog(this.program) )); this.numAttributes = gl.getProgramParameter(this.program, gl.ACTIVE_ATTRIBUTES); this.attributes = {}; this.uniforms = {}; for (var i$1 = 0; i$1 < this.numAttributes; i$1++) { var attribute = gl.getActiveAttrib(this$1.program, i$1); if (attribute) { this$1.attributes[attribute.name] = gl.getAttribLocation(this$1.program, attribute.name); } } var numUniforms = gl.getProgramParameter(this.program, gl.ACTIVE_UNIFORMS); for (var i$2 = 0; i$2 < numUniforms; i$2++) { var uniform = gl.getActiveUniform(this$1.program, i$2); if (uniform) { this$1.uniforms[uniform.name] = gl.getUniformLocation(this$1.program, uniform.name); } } }; Program.prototype.draw = function draw (context , drawMode , layerID , layoutVertexBuffer , indexBuffer , segments , configuration , dynamicLayoutBuffer , dynamicLayoutBuffer2 ) { var this$1 = this; var gl = context.gl; var primitiveSize = ( obj = {}, obj[gl.LINES] = 2, obj[gl.TRIANGLES] = 3, obj )[drawMode]; var obj; for (var i = 0, list = segments.get(); i < list.length; i += 1) { var segment = list[i]; var vaos = segment.vaos || (segment.vaos = {}); var vao = vaos[layerID] || (vaos[layerID] = new VertexArrayObject()); vao.bind( context, this$1, layoutVertexBuffer, configuration ? configuration.getPaintVertexBuffers() : [], indexBuffer, segment.vertexOffset, dynamicLayoutBuffer, dynamicLayoutBuffer2 ); gl.drawElements( drawMode, segment.primitiveLength * primitiveSize, gl.UNSIGNED_SHORT, segment.primitiveOffset * primitiveSize * 2); } }; module.exports = Program; },{"../data/program_configuration":63,"../gl/context":71,"../shaders":102,"../util/browser":257,"./vertex_array_object":100,"assert":13}],98:[function(require,module,exports){ 'use strict';// var ref = require('../util/window'); var HTMLImageElement = ref.HTMLImageElement; var HTMLCanvasElement = ref.HTMLCanvasElement; var HTMLVideoElement = ref.HTMLVideoElement; var ImageData = ref.ImageData; var Texture = function Texture(context , image , format , premultiply ) { this.context = context; var width = image.width; var height = image.height; this.size = [width, height]; this.format = format; this.texture = context.gl.createTexture(); this.update(image, premultiply); }; Texture.prototype.update = function update (image , premultiply ) { var width = image.width; var height = image.height; this.size = [width, height]; var ref = this; var context = ref.context; var gl = context.gl; gl.bindTexture(gl.TEXTURE_2D, this.texture); context.pixelStoreUnpack.set(1); if (this.format === gl.RGBA && premultiply !== false) { context.pixelStoreUnpackPremultiplyAlpha.set(true); } if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData) { gl.texImage2D(gl.TEXTURE_2D, 0, this.format, this.format, gl.UNSIGNED_BYTE, image); } else { gl.texImage2D(gl.TEXTURE_2D, 0, this.format, width, height, 0, this.format, gl.UNSIGNED_BYTE, image.data); } }; Texture.prototype.bind = function bind (filter , wrap , minFilter ) { var ref = this; var context = ref.context; var gl = context.gl; gl.bindTexture(gl.TEXTURE_2D, this.texture); if (filter !== this.filter) { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter || filter); this.filter = filter; } if (wrap !== this.wrap) { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap); this.wrap = wrap; } }; Texture.prototype.destroy = function destroy () { var ref = this.context; var gl = ref.gl; gl.deleteTexture(this.texture); this.texture = (null ); }; module.exports = Texture; },{"../util/window":259}],99:[function(require,module,exports){ 'use strict';// var ref = require('../source/tile_id'); var OverscaledTileID = ref.OverscaledTileID; var CanonicalTileID = ref.CanonicalTileID; // Updates the TileMasks for all renderable tiles. A TileMask describes all regions // within that tile that are *not* covered by other renderable tiles. // Example: renderableTiles in our list are 2/1/3, 3/3/6, and 4/5/13. The schematic for creating the // TileMask for 2/1/3 looks like this: // // ┌────────┬────────┬─────────────────┐ // │ │ │#################│ // │ 4/4/12 │ 4/5/12 │#################│ // │ │ │#################│ // ├──────3/2/6──────┤#####3/3/6#######│ // │ │########│#################│ // │ 4/4/13 │#4/5/13#│#################│ // │ │########│#################│ // ├────────┴──────2/1/3───────────────┤ // │ │ │ // │ │ │ // │ │ │ // │ 3/2/7 │ 3/3/7 │ // │ │ │ // │ │ │ // │ │ │ // └─────────────────┴─────────────────┘ // // The TileMask for 2/1/3 thus consists of the tiles 4/4/12, 4/5/12, 4/4/13, 3/2/7, and 3/3/7, // but it does *not* include 4/5/13, and 3/3/6, since these are other renderableTiles. // A TileMask always contains TileIDs *relative* to the tile it is generated for, so 2/1/3 is // "subtracted" from these TileIDs. The final TileMask for 2/1/3 will thus be: // // ┌────────┬────────┬─────────────────┐ // │ │ │#################│ // │ 2/0/0 │ 2/1/0 │#################│ // │ │ │#################│ // ├────────┼────────┤#################│ // │ │########│#################│ // │ 2/0/1 │########│#################│ // │ │########│#################│ // ├────────┴────────┼─────────────────┤ // │ │ │ // │ │ │ // │ │ │ // │ 1/0/1 │ 1/1/1 │ // │ │ │ // │ │ │ // │ │ │ // └─────────────────┴─────────────────┘ // // Only other renderable tiles that are *children* of the tile we are generating the mask for will // be considered. For example, adding TileID 4/8/13 to renderableTiles won't affect the TileMask for // 2/1/3, since it is not a descendant of it. module.exports = function(renderableTiles , context ) { var sortedRenderables = renderableTiles.sort(function (a, b) { return a.tileID.isLessThan(b.tileID) ? -1 : b.tileID.isLessThan(a.tileID) ? 1 : 0; }); for (var i = 0; i < sortedRenderables.length; i++) { var mask = {}; var tile = sortedRenderables[i]; var childArray = sortedRenderables.slice(i + 1); // Try to add all remaining ids as children. We sorted the tile list // by z earlier, so all preceding items cannot be children of the current // tile. We also compute the lower bound of the next wrap, because items of the next wrap // can never be children of the current wrap. computeTileMasks(tile.tileID.wrapped(), tile.tileID, childArray, new OverscaledTileID(0, tile.tileID.wrap + 1, 0, 0, 0), mask); tile.setMask(mask, context); } }; function computeTileMasks(rootTile , ref , childArray , lowerBound , mask ) { // If the reference or any of its children is found in the list, we need to recurse. for (var i = 0; i < childArray.length; i++) { var childTile = childArray[i]; // childTile is from a larger wrap than the rootTile so it cannot be a child tile if (lowerBound.isLessThan(childTile.tileID)) { break; } // The current tile is masked out, so we don't need to add them to the mask set. if (ref.key === childTile.tileID.key) { return; } else if (childTile.tileID.isChildOf(ref)) { // There's at least one child tile that is masked out, so recursively descend var children = ref.children(Infinity); for (var j = 0; j < children.length; j++) { var child = children[j]; computeTileMasks(rootTile, child, childArray.slice(i), lowerBound, mask); } return; } } // We couldn't find a child, so it's definitely a masked part. // Compute the difference between the root tile ID and the reference tile ID, since TileMask // elements are always relative (see below for explanation). var diffZ = ref.overscaledZ - rootTile.overscaledZ; var maskTileId = new CanonicalTileID(diffZ, ref.canonical.x - (rootTile.canonical.x << diffZ), ref.canonical.y - (rootTile.canonical.y << diffZ)); mask[maskTileId.key] = mask[maskTileId.key] || maskTileId; } },{"../source/tile_id":119}],100:[function(require,module,exports){ 'use strict';// var assert = require('assert'); var VertexArrayObject = function VertexArrayObject() { this.boundProgram = null; this.boundLayoutVertexBuffer = null; this.boundPaintVertexBuffers = []; this.boundIndexBuffer = null; this.boundVertexOffset = null; this.boundDynamicVertexBuffer = null; this.vao = null; }; VertexArrayObject.prototype.bind = function bind (context , program , layoutVertexBuffer , paintVertexBuffers , indexBuffer , vertexOffset , dynamicVertexBuffer , dynamicVertexBuffer2 ) { var this$1 = this; this.context = context; var paintBuffersDiffer = this.boundPaintVertexBuffers.length !== paintVertexBuffers.length; for (var i = 0; !paintBuffersDiffer && i < paintVertexBuffers.length; i++) { if (this$1.boundPaintVertexBuffers[i] !== paintVertexBuffers[i]) { paintBuffersDiffer = true; } } var isFreshBindRequired = ( !this.vao || this.boundProgram !== program || this.boundLayoutVertexBuffer !== layoutVertexBuffer || paintBuffersDiffer || this.boundIndexBuffer !== indexBuffer || this.boundVertexOffset !== vertexOffset || this.boundDynamicVertexBuffer !== dynamicVertexBuffer || this.boundDynamicVertexBuffer2 !== dynamicVertexBuffer2 ); if (!context.extVertexArrayObject || isFreshBindRequired) { this.freshBind(program, layoutVertexBuffer, paintVertexBuffers, indexBuffer, vertexOffset, dynamicVertexBuffer, dynamicVertexBuffer2); } else { context.bindVertexArrayOES.set(this.vao); if (dynamicVertexBuffer) { // The buffer may have been updated. Rebind to upload data. dynamicVertexBuffer.bind(); } if (indexBuffer && indexBuffer.dynamicDraw) { indexBuffer.bind(); } if (dynamicVertexBuffer2) { dynamicVertexBuffer2.bind(); } } }; VertexArrayObject.prototype.freshBind = function freshBind (program , layoutVertexBuffer , paintVertexBuffers , indexBuffer , vertexOffset , dynamicVertexBuffer , dynamicVertexBuffer2 ) { var numPrevAttributes; var numNextAttributes = program.numAttributes; var context = this.context; var gl = context.gl; if (context.extVertexArrayObject) { if (this.vao) { this.destroy(); } this.vao = context.extVertexArrayObject.createVertexArrayOES(); context.bindVertexArrayOES.set(this.vao); numPrevAttributes = 0; // store the arguments so that we can verify them when the vao is bound again this.boundProgram = program; this.boundLayoutVertexBuffer = layoutVertexBuffer; this.boundPaintVertexBuffers = paintVertexBuffers; this.boundIndexBuffer = indexBuffer; this.boundVertexOffset = vertexOffset; this.boundDynamicVertexBuffer = dynamicVertexBuffer; this.boundDynamicVertexBuffer2 = dynamicVertexBuffer2; } else { numPrevAttributes = context.currentNumAttributes || 0; // Disable all attributes from the previous program that aren't used in // the new program. Note: attribute indices are *not* program specific! for (var i = numNextAttributes; i < numPrevAttributes; i++) { // WebGL breaks if you disable attribute 0. // http://stackoverflow.com/questions/20305231 assert(i !== 0); gl.disableVertexAttribArray(i); } } layoutVertexBuffer.enableAttributes(gl, program); for (var i$1 = 0, list = paintVertexBuffers; i$1 < list.length; i$1 += 1) { var vertexBuffer = list[i$1]; vertexBuffer.enableAttributes(gl, program); } if (dynamicVertexBuffer) { dynamicVertexBuffer.enableAttributes(gl, program); } if (dynamicVertexBuffer2) { dynamicVertexBuffer2.enableAttributes(gl, program); } layoutVertexBuffer.bind(); layoutVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset); for (var i$2 = 0, list$1 = paintVertexBuffers; i$2 < list$1.length; i$2 += 1) { var vertexBuffer$1 = list$1[i$2]; vertexBuffer$1.bind(); vertexBuffer$1.setVertexAttribPointers(gl, program, vertexOffset); } if (dynamicVertexBuffer) { dynamicVertexBuffer.bind(); dynamicVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset); } if (indexBuffer) { indexBuffer.bind(); } if (dynamicVertexBuffer2) { dynamicVertexBuffer2.bind(); dynamicVertexBuffer2.setVertexAttribPointers(gl, program, vertexOffset); } context.currentNumAttributes = numNextAttributes; }; VertexArrayObject.prototype.destroy = function destroy () { if (this.vao) { this.context.extVertexArrayObject.deleteVertexArrayOES(this.vao); this.vao = null; } }; module.exports = VertexArrayObject; },{"assert":13}],101:[function(require,module,exports){ 'use strict';// var util = require('../util/util'); /** * Packs two numbers, interpreted as 8-bit unsigned integers, into a single * float. Unpack them in the shader using the `unpack_float()` function, * defined in _prelude.vertex.glsl * * @private */ exports.packUint8ToFloat = function pack(a , b ) { // coerce a and b to 8-bit ints a = util.clamp(Math.floor(a), 0, 255); b = util.clamp(Math.floor(b), 0, 255); return 256 * a + b; }; },{"../util/util":280}],102:[function(require,module,exports){ 'use strict';// // readFileSync calls must be written out long-form for brfs. /* eslint-disable prefer-template, no-path-concat */ var shaders = { prelude: { fragmentSource: "#ifdef GL_ES\nprecision mediump float;\n#else\n\n#if !defined(lowp)\n#define lowp\n#endif\n\n#if !defined(mediump)\n#define mediump\n#endif\n\n#if !defined(highp)\n#define highp\n#endif\n\n#endif\n", vertexSource: "#ifdef GL_ES\nprecision highp float;\n#else\n\n#if !defined(lowp)\n#define lowp\n#endif\n\n#if !defined(mediump)\n#define mediump\n#endif\n\n#if !defined(highp)\n#define highp\n#endif\n\n#endif\n\n// Unpack a pair of values that have been packed into a single float.\n// The packed values are assumed to be 8-bit unsigned integers, and are\n// packed like so:\n// packedValue = floor(input[0]) * 256 + input[1],\nvec2 unpack_float(const float packedValue) {\n int packedIntValue = int(packedValue);\n int v0 = packedIntValue / 256;\n return vec2(v0, packedIntValue - v0 * 256);\n}\n\nvec2 unpack_opacity(const float packedOpacity) {\n int intOpacity = int(packedOpacity) / 2;\n return vec2(float(intOpacity) / 127.0, mod(packedOpacity, 2.0));\n}\n\n// To minimize the number of attributes needed, we encode a 4-component\n// color into a pair of floats (i.e. a vec2) as follows:\n// [ floor(color.r * 255) * 256 + color.g * 255,\n// floor(color.b * 255) * 256 + color.g * 255 ]\nvec4 decode_color(const vec2 encodedColor) {\n return vec4(\n unpack_float(encodedColor[0]) / 255.0,\n unpack_float(encodedColor[1]) / 255.0\n );\n}\n\n// Unpack a pair of paint values and interpolate between them.\nfloat unpack_mix_vec2(const vec2 packedValue, const float t) {\n return mix(packedValue[0], packedValue[1], t);\n}\n\n// Unpack a pair of paint values and interpolate between them.\nvec4 unpack_mix_vec4(const vec4 packedColors, const float t) {\n vec4 minColor = decode_color(vec2(packedColors[0], packedColors[1]));\n vec4 maxColor = decode_color(vec2(packedColors[2], packedColors[3]));\n return mix(minColor, maxColor, t);\n}\n\n// The offset depends on how many pixels are between the world origin and the edge of the tile:\n// vec2 offset = mod(pixel_coord, size)\n//\n// At high zoom levels there are a ton of pixels between the world origin and the edge of the tile.\n// The glsl spec only guarantees 16 bits of precision for highp floats. We need more than that.\n//\n// The pixel_coord is passed in as two 16 bit values:\n// pixel_coord_upper = floor(pixel_coord / 2^16)\n// pixel_coord_lower = mod(pixel_coord, 2^16)\n//\n// The offset is calculated in a series of steps that should preserve this precision:\nvec2 get_pattern_pos(const vec2 pixel_coord_upper, const vec2 pixel_coord_lower,\n const vec2 pattern_size, const float tile_units_to_pixels, const vec2 pos) {\n\n vec2 offset = mod(mod(mod(pixel_coord_upper, pattern_size) * 256.0, pattern_size) * 256.0 + pixel_coord_lower, pattern_size);\n return (tile_units_to_pixels * pos + offset) / pattern_size;\n}\n" }, background: { fragmentSource: "uniform vec4 u_color;\nuniform float u_opacity;\n\nvoid main() {\n gl_FragColor = u_color * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", vertexSource: "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n" }, backgroundPattern: { fragmentSource: "uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform vec2 u_texsize;\nuniform float u_mix;\nuniform float u_opacity;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\nvoid main() {\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n gl_FragColor = mix(color1, color2, u_mix) * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", vertexSource: "uniform mat4 u_matrix;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos);\n}\n" }, circle: { fragmentSource: "#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\n\nvarying vec3 v_data;\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize mediump float radius\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize highp vec4 stroke_color\n #pragma mapbox: initialize mediump float stroke_width\n #pragma mapbox: initialize lowp float stroke_opacity\n\n vec2 extrude = v_data.xy;\n float extrude_length = length(extrude);\n\n lowp float antialiasblur = v_data.z;\n float antialiased_blur = -max(blur, antialiasblur);\n\n float opacity_t = smoothstep(0.0, antialiased_blur, extrude_length - 1.0);\n\n float color_t = stroke_width < 0.01 ? 0.0 : smoothstep(\n antialiased_blur,\n 0.0,\n extrude_length - radius / (radius + stroke_width)\n );\n\n gl_FragColor = opacity_t * mix(color * opacity, stroke_color * stroke_opacity, color_t);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", vertexSource: "uniform mat4 u_matrix;\nuniform bool u_scale_with_map;\nuniform bool u_pitch_with_map;\nuniform vec2 u_extrude_scale;\nuniform highp float u_camera_to_center_distance;\n\nattribute vec2 a_pos;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\n\nvarying vec3 v_data;\n\nvoid main(void) {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize mediump float radius\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize highp vec4 stroke_color\n #pragma mapbox: initialize mediump float stroke_width\n #pragma mapbox: initialize lowp float stroke_opacity\n\n // unencode the extrusion vector that we snuck into the a_pos vector\n vec2 extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);\n\n // multiply a_pos by 0.5, since we had it * 2 in order to sneak\n // in extrusion data\n vec2 circle_center = floor(a_pos * 0.5);\n if (u_pitch_with_map) {\n vec2 corner_position = circle_center;\n if (u_scale_with_map) {\n corner_position += extrude * (radius + stroke_width) * u_extrude_scale;\n } else {\n // Pitching the circle with the map effectively scales it with the map\n // To counteract the effect for pitch-scale: viewport, we rescale the\n // whole circle based on the pitch scaling effect at its central point\n vec4 projected_center = u_matrix * vec4(circle_center, 0, 1);\n corner_position += extrude * (radius + stroke_width) * u_extrude_scale * (projected_center.w / u_camera_to_center_distance);\n }\n\n gl_Position = u_matrix * vec4(corner_position, 0, 1);\n } else {\n gl_Position = u_matrix * vec4(circle_center, 0, 1);\n\n if (u_scale_with_map) {\n gl_Position.xy += extrude * (radius + stroke_width) * u_extrude_scale * u_camera_to_center_distance;\n } else {\n gl_Position.xy += extrude * (radius + stroke_width) * u_extrude_scale * gl_Position.w;\n }\n }\n\n // This is a minimum blur distance that serves as a faux-antialiasing for\n // the circle. since blur is a ratio of the circle's size and the intent is\n // to keep the blur at roughly 1px, the two are inversely related.\n lowp float antialiasblur = 1.0 / DEVICE_PIXEL_RATIO / (radius + stroke_width);\n\n v_data = vec3(extrude.x, extrude.y, antialiasblur);\n}\n" }, clippingMask: { fragmentSource: "void main() {\n gl_FragColor = vec4(1.0);\n}\n", vertexSource: "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n" }, heatmap: { fragmentSource: "#pragma mapbox: define highp float weight\n\nuniform highp float u_intensity;\nvarying vec2 v_extrude;\n\n// Gaussian kernel coefficient: 1 / sqrt(2 * PI)\n#define GAUSS_COEF 0.3989422804014327\n\nvoid main() {\n #pragma mapbox: initialize highp float weight\n\n // Kernel density estimation with a Gaussian kernel of size 5x5\n float d = -0.5 * 3.0 * 3.0 * dot(v_extrude, v_extrude);\n float val = weight * u_intensity * GAUSS_COEF * exp(d);\n\n gl_FragColor = vec4(val, 1.0, 1.0, 1.0);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", vertexSource: "#pragma mapbox: define highp float weight\n#pragma mapbox: define mediump float radius\n\nuniform mat4 u_matrix;\nuniform float u_extrude_scale;\nuniform float u_opacity;\nuniform float u_intensity;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_extrude;\n\n// Effective \"0\" in the kernel density texture to adjust the kernel size to;\n// this empirically chosen number minimizes artifacts on overlapping kernels\n// for typical heatmap cases (assuming clustered source)\nconst highp float ZERO = 1.0 / 255.0 / 16.0;\n\n// Gaussian kernel coefficient: 1 / sqrt(2 * PI)\n#define GAUSS_COEF 0.3989422804014327\n\nvoid main(void) {\n #pragma mapbox: initialize highp float weight\n #pragma mapbox: initialize mediump float radius\n\n // unencode the extrusion vector that we snuck into the a_pos vector\n vec2 unscaled_extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);\n\n // This 'extrude' comes in ranging from [-1, -1], to [1, 1]. We'll use\n // it to produce the vertices of a square mesh framing the point feature\n // we're adding to the kernel density texture. We'll also pass it as\n // a varying, so that the fragment shader can determine the distance of\n // each fragment from the point feature.\n // Before we do so, we need to scale it up sufficiently so that the\n // kernel falls effectively to zero at the edge of the mesh.\n // That is, we want to know S such that\n // weight * u_intensity * GAUSS_COEF * exp(-0.5 * 3.0^2 * S^2) == ZERO\n // Which solves to:\n // S = sqrt(-2.0 * log(ZERO / (weight * u_intensity * GAUSS_COEF))) / 3.0\n float S = sqrt(-2.0 * log(ZERO / weight / u_intensity / GAUSS_COEF)) / 3.0;\n\n // Pass the varying in units of radius\n v_extrude = S * unscaled_extrude;\n\n // Scale by radius and the zoom-based scale factor to produce actual\n // mesh position\n vec2 extrude = v_extrude * radius * u_extrude_scale;\n\n // multiply a_pos by 0.5, since we had it * 2 in order to sneak\n // in extrusion data\n vec4 pos = vec4(floor(a_pos * 0.5) + extrude, 0, 1);\n\n gl_Position = u_matrix * pos;\n}\n" }, heatmapTexture: { fragmentSource: "uniform sampler2D u_image;\nuniform sampler2D u_color_ramp;\nuniform float u_opacity;\nvarying vec2 v_pos;\n\nvoid main() {\n float t = texture2D(u_image, v_pos).r;\n vec4 color = texture2D(u_color_ramp, vec2(t, 0.5));\n gl_FragColor = color * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(0.0);\n#endif\n}\n", vertexSource: "uniform mat4 u_matrix;\nuniform vec2 u_world;\nattribute vec2 a_pos;\nvarying vec2 v_pos;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos * u_world, 0, 1);\n\n v_pos.x = a_pos.x;\n v_pos.y = 1.0 - a_pos.y;\n}\n" }, collisionBox: { fragmentSource: "\nvarying float v_placed;\nvarying float v_notUsed;\n\nvoid main() {\n\n float alpha = 0.5;\n\n // Red = collision, hide label\n gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\n\n // Blue = no collision, label is showing\n if (v_placed > 0.5) {\n gl_FragColor = vec4(0.0, 0.0, 1.0, 0.5) * alpha;\n }\n\n if (v_notUsed > 0.5) {\n // This box not used, fade it out\n gl_FragColor *= .1;\n }\n}", vertexSource: "attribute vec2 a_pos;\nattribute vec2 a_anchor_pos;\nattribute vec2 a_extrude;\nattribute vec2 a_placed;\n\nuniform mat4 u_matrix;\nuniform vec2 u_extrude_scale;\nuniform float u_camera_to_center_distance;\n\nvarying float v_placed;\nvarying float v_notUsed;\n\nvoid main() {\n vec4 projectedPoint = u_matrix * vec4(a_anchor_pos, 0, 1);\n highp float camera_to_anchor_distance = projectedPoint.w;\n highp float collision_perspective_ratio = 0.5 + 0.5 * (u_camera_to_center_distance / camera_to_anchor_distance);\n\n gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0);\n gl_Position.xy += a_extrude * u_extrude_scale * gl_Position.w * collision_perspective_ratio;\n\n v_placed = a_placed.x;\n v_notUsed = a_placed.y;\n}\n" }, collisionCircle: { fragmentSource: "\nvarying float v_placed;\nvarying float v_notUsed;\nvarying float v_radius;\nvarying vec2 v_extrude;\nvarying vec2 v_extrude_scale;\n\nvoid main() {\n float alpha = 0.5;\n\n // Red = collision, hide label\n vec4 color = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\n\n // Blue = no collision, label is showing\n if (v_placed > 0.5) {\n color = vec4(0.0, 0.0, 1.0, 0.5) * alpha;\n }\n\n if (v_notUsed > 0.5) {\n // This box not used, fade it out\n color *= .2;\n }\n\n float extrude_scale_length = length(v_extrude_scale);\n float extrude_length = length(v_extrude) * extrude_scale_length;\n float stroke_width = 15.0 * extrude_scale_length;\n float radius = v_radius * extrude_scale_length;\n\n float distance_to_edge = abs(extrude_length - radius);\n float opacity_t = smoothstep(-stroke_width, 0.0, -distance_to_edge);\n\n gl_FragColor = opacity_t * color;\n}\n", vertexSource: "attribute vec2 a_pos;\nattribute vec2 a_anchor_pos;\nattribute vec2 a_extrude;\nattribute vec2 a_placed;\n\nuniform mat4 u_matrix;\nuniform vec2 u_extrude_scale;\nuniform float u_camera_to_center_distance;\n\nvarying float v_placed;\nvarying float v_notUsed;\nvarying float v_radius;\n\nvarying vec2 v_extrude;\nvarying vec2 v_extrude_scale;\n\nvoid main() {\n vec4 projectedPoint = u_matrix * vec4(a_anchor_pos, 0, 1);\n highp float camera_to_anchor_distance = projectedPoint.w;\n highp float collision_perspective_ratio = 0.5 + 0.5 * (u_camera_to_center_distance / camera_to_anchor_distance);\n\n gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0);\n\n highp float padding_factor = 1.2; // Pad the vertices slightly to make room for anti-alias blur\n gl_Position.xy += a_extrude * u_extrude_scale * padding_factor * gl_Position.w * collision_perspective_ratio;\n\n v_placed = a_placed.x;\n v_notUsed = a_placed.y;\n v_radius = abs(a_extrude.y); // We don't pitch the circles, so both units of the extrusion vector are equal in magnitude to the radius\n\n v_extrude = a_extrude * padding_factor;\n v_extrude_scale = u_extrude_scale * u_camera_to_center_distance * collision_perspective_ratio;\n}\n" }, debug: { fragmentSource: "uniform highp vec4 u_color;\n\nvoid main() {\n gl_FragColor = u_color;\n}\n", vertexSource: "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n" }, fill: { fragmentSource: "#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float opacity\n\n gl_FragColor = color * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", vertexSource: "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n" }, fillOutline: { fragmentSource: "#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\n\nvarying vec2 v_pos;\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 outline_color\n #pragma mapbox: initialize lowp float opacity\n\n float dist = length(v_pos - gl_FragCoord.xy);\n float alpha = 1.0 - smoothstep(0.0, 1.0, dist);\n gl_FragColor = outline_color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", vertexSource: "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\nuniform vec2 u_world;\n\nvarying vec2 v_pos;\n\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 outline_color\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n}\n" }, fillOutlinePattern: { fragmentSource: "uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform vec2 u_texsize;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n // find distance to outline for alpha interpolation\n\n float dist = length(v_pos - gl_FragCoord.xy);\n float alpha = 1.0 - smoothstep(0.0, 1.0, dist);\n\n\n gl_FragColor = mix(color1, color2, u_mix) * alpha * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", vertexSource: "uniform mat4 u_matrix;\nuniform vec2 u_world;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos);\n\n v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n}\n" }, fillPattern: { fragmentSource: "uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform vec2 u_texsize;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n gl_FragColor = mix(color1, color2, u_mix) * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", vertexSource: "uniform mat4 u_matrix;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos);\n}\n" }, fillExtrusion: { fragmentSource: "varying vec4 v_color;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define highp vec4 color\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize highp vec4 color\n\n gl_FragColor = v_color;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", vertexSource: "uniform mat4 u_matrix;\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\n\nattribute vec2 a_pos;\nattribute vec4 a_normal_ed;\n\nvarying vec4 v_color;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\n#pragma mapbox: define highp vec4 color\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize highp vec4 color\n\n vec3 normal = a_normal_ed.xyz;\n\n base = max(0.0, base);\n height = max(0.0, height);\n\n float t = mod(normal.x, 2.0);\n\n gl_Position = u_matrix * vec4(a_pos, t > 0.0 ? height : base, 1);\n\n // Relative luminance (how dark/bright is the surface color?)\n float colorvalue = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722;\n\n v_color = vec4(0.0, 0.0, 0.0, 1.0);\n\n // Add slight ambient lighting so no extrusions are totally black\n vec4 ambientlight = vec4(0.03, 0.03, 0.03, 1.0);\n color += ambientlight;\n\n // Calculate cos(theta), where theta is the angle between surface normal and diffuse light ray\n float directional = clamp(dot(normal / 16384.0, u_lightpos), 0.0, 1.0);\n\n // Adjust directional so that\n // the range of values for highlight/shading is narrower\n // with lower light intensity\n // and with lighter/brighter surface colors\n directional = mix((1.0 - u_lightintensity), max((1.0 - colorvalue + u_lightintensity), 1.0), directional);\n\n // Add gradient along z axis of side surfaces\n if (normal.y != 0.0) {\n directional *= clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0);\n }\n\n // Assign final color based on surface + ambient light color, diffuse light directional, and light color\n // with lower bounds adjusted to hue of light\n // so that shading is tinted with the complementary (opposite) color to the light color\n v_color.r += clamp(color.r * directional * u_lightcolor.r, mix(0.0, 0.3, 1.0 - u_lightcolor.r), 1.0);\n v_color.g += clamp(color.g * directional * u_lightcolor.g, mix(0.0, 0.3, 1.0 - u_lightcolor.g), 1.0);\n v_color.b += clamp(color.b * directional * u_lightcolor.b, mix(0.0, 0.3, 1.0 - u_lightcolor.b), 1.0);\n}\n" }, fillExtrusionPattern: { fragmentSource: "uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform vec2 u_texsize;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec4 v_lighting;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n vec4 mixedColor = mix(color1, color2, u_mix);\n\n gl_FragColor = mixedColor * v_lighting;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", vertexSource: "uniform mat4 u_matrix;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\nuniform float u_height_factor;\n\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\n\nattribute vec2 a_pos;\nattribute vec4 a_normal_ed;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec4 v_lighting;\nvarying float v_directional;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n\n vec3 normal = a_normal_ed.xyz;\n float edgedistance = a_normal_ed.w;\n\n base = max(0.0, base);\n height = max(0.0, height);\n\n float t = mod(normal.x, 2.0);\n float z = t > 0.0 ? height : base;\n\n gl_Position = u_matrix * vec4(a_pos, z, 1);\n\n vec2 pos = normal.x == 1.0 && normal.y == 0.0 && normal.z == 16384.0\n ? a_pos // extrusion top\n : vec2(edgedistance, z * u_height_factor); // extrusion side\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, pos);\n\n v_lighting = vec4(0.0, 0.0, 0.0, 1.0);\n float directional = clamp(dot(normal / 16383.0, u_lightpos), 0.0, 1.0);\n directional = mix((1.0 - u_lightintensity), max((0.5 + u_lightintensity), 1.0), directional);\n\n if (normal.y != 0.0) {\n directional *= clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0);\n }\n\n v_lighting.rgb += clamp(directional * u_lightcolor, mix(vec3(0.0), vec3(0.3), 1.0 - u_lightcolor), vec3(1.0));\n}\n" }, extrusionTexture: { fragmentSource: "uniform sampler2D u_image;\nuniform float u_opacity;\nvarying vec2 v_pos;\n\nvoid main() {\n gl_FragColor = texture2D(u_image, v_pos) * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(0.0);\n#endif\n}\n", vertexSource: "uniform mat4 u_matrix;\nuniform vec2 u_world;\nattribute vec2 a_pos;\nvarying vec2 v_pos;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos * u_world, 0, 1);\n\n v_pos.x = a_pos.x;\n v_pos.y = 1.0 - a_pos.y;\n}\n" }, hillshadePrepare: { fragmentSource: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform sampler2D u_image;\nvarying vec2 v_pos;\nuniform vec2 u_dimension;\nuniform float u_zoom;\n\nfloat getElevation(vec2 coord, float bias) {\n // Convert encoded elevation value to meters\n vec4 data = texture2D(u_image, coord) * 255.0;\n return (data.r + data.g * 256.0 + data.b * 256.0 * 256.0) / 4.0;\n}\n\nvoid main() {\n vec2 epsilon = 1.0 / u_dimension;\n\n // queried pixels:\n // +-----------+\n // | | | |\n // | a | b | c |\n // | | | |\n // +-----------+\n // | | | |\n // | d | e | f |\n // | | | |\n // +-----------+\n // | | | |\n // | g | h | i |\n // | | | |\n // +-----------+\n\n float a = getElevation(v_pos + vec2(-epsilon.x, -epsilon.y), 0.0);\n float b = getElevation(v_pos + vec2(0, -epsilon.y), 0.0);\n float c = getElevation(v_pos + vec2(epsilon.x, -epsilon.y), 0.0);\n float d = getElevation(v_pos + vec2(-epsilon.x, 0), 0.0);\n float e = getElevation(v_pos, 0.0);\n float f = getElevation(v_pos + vec2(epsilon.x, 0), 0.0);\n float g = getElevation(v_pos + vec2(-epsilon.x, epsilon.y), 0.0);\n float h = getElevation(v_pos + vec2(0, epsilon.y), 0.0);\n float i = getElevation(v_pos + vec2(epsilon.x, epsilon.y), 0.0);\n\n // here we divide the x and y slopes by 8 * pixel size\n // where pixel size (aka meters/pixel) is:\n // circumference of the world / (pixels per tile * number of tiles)\n // which is equivalent to: 8 * 40075016.6855785 / (512 * pow(2, u_zoom))\n // which can be reduced to: pow(2, 19.25619978527 - u_zoom)\n // we want to vertically exaggerate the hillshading though, because otherwise\n // it is barely noticeable at low zooms. to do this, we multiply this by some\n // scale factor pow(2, (u_zoom - 14) * a) where a is an arbitrary value and 14 is the\n // maxzoom of the tile source. here we use a=0.3 which works out to the\n // expression below. see nickidlugash's awesome breakdown for more info\n // https://github.com/mapbox/mapbox-gl-js/pull/5286#discussion_r148419556\n float exaggeration = u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;\n\n vec2 deriv = vec2(\n (c + f + f + i) - (a + d + d + g),\n (g + h + h + i) - (a + b + b + c)\n ) / pow(2.0, (u_zoom - 14.0) * exaggeration + 19.2562 - u_zoom);\n\n gl_FragColor = clamp(vec4(\n deriv.x / 2.0 + 0.5,\n deriv.y / 2.0 + 0.5,\n 1.0,\n 1.0), 0.0, 1.0);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", vertexSource: "uniform mat4 u_matrix;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n v_pos = (a_texture_pos / 8192.0) / 2.0 + 0.25;\n}\n" }, hillshade: { fragmentSource: "uniform sampler2D u_image;\nvarying vec2 v_pos;\n\nuniform vec2 u_latrange;\nuniform vec2 u_light;\nuniform vec4 u_shadow;\nuniform vec4 u_highlight;\nuniform vec4 u_accent;\n\n#define PI 3.141592653589793\n\nvoid main() {\n vec4 pixel = texture2D(u_image, v_pos);\n\n vec2 deriv = ((pixel.rg * 2.0) - 1.0);\n\n // We divide the slope by a scale factor based on the cosin of the pixel's approximate latitude\n // to account for mercator projection distortion. see #4807 for details\n float scaleFactor = cos(radians((u_latrange[0] - u_latrange[1]) * (1.0 - v_pos.y) + u_latrange[1]));\n // We also multiply the slope by an arbitrary z-factor of 1.25\n float slope = atan(1.25 * length(deriv) / scaleFactor);\n float aspect = deriv.x != 0.0 ? atan(deriv.y, -deriv.x) : PI / 2.0 * (deriv.y > 0.0 ? 1.0 : -1.0);\n\n float intensity = u_light.x;\n // We add PI to make this property match the global light object, which adds PI/2 to the light's azimuthal\n // position property to account for 0deg corresponding to north/the top of the viewport in the style spec\n // and the original shader was written to accept (-illuminationDirection - 90) as the azimuthal.\n float azimuth = u_light.y + PI;\n\n // We scale the slope exponentially based on intensity, using a calculation similar to\n // the exponential interpolation function in the style spec:\n // https://github.com/mapbox/mapbox-gl-js/blob/master/src/style-spec/expression/definitions/interpolate.js#L217-L228\n // so that higher intensity values create more opaque hillshading.\n float base = 1.875 - intensity * 1.75;\n float maxValue = 0.5 * PI;\n float scaledSlope = intensity != 0.5 ? ((pow(base, slope) - 1.0) / (pow(base, maxValue) - 1.0)) * maxValue : slope;\n\n // The accent color is calculated with the cosine of the slope while the shade color is calculated with the sine\n // so that the accent color's rate of change eases in while the shade color's eases out.\n float accent = cos(scaledSlope);\n // We multiply both the accent and shade color by a clamped intensity value\n // so that intensities >= 0.5 do not additionally affect the color values\n // while intensity values < 0.5 make the overall color more transparent.\n vec4 accent_color = (1.0 - accent) * u_accent * clamp(intensity * 2.0, 0.0, 1.0);\n float shade = abs(mod((aspect + azimuth) / PI + 0.5, 2.0) - 1.0);\n vec4 shade_color = mix(u_shadow, u_highlight, shade) * sin(scaledSlope) * clamp(intensity * 2.0, 0.0, 1.0);\n gl_FragColor = accent_color * (1.0 - shade_color.a) + shade_color;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", vertexSource: "uniform mat4 u_matrix;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n v_pos = a_texture_pos / 8192.0;\n}\n" }, line: { fragmentSource: "#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvarying vec2 v_width2;\nvarying vec2 v_normal;\nvarying float v_gamma_scale;\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", vertexSource: "\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\n// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\nattribute vec4 a_pos_normal;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform vec2 u_gl_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize lowp float offset\n #pragma mapbox: initialize mediump float width\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n\n vec2 pos = a_pos_normal.xy;\n\n // x is 1 if it's a round cap, 0 otherwise\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = a_pos_normal.zw;\n v_normal = normal;\n\n // these transformations used to be applied in the JS and native code bases.\n // moved them into the shader for clarity and simplicity.\n gapwidth = gapwidth / 2.0;\n float halfwidth = width / 2.0;\n offset = -1.0 * offset;\n\n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING;\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist = outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_width2 = vec2(outset, inset);\n}\n" }, linePattern: { fragmentSource: "uniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform vec2 u_texsize;\nuniform float u_fade;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n float x_a = mod(v_linesofar / u_pattern_size_a.x, 1.0);\n float x_b = mod(v_linesofar / u_pattern_size_b.x, 1.0);\n float y_a = 0.5 + (v_normal.y * v_width2.s / u_pattern_size_a.y);\n float y_b = 0.5 + (v_normal.y * v_width2.s / u_pattern_size_b.y);\n vec2 pos_a = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, vec2(x_a, y_a));\n vec2 pos_b = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, vec2(x_b, y_b));\n\n vec4 color = mix(texture2D(u_image, pos_a), texture2D(u_image, pos_b), u_fade);\n\n gl_FragColor = color * alpha * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", vertexSource: "// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\nattribute vec4 a_pos_normal;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform vec2 u_gl_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define mediump float width\n\nvoid main() {\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp float offset\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize mediump float width\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n\n vec2 pos = a_pos_normal.xy;\n\n // x is 1 if it's a round cap, 0 otherwise\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = a_pos_normal.zw;\n v_normal = normal;\n\n // these transformations used to be applied in the JS and native code bases.\n // moved them into the shader for clarity and simplicity.\n gapwidth = gapwidth / 2.0;\n float halfwidth = width / 2.0;\n offset = -1.0 * offset;\n\n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING;\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist = outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_linesofar = a_linesofar;\n v_width2 = vec2(outset, inset);\n}\n" }, lineSDF: { fragmentSource: "\nuniform sampler2D u_image;\nuniform float u_sdfgamma;\nuniform float u_mix;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float width\n #pragma mapbox: initialize lowp float floorwidth\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n float sdfdist_a = texture2D(u_image, v_tex_a).a;\n float sdfdist_b = texture2D(u_image, v_tex_b).a;\n float sdfdist = mix(sdfdist_a, sdfdist_b, u_mix);\n alpha *= smoothstep(0.5 - u_sdfgamma / floorwidth, 0.5 + u_sdfgamma / floorwidth, sdfdist);\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", vertexSource: "// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\nattribute vec4 a_pos_normal;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform vec2 u_patternscale_a;\nuniform float u_tex_y_a;\nuniform vec2 u_patternscale_b;\nuniform float u_tex_y_b;\nuniform vec2 u_gl_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize lowp float offset\n #pragma mapbox: initialize mediump float width\n #pragma mapbox: initialize lowp float floorwidth\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n\n vec2 pos = a_pos_normal.xy;\n\n // x is 1 if it's a round cap, 0 otherwise\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = a_pos_normal.zw;\n v_normal = normal;\n\n // these transformations used to be applied in the JS and native code bases.\n // moved them into the shader for clarity and simplicity.\n gapwidth = gapwidth / 2.0;\n float halfwidth = width / 2.0;\n offset = -1.0 * offset;\n\n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING;\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist =outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_tex_a = vec2(a_linesofar * u_patternscale_a.x / floorwidth, normal.y * u_patternscale_a.y + u_tex_y_a);\n v_tex_b = vec2(a_linesofar * u_patternscale_b.x / floorwidth, normal.y * u_patternscale_b.y + u_tex_y_b);\n\n v_width2 = vec2(outset, inset);\n}\n" }, raster: { fragmentSource: "uniform float u_fade_t;\nuniform float u_opacity;\nuniform sampler2D u_image0;\nuniform sampler2D u_image1;\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nuniform float u_brightness_low;\nuniform float u_brightness_high;\n\nuniform float u_saturation_factor;\nuniform float u_contrast_factor;\nuniform vec3 u_spin_weights;\n\nvoid main() {\n\n // read and cross-fade colors from the main and parent tiles\n vec4 color0 = texture2D(u_image0, v_pos0);\n vec4 color1 = texture2D(u_image1, v_pos1);\n if (color0.a > 0.0) {\n color0.rgb = color0.rgb / color0.a;\n }\n if (color1.a > 0.0) {\n color1.rgb = color1.rgb / color1.a;\n }\n vec4 color = mix(color0, color1, u_fade_t);\n color.a *= u_opacity;\n vec3 rgb = color.rgb;\n\n // spin\n rgb = vec3(\n dot(rgb, u_spin_weights.xyz),\n dot(rgb, u_spin_weights.zxy),\n dot(rgb, u_spin_weights.yzx));\n\n // saturation\n float average = (color.r + color.g + color.b) / 3.0;\n rgb += (average - rgb) * u_saturation_factor;\n\n // contrast\n rgb = (rgb - 0.5) * u_contrast_factor + 0.5;\n\n // brightness\n vec3 u_high_vec = vec3(u_brightness_low, u_brightness_low, u_brightness_low);\n vec3 u_low_vec = vec3(u_brightness_high, u_brightness_high, u_brightness_high);\n\n gl_FragColor = vec4(mix(u_high_vec, u_low_vec, rgb) * color.a, color.a);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", vertexSource: "uniform mat4 u_matrix;\nuniform vec2 u_tl_parent;\nuniform float u_scale_parent;\nuniform float u_buffer_scale;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n // We are using Int16 for texture position coordinates to give us enough precision for\n // fractional coordinates. We use 8192 to scale the texture coordinates in the buffer\n // as an arbitrarily high number to preserve adequate precision when rendering.\n // This is also the same value as the EXTENT we are using for our tile buffer pos coordinates,\n // so math for modifying either is consistent.\n v_pos0 = (((a_texture_pos / 8192.0) - 0.5) / u_buffer_scale ) + 0.5;\n v_pos1 = (v_pos0 * u_scale_parent) + u_tl_parent;\n}\n" }, symbolIcon: { fragmentSource: "uniform sampler2D u_texture;\n\n#pragma mapbox: define lowp float opacity\n\nvarying vec2 v_tex;\nvarying float v_fade_opacity;\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n lowp float alpha = opacity * v_fade_opacity;\n gl_FragColor = texture2D(u_texture, v_tex) * alpha;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", vertexSource: "const float PI = 3.141592653589793;\n\nattribute vec4 a_pos_offset;\nattribute vec4 a_data;\nattribute vec3 a_projected_pos;\nattribute float a_fade_opacity;\n\nuniform bool u_is_size_zoom_constant;\nuniform bool u_is_size_feature_constant;\nuniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function\nuniform highp float u_size; // used when size is both zoom and feature constant\nuniform highp float u_camera_to_center_distance;\nuniform highp float u_pitch;\nuniform bool u_rotate_symbol;\nuniform highp float u_aspect_ratio;\nuniform float u_fade_change;\n\n#pragma mapbox: define lowp float opacity\n\nuniform mat4 u_matrix;\nuniform mat4 u_label_plane_matrix;\nuniform mat4 u_gl_coord_matrix;\n\nuniform bool u_is_text;\nuniform bool u_pitch_with_map;\n\nuniform vec2 u_texsize;\n\nvarying vec2 v_tex;\nvarying float v_fade_opacity;\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n vec2 a_pos = a_pos_offset.xy;\n vec2 a_offset = a_pos_offset.zw;\n\n vec2 a_tex = a_data.xy;\n vec2 a_size = a_data.zw;\n\n highp float segment_angle = -a_projected_pos[2];\n\n float size;\n if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = mix(a_size[0], a_size[1], u_size_t) / 10.0;\n } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = a_size[0] / 10.0;\n } else if (!u_is_size_zoom_constant && u_is_size_feature_constant) {\n size = u_size;\n } else {\n size = u_size;\n }\n\n vec4 projectedPoint = u_matrix * vec4(a_pos, 0, 1);\n highp float camera_to_anchor_distance = projectedPoint.w;\n // See comments in symbol_sdf.vertex\n highp float distance_ratio = u_pitch_with_map ?\n camera_to_anchor_distance / u_camera_to_center_distance :\n u_camera_to_center_distance / camera_to_anchor_distance;\n highp float perspective_ratio = 0.5 + 0.5 * distance_ratio;\n\n size *= perspective_ratio;\n\n float fontScale = u_is_text ? size / 24.0 : size;\n\n highp float symbol_rotation = 0.0;\n if (u_rotate_symbol) {\n // See comments in symbol_sdf.vertex\n vec4 offsetProjectedPoint = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1);\n\n vec2 a = projectedPoint.xy / projectedPoint.w;\n vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w;\n\n symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x);\n }\n\n highp float angle_sin = sin(segment_angle + symbol_rotation);\n highp float angle_cos = cos(segment_angle + symbol_rotation);\n mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos);\n\n vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, 0.0, 1.0);\n gl_Position = u_gl_coord_matrix * vec4(projected_pos.xy / projected_pos.w + rotation_matrix * (a_offset / 64.0 * fontScale), 0.0, 1.0);\n\n v_tex = a_tex / u_texsize;\n vec2 fade_opacity = unpack_opacity(a_fade_opacity);\n float fade_change = fade_opacity[1] > 0.5 ? u_fade_change : -u_fade_change;\n v_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change));\n}\n" }, symbolSDF: { fragmentSource: "#define SDF_PX 8.0\n#define EDGE_GAMMA 0.105/DEVICE_PIXEL_RATIO\n\nuniform bool u_is_halo;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\n\nuniform sampler2D u_texture;\nuniform highp float u_gamma_scale;\nuniform bool u_is_text;\n\nvarying vec2 v_data0;\nvarying vec3 v_data1;\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 fill_color\n #pragma mapbox: initialize highp vec4 halo_color\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp float halo_width\n #pragma mapbox: initialize lowp float halo_blur\n\n vec2 tex = v_data0.xy;\n float gamma_scale = v_data1.x;\n float size = v_data1.y;\n float fade_opacity = v_data1[2];\n\n float fontScale = u_is_text ? size / 24.0 : size;\n\n lowp vec4 color = fill_color;\n highp float gamma = EDGE_GAMMA / (fontScale * u_gamma_scale);\n lowp float buff = (256.0 - 64.0) / 256.0;\n if (u_is_halo) {\n color = halo_color;\n gamma = (halo_blur * 1.19 / SDF_PX + EDGE_GAMMA) / (fontScale * u_gamma_scale);\n buff = (6.0 - halo_width / fontScale) / SDF_PX;\n }\n\n lowp float dist = texture2D(u_texture, tex).a;\n highp float gamma_scaled = gamma * gamma_scale;\n highp float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist);\n\n gl_FragColor = color * (alpha * opacity * fade_opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", vertexSource: "const float PI = 3.141592653589793;\n\nattribute vec4 a_pos_offset;\nattribute vec4 a_data;\nattribute vec3 a_projected_pos;\nattribute float a_fade_opacity;\n\n// contents of a_size vary based on the type of property value\n// used for {text,icon}-size.\n// For constants, a_size is disabled.\n// For source functions, we bind only one value per vertex: the value of {text,icon}-size evaluated for the current feature.\n// For composite functions:\n// [ text-size(lowerZoomStop, feature),\n// text-size(upperZoomStop, feature) ]\nuniform bool u_is_size_zoom_constant;\nuniform bool u_is_size_feature_constant;\nuniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function\nuniform highp float u_size; // used when size is both zoom and feature constant\n\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\n\nuniform mat4 u_matrix;\nuniform mat4 u_label_plane_matrix;\nuniform mat4 u_gl_coord_matrix;\n\nuniform bool u_is_text;\nuniform bool u_pitch_with_map;\nuniform highp float u_pitch;\nuniform bool u_rotate_symbol;\nuniform highp float u_aspect_ratio;\nuniform highp float u_camera_to_center_distance;\nuniform float u_fade_change;\n\nuniform vec2 u_texsize;\n\nvarying vec2 v_data0;\nvarying vec3 v_data1;\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 fill_color\n #pragma mapbox: initialize highp vec4 halo_color\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp float halo_width\n #pragma mapbox: initialize lowp float halo_blur\n\n vec2 a_pos = a_pos_offset.xy;\n vec2 a_offset = a_pos_offset.zw;\n\n vec2 a_tex = a_data.xy;\n vec2 a_size = a_data.zw;\n\n highp float segment_angle = -a_projected_pos[2];\n float size;\n\n if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = mix(a_size[0], a_size[1], u_size_t) / 10.0;\n } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = a_size[0] / 10.0;\n } else if (!u_is_size_zoom_constant && u_is_size_feature_constant) {\n size = u_size;\n } else {\n size = u_size;\n }\n\n vec4 projectedPoint = u_matrix * vec4(a_pos, 0, 1);\n highp float camera_to_anchor_distance = projectedPoint.w;\n // If the label is pitched with the map, layout is done in pitched space,\n // which makes labels in the distance smaller relative to viewport space.\n // We counteract part of that effect by multiplying by the perspective ratio.\n // If the label isn't pitched with the map, we do layout in viewport space,\n // which makes labels in the distance larger relative to the features around\n // them. We counteract part of that effect by dividing by the perspective ratio.\n highp float distance_ratio = u_pitch_with_map ?\n camera_to_anchor_distance / u_camera_to_center_distance :\n u_camera_to_center_distance / camera_to_anchor_distance;\n highp float perspective_ratio = 0.5 + 0.5 * distance_ratio;\n\n size *= perspective_ratio;\n\n float fontScale = u_is_text ? size / 24.0 : size;\n\n highp float symbol_rotation = 0.0;\n if (u_rotate_symbol) {\n // Point labels with 'rotation-alignment: map' are horizontal with respect to tile units\n // To figure out that angle in projected space, we draw a short horizontal line in tile\n // space, project it, and measure its angle in projected space.\n vec4 offsetProjectedPoint = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1);\n\n vec2 a = projectedPoint.xy / projectedPoint.w;\n vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w;\n\n symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x);\n }\n\n highp float angle_sin = sin(segment_angle + symbol_rotation);\n highp float angle_cos = cos(segment_angle + symbol_rotation);\n mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos);\n\n vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, 0.0, 1.0);\n gl_Position = u_gl_coord_matrix * vec4(projected_pos.xy / projected_pos.w + rotation_matrix * (a_offset / 64.0 * fontScale), 0.0, 1.0);\n float gamma_scale = gl_Position.w;\n\n vec2 tex = a_tex / u_texsize;\n vec2 fade_opacity = unpack_opacity(a_fade_opacity);\n float fade_change = fade_opacity[1] > 0.5 ? u_fade_change : -u_fade_change;\n float interpolated_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change));\n\n v_data0 = vec2(tex.x, tex.y);\n v_data1 = vec3(gamma_scale, size, interpolated_fade_opacity);\n}\n" } }; // Expand #pragmas to #ifdefs. var re = /#pragma mapbox: ([\w]+) ([\w]+) ([\w]+) ([\w]+)/g; var loop = function ( programName ) { var program = shaders[programName]; var fragmentPragmas = {}; program.fragmentSource = program.fragmentSource.replace(re, function (match , operation , precision , type , name ) { fragmentPragmas[name] = true; if (operation === 'define') { return ("\n#ifndef HAS_UNIFORM_u_" + name + "\nvarying " + precision + " " + type + " " + name + ";\n#else\nuniform " + precision + " " + type + " u_" + name + ";\n#endif\n"); } else /* if (operation === 'initialize') */ { return ("\n#ifdef HAS_UNIFORM_u_" + name + "\n " + precision + " " + type + " " + name + " = u_" + name + ";\n#endif\n"); } }); program.vertexSource = program.vertexSource.replace(re, function (match , operation , precision , type , name ) { var attrType = type === 'float' ? 'vec2' : 'vec4'; if (fragmentPragmas[name]) { if (operation === 'define') { return ("\n#ifndef HAS_UNIFORM_u_" + name + "\nuniform lowp float a_" + name + "_t;\nattribute " + precision + " " + attrType + " a_" + name + ";\nvarying " + precision + " " + type + " " + name + ";\n#else\nuniform " + precision + " " + type + " u_" + name + ";\n#endif\n"); } else /* if (operation === 'initialize') */ { return ("\n#ifndef HAS_UNIFORM_u_" + name + "\n " + name + " = unpack_mix_" + attrType + "(a_" + name + ", a_" + name + "_t);\n#else\n " + precision + " " + type + " " + name + " = u_" + name + ";\n#endif\n"); } } else { if (operation === 'define') { return ("\n#ifndef HAS_UNIFORM_u_" + name + "\nuniform lowp float a_" + name + "_t;\nattribute " + precision + " " + attrType + " a_" + name + ";\n#else\nuniform " + precision + " " + type + " u_" + name + ";\n#endif\n"); } else /* if (operation === 'initialize') */ { return ("\n#ifndef HAS_UNIFORM_u_" + name + "\n " + precision + " " + type + " " + name + " = unpack_mix_" + attrType + "(a_" + name + ", a_" + name + "_t);\n#else\n " + precision + " " + type + " " + name + " = u_" + name + ";\n#endif\n"); } } }); }; for (var programName in shaders) loop( programName ); module.exports = shaders; },{}],103:[function(require,module,exports){ 'use strict';// var ImageSource = require('./image_source'); var window = require('../util/window'); var rasterBoundsAttributes = require('../data/raster_bounds_attributes'); var VertexArrayObject = require('../render/vertex_array_object'); var Texture = require('../render/texture'); /** * A data source containing the contents of an HTML canvas. * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-canvas) for detailed documentation of options.) * @interface CanvasSource * @example * // add to map * map.addSource('some id', { * type: 'canvas', * canvas: 'idOfMyHTMLCanvas', * animate: true, * coordinates: [ * [-76.54, 39.18], * [-76.52, 39.18], * [-76.52, 39.17], * [-76.54, 39.17] * ] * }); * * // update * var mySource = map.getSource('some id'); * mySource.setCoordinates([ * [-76.54335737228394, 39.18579907229748], * [-76.52803659439087, 39.1838364847587], * [-76.5295386314392, 39.17683392507606], * [-76.54520273208618, 39.17876344106642] * ]); * * map.removeSource('some id'); // remove */ var CanvasSource = (function (ImageSource) { function CanvasSource(id , options , dispatcher , eventedParent ) { ImageSource.call(this, id, options, dispatcher, eventedParent); this.options = options; this.animate = options.animate !== undefined ? options.animate : true; } if ( ImageSource ) CanvasSource.__proto__ = ImageSource; CanvasSource.prototype = Object.create( ImageSource && ImageSource.prototype ); CanvasSource.prototype.constructor = CanvasSource; /** * Enables animation. The image will be copied from the canvas to the map on each frame. * @method play * @instance * @memberof CanvasSource */ /** * Disables animation. The map will display a static copy of the canvas image. * @method pause * @instance * @memberof CanvasSource */ CanvasSource.prototype.load = function load () { this.canvas = this.canvas || window.document.getElementById(this.options.canvas); this.width = this.canvas.width; this.height = this.canvas.height; if (this._hasInvalidDimensions()) { this.fire('error', new Error('Canvas dimensions cannot be less than or equal to zero.')); return; } this.play = function() { this._playing = true; this.map._rerender(); }; this.pause = function() { this._playing = false; }; this._finishLoading(); }; /** * Returns the HTML `canvas` element. * * @returns {HTMLCanvasElement} The HTML `canvas` element. */ CanvasSource.prototype.getCanvas = function getCanvas () { return this.canvas; }; CanvasSource.prototype.onAdd = function onAdd (map ) { this.map = map; this.load(); if (this.canvas) { if (this.animate) { this.play(); } } }; CanvasSource.prototype.onRemove = function onRemove () { this.pause(); }; /** * Sets the canvas's coordinates and re-renders the map. * * @method setCoordinates * @instance * @memberof CanvasSource * @param {Array>} coordinates Four geographical coordinates, * represented as arrays of longitude and latitude numbers, which define the corners of the canvas. * The coordinates start at the top left corner of the canvas and proceed in clockwise order. * They do not have to represent a rectangle. * @returns {CanvasSource} this */ // setCoordinates inherited from ImageSource CanvasSource.prototype.prepare = function prepare () { var this$1 = this; var resize = false; if (this.canvas.width !== this.width) { this.width = this.canvas.width; resize = true; } if (this.canvas.height !== this.height) { this.height = this.canvas.height; resize = true; } if (this._hasInvalidDimensions()) { return; } if (Object.keys(this.tiles).length === 0) { return; } // not enough data for current position var context = this.map.painter.context; var gl = context.gl; if (!this.boundsBuffer) { this.boundsBuffer = context.createVertexBuffer(this._boundsArray, rasterBoundsAttributes.members); } if (!this.boundsVAO) { this.boundsVAO = new VertexArrayObject(); } if (!this.texture) { this.texture = new Texture(context, this.canvas, gl.RGBA); this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); } else if (resize) { this.texture.update(this.canvas); } else if (this._playing) { this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.canvas); } for (var w in this$1.tiles) { var tile = this$1.tiles[w]; if (tile.state !== 'loaded') { tile.state = 'loaded'; tile.texture = this$1.texture; } } }; CanvasSource.prototype.serialize = function serialize () { return { type: 'canvas', canvas: this.canvas, coordinates: this.coordinates }; }; CanvasSource.prototype.hasTransition = function hasTransition () { return this._playing; }; CanvasSource.prototype._hasInvalidDimensions = function _hasInvalidDimensions () { var this$1 = this; for (var i = 0, list = [this$1.canvas.width, this$1.canvas.height]; i < list.length; i += 1) { var x = list[i]; if (isNaN(x) || x <= 0) { return true; } } return false; }; return CanvasSource; }(ImageSource)); module.exports = CanvasSource; },{"../data/raster_bounds_attributes":64,"../render/texture":98,"../render/vertex_array_object":100,"../util/window":259,"./image_source":107}],104:[function(require,module,exports){ 'use strict';// var Evented = require('../util/evented'); var util = require('../util/util'); var window = require('../util/window'); var EXTENT = require('../data/extent'); var ResourceType = require('../util/ajax').ResourceType; var browser = require('../util/browser'); /** * A source containing GeoJSON. * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-geojson) for detailed documentation of options.) * * @interface GeoJSONSource * @example * * map.addSource('some id', { * type: 'geojson', * data: 'https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_10m_ports.geojson' * }); * * @example * map.addSource('some id', { * type: 'geojson', * data: { * "type": "FeatureCollection", * "features": [{ * "type": "Feature", * "properties": {}, * "geometry": { * "type": "Point", * "coordinates": [ * -76.53063297271729, * 39.18174077994108 * ] * } * }] * } * }); * * @example * map.getSource('some id').setData({ * "type": "FeatureCollection", * "features": [{ * "type": "Feature", * "properties": { "name": "Null Island" }, * "geometry": { * "type": "Point", * "coordinates": [ 0, 0 ] * } * }] * }); * @see [Draw GeoJSON points](https://www.mapbox.com/mapbox-gl-js/example/geojson-markers/) * @see [Add a GeoJSON line](https://www.mapbox.com/mapbox-gl-js/example/geojson-line/) * @see [Create a heatmap from points](https://www.mapbox.com/mapbox-gl-js/example/heatmap/) */ var GeoJSONSource = (function (Evented) { function GeoJSONSource(id , options , dispatcher , eventedParent ) { Evented.call(this); this.id = id; // `type` is a property rather than a constant to make it easy for 3rd // parties to use GeoJSONSource to build their own source types. this.type = 'geojson'; this.minzoom = 0; this.maxzoom = 18; this.tileSize = 512; this.isTileClipped = true; this.reparseOverscaled = true; this.dispatcher = dispatcher; this.setEventedParent(eventedParent); this._data = (options.data ); this._options = util.extend({}, options); this._collectResourceTiming = options.collectResourceTiming; this._resourceTiming = []; if (options.maxzoom !== undefined) { this.maxzoom = options.maxzoom; } if (options.type) { this.type = options.type; } var scale = EXTENT / this.tileSize; // sent to the worker, along with `url: ...` or `data: literal geojson`, // so that it can load/parse/index the geojson data // extending with `options.workerOptions` helps to make it easy for // third-party sources to hack/reuse GeoJSONSource. this.workerOptions = util.extend({ source: this.id, cluster: options.cluster || false, geojsonVtOptions: { buffer: (options.buffer !== undefined ? options.buffer : 128) * scale, tolerance: (options.tolerance !== undefined ? options.tolerance : 0.375) * scale, extent: EXTENT, maxZoom: this.maxzoom }, superclusterOptions: { maxZoom: options.clusterMaxZoom !== undefined ? Math.min(options.clusterMaxZoom, this.maxzoom - 1) : (this.maxzoom - 1), extent: EXTENT, radius: (options.clusterRadius || 50) * scale, log: false } }, options.workerOptions); } if ( Evented ) GeoJSONSource.__proto__ = Evented; GeoJSONSource.prototype = Object.create( Evented && Evented.prototype ); GeoJSONSource.prototype.constructor = GeoJSONSource; GeoJSONSource.prototype.load = function load () { var this$1 = this; this.fire('dataloading', {dataType: 'source'}); this._updateWorkerData(function (err) { if (err) { this$1.fire('error', {error: err}); return; } var data = { dataType: 'source', sourceDataType: 'metadata' }; if (this$1._collectResourceTiming && this$1._resourceTiming && (this$1._resourceTiming.length > 0)) { data.resourceTiming = this$1._resourceTiming; this$1._resourceTiming = []; } // although GeoJSON sources contain no metadata, we fire this event to let the SourceCache // know its ok to start requesting tiles. this$1.fire('data', data); }); }; GeoJSONSource.prototype.onAdd = function onAdd (map ) { this.map = map; this.load(); }; /** * Sets the GeoJSON data and re-renders the map. * * @param {Object|string} data A GeoJSON data object or a URL to one. The latter is preferable in the case of large GeoJSON files. * @returns {GeoJSONSource} this */ GeoJSONSource.prototype.setData = function setData (data ) { var this$1 = this; this._data = data; this.fire('dataloading', {dataType: 'source'}); this._updateWorkerData(function (err) { if (err) { return this$1.fire('error', { error: err }); } var data = { dataType: 'source', sourceDataType: 'content' }; if (this$1._collectResourceTiming && this$1._resourceTiming && (this$1._resourceTiming.length > 0)) { data.resourceTiming = this$1._resourceTiming; this$1._resourceTiming = []; } this$1.fire('data', data); }); return this; }; /* * Responsible for invoking WorkerSource's geojson.loadData target, which * handles loading the geojson data and preparing to serve it up as tiles, * using geojson-vt or supercluster as appropriate. */ GeoJSONSource.prototype._updateWorkerData = function _updateWorkerData (callback ) { var this$1 = this; var options = util.extend({}, this.workerOptions); var data = this._data; if (typeof data === 'string') { options.request = this.map._transformRequest(resolveURL(data), ResourceType.Source); options.request.collectResourceTiming = this._collectResourceTiming; } else { options.data = JSON.stringify(data); } // target {this.type}.loadData rather than literally geojson.loadData, // so that other geojson-like source types can easily reuse this // implementation this.workerID = this.dispatcher.send(((this.type) + ".loadData"), options, function (err, result) { this$1._loaded = true; if (result && result.resourceTiming && result.resourceTiming[this$1.id]) { this$1._resourceTiming = result.resourceTiming[this$1.id].slice(0); } callback(err); }, this.workerID); }; GeoJSONSource.prototype.loadTile = function loadTile (tile , callback ) { var this$1 = this; var message = tile.workerID === undefined || tile.state === 'expired' ? 'loadTile' : 'reloadTile'; var params = { type: this.type, uid: tile.uid, tileID: tile.tileID, zoom: tile.tileID.overscaledZ, maxZoom: this.maxzoom, tileSize: this.tileSize, source: this.id, pixelRatio: browser.devicePixelRatio, overscaling: tile.tileID.overscaleFactor(), showCollisionBoxes: this.map.showCollisionBoxes }; tile.workerID = this.dispatcher.send(message, params, function (err, data) { tile.unloadVectorData(); if (tile.aborted) { return callback(null); } if (err) { return callback(err); } tile.loadVectorData(data, this$1.map.painter, message === 'reloadTile'); return callback(null); }, this.workerID); }; GeoJSONSource.prototype.abortTile = function abortTile (tile ) { tile.aborted = true; }; GeoJSONSource.prototype.unloadTile = function unloadTile (tile ) { tile.unloadVectorData(); this.dispatcher.send('removeTile', { uid: tile.uid, type: this.type, source: this.id }, null, tile.workerID); }; GeoJSONSource.prototype.onRemove = function onRemove () { this.dispatcher.broadcast('removeSource', { type: this.type, source: this.id }); }; GeoJSONSource.prototype.serialize = function serialize () { return util.extend({}, this._options, { type: this.type, data: this._data }); }; GeoJSONSource.prototype.hasTransition = function hasTransition () { return false; }; return GeoJSONSource; }(Evented)); function resolveURL(url) { var a = window.document.createElement('a'); a.href = url; return a.href; } module.exports = GeoJSONSource; },{"../data/extent":58,"../util/ajax":256,"../util/browser":257,"../util/evented":265,"../util/util":280,"../util/window":259}],105:[function(require,module,exports){ 'use strict';// var ajax = require('../util/ajax'); var perf = require('../util/performance'); var rewind = require('geojson-rewind'); var GeoJSONWrapper = require('./geojson_wrapper'); var vtpbf = require('vt-pbf'); var supercluster = require('supercluster'); var geojsonvt = require('geojson-vt'); var VectorTileWorkerSource = require('./vector_tile_worker_source'); function loadGeoJSONTile(params , callback ) { var source = params.source, canonical = params.tileID.canonical; if (!this._geoJSONIndexes[source]) { return callback(null, null); // we couldn't load the file } var geoJSONTile = this._geoJSONIndexes[source].getTile(canonical.z, canonical.x, canonical.y); if (!geoJSONTile) { return callback(null, null); // nothing in the given tile } var geojsonWrapper = new GeoJSONWrapper(geoJSONTile.features); // Encode the geojson-vt tile into binary vector tile form form. This // is a convenience that allows `FeatureIndex` to operate the same way // across `VectorTileSource` and `GeoJSONSource` data. var pbf = vtpbf(geojsonWrapper); if (pbf.byteOffset !== 0 || pbf.byteLength !== pbf.buffer.byteLength) { // Compatibility with node Buffer (https://github.com/mapbox/pbf/issues/35) pbf = new Uint8Array(pbf); } callback(null, { vectorTile: geojsonWrapper, rawData: pbf.buffer }); } /** * The {@link WorkerSource} implementation that supports {@link GeoJSONSource}. * This class is designed to be easily reused to support custom source types * for data formats that can be parsed/converted into an in-memory GeoJSON * representation. To do so, create it with * `new GeoJSONWorkerSource(actor, layerIndex, customLoadGeoJSONFunction)`. * For a full example, see [mapbox-gl-topojson](https://github.com/developmentseed/mapbox-gl-topojson). * * @private */ var GeoJSONWorkerSource = (function (VectorTileWorkerSource) { function GeoJSONWorkerSource(actor , layerIndex , loadGeoJSON ) { VectorTileWorkerSource.call(this, actor, layerIndex, loadGeoJSONTile); if (loadGeoJSON) { this.loadGeoJSON = loadGeoJSON; } // object mapping source ids to geojson-vt-like tile indexes this._geoJSONIndexes = {}; } if ( VectorTileWorkerSource ) GeoJSONWorkerSource.__proto__ = VectorTileWorkerSource; GeoJSONWorkerSource.prototype = Object.create( VectorTileWorkerSource && VectorTileWorkerSource.prototype ); GeoJSONWorkerSource.prototype.constructor = GeoJSONWorkerSource; /** * Fetches (if appropriate), parses, and index geojson data into tiles. This * preparatory method must be called before {@link GeoJSONWorkerSource#loadTile} * can correctly serve up tiles. * * Defers to {@link GeoJSONWorkerSource#loadGeoJSON} for the fetching/parsing, * expecting `callback(error, data)` to be called with either an error or a * parsed GeoJSON object. * @param params * @param params.source The id of the source. * @param callback */ GeoJSONWorkerSource.prototype.loadData = function loadData (params , callback ) { var this$1 = this; this.loadGeoJSON(params, function (err, data) { if (err || !data) { return callback(err); } else if (typeof data !== 'object') { return callback(new Error("Input data is not a valid GeoJSON object.")); } else { rewind(data, true); try { this$1._geoJSONIndexes[params.source] = params.cluster ? supercluster(params.superclusterOptions).load(data.features) : geojsonvt(data, params.geojsonVtOptions); } catch (err) { return callback(err); } this$1.loaded[params.source] = {}; var result = {}; if (params.request && params.request.collectResourceTiming) { var resourceTimingData = perf.getEntriesByName(params.request.url); // it's necessary to eval the result of getEntriesByName() here via parse/stringify // late evaluation in the main thread causes TypeError: illegal invocation if (resourceTimingData) { result.resourceTiming = {}; result.resourceTiming[params.source] = JSON.parse(JSON.stringify(resourceTimingData)); } } callback(null, result); } }); }; /** * Implements {@link WorkerSource#reloadTile}. * * If the tile is loaded, uses the implementation in VectorTileWorkerSource. * Otherwise, such as after a setData() call, we load the tile fresh. * * @param params * @param params.source The id of the source for which we're loading this tile. * @param params.uid The UID for this tile. */ GeoJSONWorkerSource.prototype.reloadTile = function reloadTile (params , callback ) { var loaded = this.loaded[params.source], uid = params.uid; if (loaded && loaded[uid]) { return VectorTileWorkerSource.prototype.reloadTile.call(this, params, callback); } else { return this.loadTile(params, callback); } }; /** * Fetch and parse GeoJSON according to the given params. Calls `callback` * with `(err, data)`, where `data` is a parsed GeoJSON object. * * GeoJSON is loaded and parsed from `params.url` if it exists, or else * expected as a literal (string or object) `params.data`. * * @param params * @param [params.url] A URL to the remote GeoJSON data. * @param [params.data] Literal GeoJSON data. Must be provided if `params.url` is not. */ GeoJSONWorkerSource.prototype.loadGeoJSON = function loadGeoJSON (params , callback ) { // Because of same origin issues, urls must either include an explicit // origin or absolute path. // ie: /foo/bar.json or http://example.com/bar.json // but not ../foo/bar.json if (params.request) { ajax.getJSON(params.request, callback); } else if (typeof params.data === 'string') { try { return callback(null, JSON.parse(params.data)); } catch (e) { return callback(new Error("Input data is not a valid GeoJSON object.")); } } else { return callback(new Error("Input data is not a valid GeoJSON object.")); } }; GeoJSONWorkerSource.prototype.removeSource = function removeSource (params , callback ) { if (this._geoJSONIndexes[params.source]) { delete this._geoJSONIndexes[params.source]; } callback(); }; return GeoJSONWorkerSource; }(VectorTileWorkerSource)); module.exports = GeoJSONWorkerSource; },{"../util/ajax":256,"../util/performance":273,"./geojson_wrapper":106,"./vector_tile_worker_source":121,"geojson-rewind":16,"geojson-vt":20,"supercluster":34,"vt-pbf":39}],106:[function(require,module,exports){ 'use strict';// var Point = require('@mapbox/point-geometry'); var toGeoJSON = require('@mapbox/vector-tile').VectorTileFeature.prototype.toGeoJSON; var EXTENT = require('../data/extent'); // The feature type used by geojson-vt and supercluster. Should be extracted to // global type and used in module definitions for those two modules. var FeatureWrapper = function FeatureWrapper(feature ) { this._feature = feature; this.extent = EXTENT; this.type = feature.type; this.properties = feature.tags; // If the feature has a top-level `id` property, copy it over, but only // if it can be coerced to an integer, because this wrapper is used for // serializing geojson feature data into vector tile PBF data, and the // vector tile spec only supports integer values for feature ids -- // allowing non-integer values here results in a non-compliant PBF // that causes an exception when it is parsed with vector-tile-js if ('id' in feature && !isNaN(feature.id)) { this.id = parseInt(feature.id, 10); } }; FeatureWrapper.prototype.loadGeometry = function loadGeometry () { var this$1 = this; if (this._feature.type === 1) { var geometry = []; for (var i = 0, list = this$1._feature.geometry; i < list.length; i += 1) { var point = list[i]; geometry.push([new Point(point[0], point[1])]); } return geometry; } else { var geometry$1 = []; for (var i$1 = 0, list$1 = this$1._feature.geometry; i$1 < list$1.length; i$1 += 1) { var ring = list$1[i$1]; var newRing = []; for (var i$2 = 0, list$2 = ring; i$2 < list$2.length; i$2 += 1) { var point$1 = list$2[i$2]; newRing.push(new Point(point$1[0], point$1[1])); } geometry$1.push(newRing); } return geometry$1; } }; FeatureWrapper.prototype.toGeoJSON = function toGeoJSON$1 (x , y , z ) { return toGeoJSON.call(this, x, y, z); }; var GeoJSONWrapper = function GeoJSONWrapper(features ) { this.layers = { '_geojsonTileLayer': this }; this.name = '_geojsonTileLayer'; this.extent = EXTENT; this.length = features.length; this._features = features; }; GeoJSONWrapper.prototype.feature = function feature (i ) { return new FeatureWrapper(this._features[i]); }; module.exports = GeoJSONWrapper; },{"../data/extent":58,"@mapbox/point-geometry":4,"@mapbox/vector-tile":8}],107:[function(require,module,exports){ 'use strict';// var util = require('../util/util'); var ref = require('./tile_id'); var CanonicalTileID = ref.CanonicalTileID; var LngLat = require('../geo/lng_lat'); var Point = require('@mapbox/point-geometry'); var Evented = require('../util/evented'); var ajax = require('../util/ajax'); var browser = require('../util/browser'); var EXTENT = require('../data/extent'); var ref$1 = require('../data/array_types'); var RasterBoundsArray = ref$1.RasterBoundsArray; var rasterBoundsAttributes = require('../data/raster_bounds_attributes'); var VertexArrayObject = require('../render/vertex_array_object'); var Texture = require('../render/texture'); /** * A data source containing an image. * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-image) for detailed documentation of options.) * * @interface ImageSource * @example * // add to map * map.addSource('some id', { * type: 'image', * url: 'https://www.mapbox.com/images/foo.png', * coordinates: [ * [-76.54, 39.18], * [-76.52, 39.18], * [-76.52, 39.17], * [-76.54, 39.17] * ] * }); * * // update * var mySource = map.getSource('some id'); * mySource.setCoordinates([ * [-76.54335737228394, 39.18579907229748], * [-76.52803659439087, 39.1838364847587], * [-76.5295386314392, 39.17683392507606], * [-76.54520273208618, 39.17876344106642] * ]); * * map.removeSource('some id'); // remove * @see [Add an image](https://www.mapbox.com/mapbox-gl-js/example/image-on-a-map/) */ var ImageSource = (function (Evented) { function ImageSource(id , options , dispatcher , eventedParent ) { Evented.call(this); this.id = id; this.dispatcher = dispatcher; this.coordinates = options.coordinates; this.type = 'image'; this.minzoom = 0; this.maxzoom = 22; this.tileSize = 512; this.tiles = {}; this.setEventedParent(eventedParent); this.options = options; } if ( Evented ) ImageSource.__proto__ = Evented; ImageSource.prototype = Object.create( Evented && Evented.prototype ); ImageSource.prototype.constructor = ImageSource; ImageSource.prototype.load = function load () { var this$1 = this; this.fire('dataloading', {dataType: 'source'}); this.url = this.options.url; ajax.getImage(this.map._transformRequest(this.url, ajax.ResourceType.Image), function (err, image) { if (err) { this$1.fire('error', {error: err}); } else if (image) { this$1.image = browser.getImageData(image); this$1._finishLoading(); } }); }; ImageSource.prototype._finishLoading = function _finishLoading () { if (this.map) { this.setCoordinates(this.coordinates); this.fire('data', {dataType: 'source', sourceDataType: 'metadata'}); } }; ImageSource.prototype.onAdd = function onAdd (map ) { this.map = map; this.load(); }; /** * Sets the image's coordinates and re-renders the map. * * @param {Array>} coordinates Four geographical coordinates, * represented as arrays of longitude and latitude numbers, which define the corners of the image. * The coordinates start at the top left corner of the image and proceed in clockwise order. * They do not have to represent a rectangle. * @returns {ImageSource} this */ ImageSource.prototype.setCoordinates = function setCoordinates (coordinates ) { this.coordinates = coordinates; // Calculate which mercator tile is suitable for rendering the video in // and create a buffer with the corner coordinates. These coordinates // may be outside the tile, because raster tiles aren't clipped when rendering. var map = this.map; // transform the geo coordinates into (zoom 0) tile space coordinates var cornerZ0Coords = coordinates.map(function (coord) { return map.transform.locationCoordinate(LngLat.convert(coord)).zoomTo(0); }); // Compute the coordinates of the tile we'll use to hold this image's // render data var centerCoord = this.centerCoord = util.getCoordinatesCenter(cornerZ0Coords); // `column` and `row` may be fractional; round them down so that they // represent integer tile coordinates centerCoord.column = Math.floor(centerCoord.column); centerCoord.row = Math.floor(centerCoord.row); this.tileID = new CanonicalTileID(centerCoord.zoom, centerCoord.column, centerCoord.row); // Constrain min/max zoom to our tile's zoom level in order to force // SourceCache to request this tile (no matter what the map's zoom // level) this.minzoom = this.maxzoom = centerCoord.zoom; // Transform the corner coordinates into the coordinate space of our // tile. var tileCoords = cornerZ0Coords.map(function (coord) { var zoomedCoord = coord.zoomTo(centerCoord.zoom); return new Point( Math.round((zoomedCoord.column - centerCoord.column) * EXTENT), Math.round((zoomedCoord.row - centerCoord.row) * EXTENT)); }); this._boundsArray = new RasterBoundsArray(); this._boundsArray.emplaceBack(tileCoords[0].x, tileCoords[0].y, 0, 0); this._boundsArray.emplaceBack(tileCoords[1].x, tileCoords[1].y, EXTENT, 0); this._boundsArray.emplaceBack(tileCoords[3].x, tileCoords[3].y, 0, EXTENT); this._boundsArray.emplaceBack(tileCoords[2].x, tileCoords[2].y, EXTENT, EXTENT); if (this.boundsBuffer) { this.boundsBuffer.destroy(); delete this.boundsBuffer; } this.fire('data', {dataType:'source', sourceDataType: 'content'}); return this; }; ImageSource.prototype.prepare = function prepare () { var this$1 = this; if (Object.keys(this.tiles).length === 0 || !this.image) { return; } var context = this.map.painter.context; var gl = context.gl; if (!this.boundsBuffer) { this.boundsBuffer = context.createVertexBuffer(this._boundsArray, rasterBoundsAttributes.members); } if (!this.boundsVAO) { this.boundsVAO = new VertexArrayObject(); } if (!this.texture) { this.texture = new Texture(context, this.image, gl.RGBA); this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); } for (var w in this$1.tiles) { var tile = this$1.tiles[w]; if (tile.state !== 'loaded') { tile.state = 'loaded'; tile.texture = this$1.texture; } } }; ImageSource.prototype.loadTile = function loadTile (tile , callback ) { // We have a single tile -- whoose coordinates are this.tileID -- that // covers the image we want to render. If that's the one being // requested, set it up with the image; otherwise, mark the tile as // `errored` to indicate that we have no data for it. // If the world wraps, we may have multiple "wrapped" copies of the // single tile. if (this.tileID && this.tileID.equals(tile.tileID.canonical)) { this.tiles[String(tile.tileID.wrap)] = tile; tile.buckets = {}; callback(null); } else { tile.state = 'errored'; callback(null); } }; ImageSource.prototype.serialize = function serialize () { return { type: 'image', url: this.options.url, coordinates: this.coordinates }; }; ImageSource.prototype.hasTransition = function hasTransition () { return false; }; return ImageSource; }(Evented)); module.exports = ImageSource; },{"../data/array_types":44,"../data/extent":58,"../data/raster_bounds_attributes":64,"../geo/lng_lat":67,"../render/texture":98,"../render/vertex_array_object":100,"../util/ajax":256,"../util/browser":257,"../util/evented":265,"../util/util":280,"./tile_id":119,"@mapbox/point-geometry":4}],108:[function(require,module,exports){ 'use strict';// var util = require('../util/util'); var ajax = require('../util/ajax'); var browser = require('../util/browser'); var normalizeURL = require('../util/mapbox').normalizeSourceURL; module.exports = function(options , requestTransformFn , callback ) { var loaded = function(err, tileJSON ) { if (err) { return callback(err); } else if (tileJSON) { var result = util.pick(tileJSON, ['tiles', 'minzoom', 'maxzoom', 'attribution', 'mapbox_logo', 'bounds']); if (tileJSON.vector_layers) { result.vectorLayers = tileJSON.vector_layers; result.vectorLayerIds = result.vectorLayers.map(function (layer) { return layer.id; }); } callback(null, result); } }; if (options.url) { ajax.getJSON(requestTransformFn(normalizeURL(options.url), ajax.ResourceType.Source), loaded); } else { browser.frame(function () { return loaded(null, options); }); } }; },{"../util/ajax":256,"../util/browser":257,"../util/mapbox":272,"../util/util":280}],109:[function(require,module,exports){ 'use strict';// var EXTENT = require('../data/extent'); /** * Converts a pixel value at a the given zoom level to tile units. * * The shaders mostly calculate everything in tile units so style * properties need to be converted from pixels to tile units using this. * * For example, a translation by 30 pixels at zoom 6.5 will be a * translation by pixelsToTileUnits(30, 6.5) tile units. * * @returns value in tile units * @private */ module.exports = function(tile , pixelValue , z ) { return pixelValue * (EXTENT / (tile.tileSize * Math.pow(2, z - tile.tileID.overscaledZ))); }; },{"../data/extent":58}],110:[function(require,module,exports){ 'use strict';// exports.rendered = function(sourceCache , styleLayers , queryGeometry , params , zoom , bearing , collisionIndex ) { var tilesIn = sourceCache.tilesIn(queryGeometry); tilesIn.sort(sortTilesIn); var renderedFeatureLayers = []; for (var i = 0, list = tilesIn; i < list.length; i += 1) { var tileIn = list[i]; renderedFeatureLayers.push({ wrappedTileID: tileIn.tileID.wrapped().key, queryResults: tileIn.tile.queryRenderedFeatures( styleLayers, tileIn.queryGeometry, tileIn.scale, params, bearing, sourceCache.id, collisionIndex) }); } return mergeRenderedFeatureLayers(renderedFeatureLayers); }; exports.source = function(sourceCache , params ) { var tiles = sourceCache.getRenderableIds().map(function (id) { return sourceCache.getTileByID(id); }); var result = []; var dataTiles = {}; for (var i = 0; i < tiles.length; i++) { var tile = tiles[i]; var dataID = tile.tileID.canonical.key; if (!dataTiles[dataID]) { dataTiles[dataID] = true; tile.querySourceFeatures(result, params); } } return result; }; function sortTilesIn(a, b) { var idA = a.tileID; var idB = b.tileID; return (idA.overscaledZ - idB.overscaledZ) || (idA.canonical.y - idB.canonical.y) || (idA.wrap - idB.wrap) || (idA.canonical.x - idB.canonical.x); } function mergeRenderedFeatureLayers(tiles) { // Merge results from all tiles, but if two tiles share the same // wrapped ID, don't duplicate features between the two tiles var result = {}; var wrappedIDLayerMap = {}; for (var i = 0, list = tiles; i < list.length; i += 1) { var tile = list[i]; var queryResults = tile.queryResults; var wrappedID = tile.wrappedTileID; var wrappedIDLayers = wrappedIDLayerMap[wrappedID] = wrappedIDLayerMap[wrappedID] || {}; for (var layerID in queryResults) { var tileFeatures = queryResults[layerID]; var wrappedIDFeatures = wrappedIDLayers[layerID] = wrappedIDLayers[layerID] || {}; var resultFeatures = result[layerID] = result[layerID] || []; for (var i$1 = 0, list$1 = tileFeatures; i$1 < list$1.length; i$1 += 1) { var tileFeature = list$1[i$1]; if (!wrappedIDFeatures[tileFeature.featureIndex]) { wrappedIDFeatures[tileFeature.featureIndex] = true; resultFeatures.push(tileFeature.feature); } } } } return result; } },{}],111:[function(require,module,exports){ 'use strict';// var ajax = require('../util/ajax'); var util = require('../util/util'); var Evented = require('../util/evented'); var normalizeURL = require('../util/mapbox').normalizeTileURL; var browser = require('../util/browser'); var ref = require('./tile_id'); var OverscaledTileID = ref.OverscaledTileID; var RasterTileSource = require('./raster_tile_source'); var RasterDEMTileSource = (function (RasterTileSource) { function RasterDEMTileSource(id , options , dispatcher , eventedParent ) { RasterTileSource.call(this, id, options, dispatcher, eventedParent); this.type = 'raster-dem'; this.maxzoom = 22; this._options = util.extend({}, options); } if ( RasterTileSource ) RasterDEMTileSource.__proto__ = RasterTileSource; RasterDEMTileSource.prototype = Object.create( RasterTileSource && RasterTileSource.prototype ); RasterDEMTileSource.prototype.constructor = RasterDEMTileSource; RasterDEMTileSource.prototype.serialize = function serialize () { return { type: 'raster-dem', url: this.url, tileSize: this.tileSize, tiles: this.tiles, bounds: this.bounds, }; }; RasterDEMTileSource.prototype.loadTile = function loadTile (tile , callback ) { var url = normalizeURL(tile.tileID.canonical.url(this.tiles, this.scheme), this.url, this.tileSize); tile.request = ajax.getImage(this.map._transformRequest(url, ajax.ResourceType.Tile), imageLoaded.bind(this)); tile.neighboringTiles = this._getNeighboringTiles(tile.tileID); function imageLoaded(err, img) { delete tile.request; if (tile.aborted) { tile.state = 'unloaded'; callback(null); } else if (err) { tile.state = 'errored'; callback(err); } else if (img) { if (this.map._refreshExpiredTiles) { tile.setExpiryData(img); } delete (img ).cacheControl; delete (img ).expires; var rawImageData = browser.getImageData(img); var params = { uid: tile.uid, coord: tile.tileID, source: this.id, rawImageData: rawImageData }; if (!tile.workerID || tile.state === 'expired') { tile.workerID = this.dispatcher.send('loadDEMTile', params, done.bind(this)); } } } function done(err, dem) { if (err) { tile.state = 'errored'; callback(err); } if (dem) { tile.dem = dem; tile.needsHillshadePrepare = true; tile.state = 'loaded'; callback(null); } } }; RasterDEMTileSource.prototype._getNeighboringTiles = function _getNeighboringTiles (tileID ) { var canonical = tileID.canonical; var dim = Math.pow(2, canonical.z); var px = (canonical.x - 1 + dim) % dim; var pxw = canonical.x === 0 ? tileID.wrap - 1 : tileID.wrap; var nx = (canonical.x + 1 + dim) % dim; var nxw = canonical.x + 1 === dim ? tileID.wrap + 1 : tileID.wrap; var neighboringTiles = {}; // add adjacent tiles neighboringTiles[new OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y).key] = {backfilled: false}; neighboringTiles[new OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y).key] = {backfilled: false}; // Add upper neighboringTiles if (canonical.y > 0) { neighboringTiles[new OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y - 1).key] = {backfilled: false}; neighboringTiles[new OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y - 1).key] = {backfilled: false}; neighboringTiles[new OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y - 1).key] = {backfilled: false}; } // Add lower neighboringTiles if (canonical.y + 1 < dim) { neighboringTiles[new OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y + 1).key] = {backfilled: false}; neighboringTiles[new OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y + 1).key] = {backfilled: false}; neighboringTiles[new OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y + 1).key] = {backfilled: false}; } return neighboringTiles; }; RasterDEMTileSource.prototype.unloadTile = function unloadTile (tile ) { if (tile.demTexture) { this.map.painter.saveTileTexture(tile.demTexture); } if (tile.fbo) { tile.fbo.destroy(); delete tile.fbo; } if (tile.dem) { delete tile.dem; } delete tile.neighboringTiles; tile.state = 'unloaded'; this.dispatcher.send('removeDEMTile', { uid: tile.uid, source: this.id }, undefined, tile.workerID); }; return RasterDEMTileSource; }(RasterTileSource)); module.exports = RasterDEMTileSource; },{"../util/ajax":256,"../util/browser":257,"../util/evented":265,"../util/mapbox":272,"../util/util":280,"./raster_tile_source":113,"./tile_id":119}],112:[function(require,module,exports){ 'use strict';// var ref = require('../data/dem_data'); var DEMData = ref.DEMData; var RasterDEMTileWorkerSource = function RasterDEMTileWorkerSource() { this.loading = {}; this.loaded = {}; }; RasterDEMTileWorkerSource.prototype.loadTile = function loadTile (params , callback ) { var source = params.source, uid = params.uid; if (!this.loading[source]) { this.loading[source] = {}; } var dem = new DEMData(uid); this.loading[source][uid] = dem; dem.loadFromImage(params.rawImageData); delete this.loading[source][uid]; this.loaded[source] = this.loaded[source] || {}; this.loaded[source][uid] = dem; callback(null, dem); }; RasterDEMTileWorkerSource.prototype.removeTile = function removeTile (params ) { var loaded = this.loaded[params.source], uid = params.uid; if (loaded && loaded[uid]) { delete loaded[uid]; } }; module.exports = RasterDEMTileWorkerSource; },{"../data/dem_data":57}],113:[function(require,module,exports){ 'use strict';// var util = require('../util/util'); var ajax = require('../util/ajax'); var Evented = require('../util/evented'); var loadTileJSON = require('./load_tilejson'); var normalizeURL = require('../util/mapbox').normalizeTileURL; var TileBounds = require('./tile_bounds'); var Texture = require('../render/texture'); var RasterTileSource = (function (Evented) { function RasterTileSource(id , options , dispatcher , eventedParent ) { Evented.call(this); this.id = id; this.dispatcher = dispatcher; this.setEventedParent(eventedParent); this.type = 'raster'; this.minzoom = 0; this.maxzoom = 22; this.roundZoom = true; this.scheme = 'xyz'; this.tileSize = 512; this._loaded = false; this._options = util.extend({}, options); util.extend(this, util.pick(options, ['url', 'scheme', 'tileSize'])); } if ( Evented ) RasterTileSource.__proto__ = Evented; RasterTileSource.prototype = Object.create( Evented && Evented.prototype ); RasterTileSource.prototype.constructor = RasterTileSource; RasterTileSource.prototype.load = function load () { var this$1 = this; this.fire('dataloading', {dataType: 'source'}); loadTileJSON(this._options, this.map._transformRequest, function (err, tileJSON) { if (err) { this$1.fire('error', err); } else if (tileJSON) { util.extend(this$1, tileJSON); if (tileJSON.bounds) { this$1.tileBounds = new TileBounds(tileJSON.bounds, this$1.minzoom, this$1.maxzoom); } // `content` is included here to prevent a race condition where `Style#_updateSources` is called // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088 this$1.fire('data', {dataType: 'source', sourceDataType: 'metadata'}); this$1.fire('data', {dataType: 'source', sourceDataType: 'content'}); } }); }; RasterTileSource.prototype.onAdd = function onAdd (map ) { this.map = map; this.load(); }; RasterTileSource.prototype.serialize = function serialize () { return util.extend({}, this._options); }; RasterTileSource.prototype.hasTile = function hasTile (tileID ) { return !this.tileBounds || this.tileBounds.contains(tileID.canonical); }; RasterTileSource.prototype.loadTile = function loadTile (tile , callback ) { var this$1 = this; var url = normalizeURL(tile.tileID.canonical.url(this.tiles, this.scheme), this.url, this.tileSize); tile.request = ajax.getImage(this.map._transformRequest(url, ajax.ResourceType.Tile), function (err, img) { delete tile.request; if (tile.aborted) { tile.state = 'unloaded'; callback(null); } else if (err) { tile.state = 'errored'; callback(err); } else if (img) { if (this$1.map._refreshExpiredTiles) { tile.setExpiryData(img); } delete (img ).cacheControl; delete (img ).expires; var context = this$1.map.painter.context; var gl = context.gl; tile.texture = this$1.map.painter.getTileTexture(img.width); if (tile.texture) { tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, img); } else { tile.texture = new Texture(context, img, gl.RGBA); tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); if (context.extTextureFilterAnisotropic) { gl.texParameterf(gl.TEXTURE_2D, context.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, context.extTextureFilterAnisotropicMax); } } gl.generateMipmap(gl.TEXTURE_2D); tile.state = 'loaded'; callback(null); } }); }; RasterTileSource.prototype.abortTile = function abortTile (tile , callback ) { if (tile.request) { tile.request.abort(); delete tile.request; } callback(); }; RasterTileSource.prototype.unloadTile = function unloadTile (tile , callback ) { if (tile.texture) { this.map.painter.saveTileTexture(tile.texture); } callback(); }; RasterTileSource.prototype.hasTransition = function hasTransition () { return false; }; return RasterTileSource; }(Evented)); module.exports = RasterTileSource; },{"../render/texture":98,"../util/ajax":256,"../util/evented":265,"../util/mapbox":272,"../util/util":280,"./load_tilejson":108,"./tile_bounds":118}],114:[function(require,module,exports){ 'use strict';// var ajax = require('../util/ajax'); var Evented = require('../util/evented'); var window = require('../util/window'); var pluginRequested = false; var pluginBlobURL = null; module.exports.evented = new Evented(); module.exports.registerForPluginAvailability = function( callback ) { if (pluginBlobURL) { callback({ pluginBlobURL: pluginBlobURL, errorCallback: module.exports.errorCallback}); } else { module.exports.evented.once('pluginAvailable', callback); } return callback; }; // Exposed so it can be stubbed out by tests module.exports.createBlobURL = function(response ) { return window.URL.createObjectURL(new window.Blob([response.data], {type: "text/javascript"})); }; // Only exposed for tests module.exports.clearRTLTextPlugin = function() { pluginRequested = false; pluginBlobURL = null; }; module.exports.setRTLTextPlugin = function(pluginURL , callback ) { if (pluginRequested) { throw new Error('setRTLTextPlugin cannot be called multiple times.'); } pluginRequested = true; module.exports.errorCallback = callback; ajax.getArrayBuffer({ url: pluginURL }, function (err, response) { if (err) { callback(err); } else if (response) { pluginBlobURL = module.exports.createBlobURL(response); module.exports.evented.fire('pluginAvailable', { pluginBlobURL: pluginBlobURL, errorCallback: callback }); } }); }; module.exports.applyArabicShaping = (null ); module.exports.processBidirectionalText = (null ); },{"../util/ajax":256,"../util/evented":265,"../util/window":259}],115:[function(require,module,exports){ 'use strict';// var util = require('../util/util'); /** * The `Source` interface must be implemented by each source type, including "core" types (`vector`, `raster`, * `video`, etc.) and all custom, third-party types. * * @class Source * @private * * @param {string} id The id for the source. Must not be used by any existing source. * @param {Object} options Source options, specific to the source type (except for `options.type`, which is always * required). * @param {string} options.type The source type, matching the value of `name` used in {@link Style#addSourceType}. * @param {Dispatcher} dispatcher A {@link Dispatcher} instance, which can be used to send messages to the workers. * * @fires data with `{dataType: 'source', sourceDataType: 'metadata'}` to indicate that any necessary metadata * has been loaded so that it's okay to call `loadTile`; and with `{dataType: 'source', sourceDataType: 'content'}` * to indicate that the source data has changed, so that any current caches should be flushed. * @property {string} id The id for the source. Must match the id passed to the constructor. * @property {number} minzoom * @property {number} maxzoom * @property {boolean} isTileClipped `false` if tiles can be drawn outside their boundaries, `true` if they cannot. * @property {boolean} reparseOverscaled `true` if tiles should be sent back to the worker for each overzoomed zoom * level, `false` if not. * @property {boolean} roundZoom `true` if zoom levels are rounded to the nearest integer in the source data, `false` * if they are floor-ed to the nearest integer. */ var sourceTypes = { 'vector': require('../source/vector_tile_source'), 'raster': require('../source/raster_tile_source'), 'raster-dem': require('../source/raster_dem_tile_source'), 'geojson': require('../source/geojson_source'), 'video': require('../source/video_source'), 'image': require('../source/image_source'), 'canvas': require('../source/canvas_source') }; /* * Creates a tiled data source instance given an options object. * * @param id * @param {Object} source A source definition object compliant with * [`mapbox-gl-style-spec`](https://www.mapbox.com/mapbox-gl-style-spec/#sources) or, for a third-party source type, * with that type's requirements. * @param {Dispatcher} dispatcher * @returns {Source} */ exports.create = function(id , specification , dispatcher , eventedParent ) { var source = new sourceTypes[specification.type](id, (specification ), dispatcher, eventedParent); if (source.id !== id) { throw new Error(("Expected Source id to be " + id + " instead of " + (source.id))); } util.bindAll(['load', 'abort', 'unload', 'serialize', 'prepare'], source); return source; }; exports.getType = function (name ) { return sourceTypes[name]; }; exports.setType = function (name , type ) { sourceTypes[name] = type; }; },{"../source/canvas_source":103,"../source/geojson_source":104,"../source/image_source":107,"../source/raster_dem_tile_source":111,"../source/raster_tile_source":113,"../source/vector_tile_source":120,"../source/video_source":122,"../util/util":280}],116:[function(require,module,exports){ 'use strict';// var createSource = require('./source').create; var Tile = require('./tile'); var Evented = require('../util/evented'); var Cache = require('../util/lru_cache'); var Coordinate = require('../geo/coordinate'); var util = require('../util/util'); var EXTENT = require('../data/extent'); var Context = require('../gl/context'); var Point = require('@mapbox/point-geometry'); var browser = require('../util/browser'); var ref = require('./tile_id'); var OverscaledTileID = ref.OverscaledTileID; var assert = require('assert'); /** * `SourceCache` is responsible for * * - creating an instance of `Source` * - forwarding events from `Source` * - caching tiles loaded from an instance of `Source` * - loading the tiles needed to render a given viewport * - unloading the cached tiles not needed to render a given viewport * * @private */ var SourceCache = (function (Evented) { function SourceCache(id , options , dispatcher ) { var this$1 = this; Evented.call(this); this.id = id; this.dispatcher = dispatcher; this.on('data', function (e) { // this._sourceLoaded signifies that the TileJSON is loaded if applicable. // if the source type does not come with a TileJSON, the flag signifies the // source data has loaded (i.e geojson has been tiled on the worker and is ready) if (e.dataType === 'source' && e.sourceDataType === 'metadata') { this$1._sourceLoaded = true; } // for sources with mutable data, this event fires when the underlying data // to a source is changed. (i.e. GeoJSONSource#setData and ImageSource#serCoordinates) if (this$1._sourceLoaded && !this$1._paused && e.dataType === "source" && e.sourceDataType === 'content') { this$1.reload(); if (this$1.transform) { this$1.update(this$1.transform); } } }); this.on('error', function () { this$1._sourceErrored = true; }); this._source = createSource(id, options, dispatcher, this); this._tiles = {}; this._cache = new Cache(0, this._unloadTile.bind(this)); this._timers = {}; this._cacheTimers = {}; this._maxTileCacheSize = null; this._isIdRenderable = this._isIdRenderable.bind(this); this._coveredTiles = {}; } if ( Evented ) SourceCache.__proto__ = Evented; SourceCache.prototype = Object.create( Evented && Evented.prototype ); SourceCache.prototype.constructor = SourceCache; SourceCache.prototype.onAdd = function onAdd (map ) { this.map = map; this._maxTileCacheSize = map ? map._maxTileCacheSize : null; if (this._source && this._source.onAdd) { this._source.onAdd(map); } }; SourceCache.prototype.onRemove = function onRemove (map ) { if (this._source && this._source.onRemove) { this._source.onRemove(map); } }; /** * Return true if no tile data is pending, tiles will not change unless * an additional API call is received. */ SourceCache.prototype.loaded = function loaded () { var this$1 = this; if (this._sourceErrored) { return true; } if (!this._sourceLoaded) { return false; } for (var t in this$1._tiles) { var tile = this$1._tiles[t]; if (tile.state !== 'loaded' && tile.state !== 'errored') { return false; } } return true; }; SourceCache.prototype.getSource = function getSource () { return this._source; }; SourceCache.prototype.pause = function pause () { this._paused = true; }; SourceCache.prototype.resume = function resume () { if (!this._paused) { return; } var shouldReload = this._shouldReloadOnResume; this._paused = false; this._shouldReloadOnResume = false; if (shouldReload) { this.reload(); } if (this.transform) { this.update(this.transform); } }; SourceCache.prototype._loadTile = function _loadTile (tile , callback ) { return this._source.loadTile(tile, callback); }; SourceCache.prototype._unloadTile = function _unloadTile (tile ) { if (this._source.unloadTile) { return this._source.unloadTile(tile, function () {}); } }; SourceCache.prototype._abortTile = function _abortTile (tile ) { if (this._source.abortTile) { return this._source.abortTile(tile, function () {}); } }; SourceCache.prototype.serialize = function serialize () { return this._source.serialize(); }; SourceCache.prototype.prepare = function prepare (context ) { var this$1 = this; if (this._source.prepare) { this._source.prepare(); } for (var i in this$1._tiles) { this$1._tiles[i].upload(context); } }; /** * Return all tile ids ordered with z-order, and cast to numbers */ SourceCache.prototype.getIds = function getIds () { var this$1 = this; var compareKeyZoom = function (a_, b_) { var a = this$1._tiles[a_].tileID; var b = this$1._tiles[b_].tileID; var rotatedA = (new Point(a.canonical.x, a.canonical.y)).rotate(this$1.transform.angle); var rotatedB = (new Point(b.canonical.x, b.canonical.y)).rotate(this$1.transform.angle); return a.overscaledZ - b.overscaledZ || rotatedB.y - rotatedA.y || rotatedB.x - rotatedA.x; }; return Object.keys(this._tiles).map(Number).sort(compareKeyZoom); }; SourceCache.prototype.getRenderableIds = function getRenderableIds () { return this.getIds().filter(this._isIdRenderable); }; SourceCache.prototype.hasRenderableParent = function hasRenderableParent (tileID ) { var parentTile = this.findLoadedParent(tileID, 0, {}); if (parentTile) { return this._isIdRenderable(parentTile.tileID.key); } return false; }; SourceCache.prototype._isIdRenderable = function _isIdRenderable (id ) { return this._tiles[id] && this._tiles[id].hasData() && !this._coveredTiles[id]; }; SourceCache.prototype.reload = function reload () { var this$1 = this; if (this._paused) { this._shouldReloadOnResume = true; return; } this._resetCache(); for (var i in this$1._tiles) { this$1._reloadTile(i, 'reloading'); } }; SourceCache.prototype._reloadTile = function _reloadTile (id , state ) { var tile = this._tiles[id]; // this potentially does not address all underlying // issues https://github.com/mapbox/mapbox-gl-js/issues/4252 // - hard to tell without repro steps if (!tile) { return; } // The difference between "loading" tiles and "reloading" or "expired" // tiles is that "reloading"/"expired" tiles are "renderable". // Therefore, a "loading" tile cannot become a "reloading" tile without // first becoming a "loaded" tile. if (tile.state !== 'loading') { tile.state = state; } this._loadTile(tile, this._tileLoaded.bind(this, tile, id, state)); }; SourceCache.prototype._tileLoaded = function _tileLoaded (tile , id , previousState , err ) { if (err) { tile.state = 'errored'; if (err.status !== 404) { this._source.fire('error', {tile: tile, error: err}); } // continue to try loading parent/children tiles if a tile doesn't exist (404) else { this.update(this.transform); } return; } tile.timeAdded = browser.now(); if (previousState === 'expired') { tile.refreshedUponExpiration = true; } this._setTileReloadTimer(id, tile); if (this.getSource().type === 'raster-dem' && tile.dem) { this._backfillDEM(tile); } this._source.fire('data', {dataType: 'source', tile: tile, coord: tile.tileID}); // HACK this is necessary to fix https://github.com/mapbox/mapbox-gl-js/issues/2986 if (this.map) { this.map.painter.tileExtentVAO.vao = null; } }; /** * For raster terrain source, backfill DEM to eliminate visible tile boundaries * @private */ SourceCache.prototype._backfillDEM = function _backfillDEM (tile ) { var this$1 = this; var renderables = this.getRenderableIds(); for (var i = 0; i < renderables.length; i++) { var borderId = renderables[i]; if (tile.neighboringTiles && tile.neighboringTiles[borderId]) { var borderTile = this$1.getTileByID(borderId); fillBorder(tile, borderTile); fillBorder(borderTile, tile); } } function fillBorder(tile, borderTile) { tile.needsHillshadePrepare = true; var dx = borderTile.tileID.canonical.x - tile.tileID.canonical.x; var dy = borderTile.tileID.canonical.y - tile.tileID.canonical.y; var dim = Math.pow(2, tile.tileID.canonical.z); var borderId = borderTile.tileID.key; if (dx === 0 && dy === 0) { return; } if (Math.abs(dy) > 1) { return; } if (Math.abs(dx) > 1) { // Adjust the delta coordinate for world wraparound. if (Math.abs(dx + dim) === 1) { dx += dim; } else if (Math.abs(dx - dim) === 1) { dx -= dim; } } if (!borderTile.dem || !tile.dem) { return; } tile.dem.backfillBorder(borderTile.dem, dx, dy); if (tile.neighboringTiles && tile.neighboringTiles[borderId]) { tile.neighboringTiles[borderId].backfilled = true; } } }; /** * Get a specific tile by TileID */ SourceCache.prototype.getTile = function getTile (tileID ) { return this.getTileByID(tileID.key); }; /** * Get a specific tile by id */ SourceCache.prototype.getTileByID = function getTileByID (id ) { return this._tiles[id]; }; /** * get the zoom level adjusted for the difference in map and source tilesizes */ SourceCache.prototype.getZoom = function getZoom (transform ) { return transform.zoom + transform.scaleZoom(transform.tileSize / this._source.tileSize); }; /** * Recursively find children of the given tile (up to maxCoveringZoom) that are already loaded; * adds found tiles to retain object; returns true if any child is found. */ SourceCache.prototype._findLoadedChildren = function _findLoadedChildren (tileID , maxCoveringZoom , retain ) { var this$1 = this; var found = false; for (var id in this$1._tiles) { var tile = this$1._tiles[id]; // only consider renderable tiles on higher zoom levels (up to maxCoveringZoom) if (retain[id] || !tile.hasData() || tile.tileID.overscaledZ <= tileID.overscaledZ || tile.tileID.overscaledZ > maxCoveringZoom) { continue; } // disregard tiles that are not descendants of the given tile coordinate var z2 = Math.pow(2, tile.tileID.canonical.z - tileID.canonical.z); if (Math.floor(tile.tileID.canonical.x / z2) !== tileID.canonical.x || Math.floor(tile.tileID.canonical.y / z2) !== tileID.canonical.y) { continue; } // found loaded child retain[id] = tile.tileID; found = true; // loop through parents; retain the topmost loaded one if found while (tile && tile.tileID.overscaledZ - 1 > tileID.overscaledZ) { var parent = tile.tileID.scaledTo(tile.tileID.overscaledZ - 1); if (!parent) { break; } tile = this$1._tiles[parent.key]; if (tile && tile.hasData()) { delete retain[id]; retain[parent.key] = parent; } } } return found; }; /** * Find a loaded parent of the given tile (up to minCoveringZoom); * adds the found tile to retain object and returns the tile if found */ SourceCache.prototype.findLoadedParent = function findLoadedParent (tileID , minCoveringZoom , retain ) { var this$1 = this; for (var z = tileID.overscaledZ - 1; z >= minCoveringZoom; z--) { var parent = tileID.scaledTo(z); if (!parent) { return; } var id = String(parent.key); var tile = this$1._tiles[id]; if (tile && tile.hasData()) { retain[id] = parent; return tile; } if (this$1._cache.has(id)) { retain[id] = parent; return this$1._cache.get(id); } } }; /** * Resizes the tile cache based on the current viewport's size * or the maxTileCacheSize option passed during map creation * * Larger viewports use more tiles and need larger caches. Larger viewports * are more likely to be found on devices with more memory and on pages where * the map is more important. */ SourceCache.prototype.updateCacheSize = function updateCacheSize (transform ) { var widthInTiles = Math.ceil(transform.width / this._source.tileSize) + 1; var heightInTiles = Math.ceil(transform.height / this._source.tileSize) + 1; var approxTilesInView = widthInTiles * heightInTiles; var commonZoomRange = 5; var viewDependentMaxSize = Math.floor(approxTilesInView * commonZoomRange); var maxSize = typeof this._maxTileCacheSize === 'number' ? Math.min(this._maxTileCacheSize, viewDependentMaxSize) : viewDependentMaxSize; this._cache.setMaxSize(maxSize); }; /** * Removes tiles that are outside the viewport and adds new tiles that * are inside the viewport. */ SourceCache.prototype.update = function update (transform ) { var this$1 = this; this.transform = transform; if (!this._sourceLoaded || this._paused) { return; } this.updateCacheSize(transform); // Covered is a list of retained tiles who's areas are fully covered by other, // better, retained tiles. They are not drawn separately. this._coveredTiles = {}; var idealTileIDs; if (!this.used) { idealTileIDs = []; } else if (this._source.tileID) { idealTileIDs = transform.getVisibleUnwrappedCoordinates((this._source.tileID )) .map(function (unwrapped) { return new OverscaledTileID(unwrapped.canonical.z, unwrapped.wrap, unwrapped.canonical.z, unwrapped.canonical.x, unwrapped.canonical.y); }); } else { idealTileIDs = transform.coveringTiles({ tileSize: this._source.tileSize, minzoom: this._source.minzoom, maxzoom: this._source.maxzoom, roundZoom: this._source.roundZoom, reparseOverscaled: this._source.reparseOverscaled }); if (this._source.hasTile) { idealTileIDs = idealTileIDs.filter(function (coord) { return (this$1._source.hasTile )(coord); }); } } // Determine the overzooming/underzooming amounts. var zoom = (this._source.roundZoom ? Math.round : Math.floor)(this.getZoom(transform)); var minCoveringZoom = Math.max(zoom - SourceCache.maxOverzooming, this._source.minzoom); var maxCoveringZoom = Math.max(zoom + SourceCache.maxUnderzooming, this._source.minzoom); // Retain is a list of tiles that we shouldn't delete, even if they are not // the most ideal tile for the current viewport. This may include tiles like // parent or child tiles that are *already* loaded. var retain = this._updateRetainedTiles(idealTileIDs, zoom); var parentsForFading = {}; if (isRasterType(this._source.type)) { var ids = Object.keys(retain); for (var k = 0; k < ids.length; k++) { var id = ids[k]; var tileID = retain[id]; assert(tileID.key === +id); var tile = this$1._tiles[id]; if (!tile) { continue; } // If the drawRasterTile has never seen this tile, then // tile.fadeEndTime may be unset. In that case, or if // fadeEndTime is in the future, then this tile is still // fading in. Find tiles to cross-fade with it. if (typeof tile.fadeEndTime === 'undefined' || tile.fadeEndTime >= browser.now()) { if (this$1._findLoadedChildren(tileID, maxCoveringZoom, retain)) { retain[id] = tileID; } var parentTile = this$1.findLoadedParent(tileID, minCoveringZoom, parentsForFading); if (parentTile) { this$1._addTile(parentTile.tileID); } } } } var fadedParent; for (fadedParent in parentsForFading) { if (!retain[fadedParent]) { // If a tile is only needed for fading, mark it as covered so that it isn't rendered on it's own. this$1._coveredTiles[fadedParent] = true; } } for (fadedParent in parentsForFading) { retain[fadedParent] = parentsForFading[fadedParent]; } // Remove the tiles we don't need anymore. var remove = util.keysDifference(this._tiles, retain); for (var i = 0; i < remove.length; i++) { this$1._removeTile(remove[i]); } }; SourceCache.prototype._updateRetainedTiles = function _updateRetainedTiles (idealTileIDs , zoom ) { var this$1 = this; var retain = {}; var checked = {}; var minCoveringZoom = Math.max(zoom - SourceCache.maxOverzooming, this._source.minzoom); var maxCoveringZoom = Math.max(zoom + SourceCache.maxUnderzooming, this._source.minzoom); for (var i = 0; i < idealTileIDs.length; i++) { var tileID = idealTileIDs[i]; var tile = this$1._addTile(tileID); var parentWasRequested = false; if (tile.hasData()) { retain[tileID.key] = tileID; } else { // The tile we require is not yet loaded or does not exist. // We are now attempting to load child and parent tiles. // As we descend up and down the tile pyramid of the ideal tile, we check whether the parent // tile has been previously requested (and errored in this case due to the previous conditional) // in order to determine if we need to request its parent. parentWasRequested = tile.wasRequested(); // The tile isn't loaded yet, but retain it anyway because it's an ideal tile. retain[tileID.key] = tileID; var covered = true; var overscaledZ = zoom + 1; if (overscaledZ > this$1._source.maxzoom) { // We're looking for an overzoomed child tile. var childCoord = tileID.children(this$1._source.maxzoom)[0]; var childTile = this$1.getTile(childCoord); if (!!childTile && childTile.hasData()) { retain[childCoord.key] = childCoord; } else { covered = false; } } else { this$1._findLoadedChildren(tileID, maxCoveringZoom, retain); // check if all 4 immediate children are loaded (i.e. the missing ideal tile is covered) var children = tileID.children(this$1._source.maxzoom); for (var j = 0; j < children.length; j++) { if (!retain[children[j].key]) { covered = false; break; } } } if (!covered) { // We couldn't find child tiles that entirely cover the ideal tile. for (var overscaledZ$1 = tileID.overscaledZ - 1; overscaledZ$1 >= minCoveringZoom; --overscaledZ$1) { var parentId = tileID.scaledTo(overscaledZ$1); if (checked[parentId.key]) { // Break parent tile ascent, this route has been previously checked by another child. break; } else { checked[parentId.key] = true; } tile = this$1.getTile(parentId); if (!tile && parentWasRequested) { tile = this$1._addTile(parentId); } if (tile) { retain[parentId.key] = parentId; // Save the current values, since they're the parent of the next iteration // of the parent tile ascent loop. parentWasRequested = tile.wasRequested(); if (tile.hasData()) { break; } } } } } } return retain; }; /** * Add a tile, given its coordinate, to the pyramid. * @private */ SourceCache.prototype._addTile = function _addTile (tileID ) { var tile = this._tiles[tileID.key]; if (tile) { return tile; } tile = this._cache.getAndRemove((tileID.key )); if (tile) { if (this._cacheTimers[tileID.key]) { clearTimeout(this._cacheTimers[tileID.key]); delete this._cacheTimers[tileID.key]; this._setTileReloadTimer(tileID.key, tile); } } var cached = Boolean(tile); if (!cached) { tile = new Tile(tileID, this._source.tileSize * tileID.overscaleFactor()); this._loadTile(tile, this._tileLoaded.bind(this, tile, tileID.key, tile.state)); } // Impossible, but silence flow. if (!tile) { return (null ); } tile.uses++; this._tiles[tileID.key] = tile; if (!cached) { this._source.fire('dataloading', {tile: tile, coord: tile.tileID, dataType: 'source'}); } return tile; }; SourceCache.prototype._setTileReloadTimer = function _setTileReloadTimer (id , tile ) { var this$1 = this; if (id in this._timers) { clearTimeout(this._timers[id]); delete this._timers[id]; } var expiryTimeout = tile.getExpiryTimeout(); if (expiryTimeout) { this._timers[id] = setTimeout(function () { this$1._reloadTile(id, 'expired'); delete this$1._timers[id]; }, expiryTimeout); } }; SourceCache.prototype._setCacheInvalidationTimer = function _setCacheInvalidationTimer (id , tile ) { var this$1 = this; if (id in this._cacheTimers) { clearTimeout(this._cacheTimers[id]); delete this._cacheTimers[id]; } var expiryTimeout = tile.getExpiryTimeout(); if (expiryTimeout) { this._cacheTimers[id] = setTimeout(function () { this$1._cache.remove((id )); delete this$1._cacheTimers[id]; }, expiryTimeout); } }; /** * Remove a tile, given its id, from the pyramid * @private */ SourceCache.prototype._removeTile = function _removeTile (id ) { var tile = this._tiles[id]; if (!tile) { return; } tile.uses--; delete this._tiles[id]; if (this._timers[id]) { clearTimeout(this._timers[id]); delete this._timers[id]; } if (tile.uses > 0) { return; } if (tile.hasData()) { tile.tileID = tile.tileID.wrapped(); var wrappedId = tile.tileID.key; this._cache.add((wrappedId ), tile); this._setCacheInvalidationTimer(wrappedId, tile); } else { tile.aborted = true; this._abortTile(tile); this._unloadTile(tile); } }; /** * Remove all tiles from this pyramid */ SourceCache.prototype.clearTiles = function clearTiles () { var this$1 = this; this._shouldReloadOnResume = false; this._paused = false; for (var id in this$1._tiles) { this$1._removeTile(id); } this._resetCache(); }; SourceCache.prototype._resetCache = function _resetCache () { var this$1 = this; for (var id in this$1._cacheTimers) { clearTimeout(this$1._cacheTimers[id]); } this._cacheTimers = {}; this._cache.reset(); }; /** * Search through our current tiles and attempt to find the tiles that * cover the given bounds. * @param queryGeometry coordinates of the corners of bounding rectangle * @returns {Array} result items have {tile, minX, maxX, minY, maxY}, where min/max bounding values are the given bounds transformed in into the coordinate space of this tile. */ SourceCache.prototype.tilesIn = function tilesIn (queryGeometry ) { var this$1 = this; var tileResults = []; var ids = this.getIds(); var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; var z = queryGeometry[0].zoom; for (var k = 0; k < queryGeometry.length; k++) { var p = queryGeometry[k]; minX = Math.min(minX, p.column); minY = Math.min(minY, p.row); maxX = Math.max(maxX, p.column); maxY = Math.max(maxY, p.row); } for (var i = 0; i < ids.length; i++) { var tile = this$1._tiles[ids[i]]; var tileID = tile.tileID; var tileSpaceBounds = [ coordinateToTilePoint(tileID, new Coordinate(minX, minY, z)), coordinateToTilePoint(tileID, new Coordinate(maxX, maxY, z)) ]; if (tileSpaceBounds[0].x < EXTENT && tileSpaceBounds[0].y < EXTENT && tileSpaceBounds[1].x >= 0 && tileSpaceBounds[1].y >= 0) { var tileSpaceQueryGeometry = []; for (var j = 0; j < queryGeometry.length; j++) { tileSpaceQueryGeometry.push(coordinateToTilePoint(tileID, queryGeometry[j])); } tileResults.push({ tile: tile, tileID: tileID, queryGeometry: [tileSpaceQueryGeometry], scale: Math.pow(2, this$1.transform.zoom - tile.tileID.overscaledZ) }); } } return tileResults; }; SourceCache.prototype.getVisibleCoordinates = function getVisibleCoordinates () { var this$1 = this; var coords = this.getRenderableIds().map(function (id) { return this$1._tiles[id].tileID; }); for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; coord.posMatrix = this$1.transform.calculatePosMatrix(coord.toUnwrapped()); } return coords; }; SourceCache.prototype.hasTransition = function hasTransition () { var this$1 = this; if (this._source.hasTransition()) { return true; } if (isRasterType(this._source.type)) { for (var id in this$1._tiles) { var tile = this$1._tiles[id]; if (tile.fadeEndTime !== undefined && tile.fadeEndTime >= browser.now()) { return true; } } } return false; }; return SourceCache; }(Evented)); SourceCache.maxOverzooming = 10; SourceCache.maxUnderzooming = 3; /** * Convert a coordinate to a point in a tile's coordinate space. * @private */ function coordinateToTilePoint(tileID , coord ) { var zoomedCoord = coord.zoomTo(tileID.canonical.z); return new Point( (zoomedCoord.column - (tileID.canonical.x + tileID.wrap * Math.pow(2, tileID.canonical.z))) * EXTENT, (zoomedCoord.row - tileID.canonical.y) * EXTENT ); } function isRasterType(type) { return type === 'raster' || type === 'image' || type === 'video'; } module.exports = SourceCache; },{"../data/extent":58,"../geo/coordinate":66,"../gl/context":71,"../util/browser":257,"../util/evented":265,"../util/lru_cache":271,"../util/util":280,"./source":115,"./tile":117,"./tile_id":119,"@mapbox/point-geometry":4,"assert":13}],117:[function(require,module,exports){ 'use strict';// var util = require('../util/util'); var deserializeBucket = require('../data/bucket').deserialize; var FeatureIndex = require('../data/feature_index'); var vt = require('@mapbox/vector-tile'); var Protobuf = require('pbf'); var GeoJSONFeature = require('../util/vectortile_to_geojson'); var featureFilter = require('../style-spec/feature_filter'); var CollisionIndex = require('../symbol/collision_index'); var SymbolBucket = require('../data/bucket/symbol_bucket'); var ref = require('../data/array_types'); var RasterBoundsArray = ref.RasterBoundsArray; var CollisionBoxArray = ref.CollisionBoxArray; var rasterBoundsAttributes = require('../data/raster_bounds_attributes'); var EXTENT = require('../data/extent'); var Point = require('@mapbox/point-geometry'); var Texture = require('../render/texture'); var ref$1 = require('../data/segment'); var SegmentVector = ref$1.SegmentVector; var ref$2 = require('../data/index_array_type'); var TriangleIndexArray = ref$2.TriangleIndexArray; var browser = require('../util/browser'); var CLOCK_SKEW_RETRY_TIMEOUT = 30000; /* Tile data was previously loaded, but has expired per its * HTTP headers and is in the process of refreshing. */ /** * A tile object is the combination of a Coordinate, which defines * its place, as well as a unique ID and data tracking for its content * * @private */ var Tile = function Tile(tileID , size ) { this.tileID = tileID; this.uid = util.uniqueId(); this.uses = 0; this.tileSize = size; this.buckets = {}; this.expirationTime = null; // Counts the number of times a response was already expired when // received. We're using this to add a delay when making a new request // so we don't have to keep retrying immediately in case of a server // serving expired tiles. this.expiredRequestCount = 0; this.state = 'loading'; }; Tile.prototype.registerFadeDuration = function registerFadeDuration (duration ) { var fadeEndTime = duration + this.timeAdded; if (fadeEndTime < browser.now()) { return; } if (this.fadeEndTime && fadeEndTime < this.fadeEndTime) { return; } this.fadeEndTime = fadeEndTime; }; Tile.prototype.wasRequested = function wasRequested () { return this.state === 'errored' || this.state === 'loaded' || this.state === 'reloading'; }; /** * Given a data object with a 'buffers' property, load it into * this tile's elementGroups and buffers properties and set loaded * to true. If the data is null, like in the case of an empty * GeoJSON tile, no-op but still set loaded to true. * @param {Object} data * @param painter * @returns {undefined} * @private */ Tile.prototype.loadVectorData = function loadVectorData (data , painter , justReloaded ) { var this$1 = this; if (this.hasData()) { this.unloadVectorData(); } this.state = 'loaded'; // empty GeoJSON tile if (!data) { this.collisionBoxArray = new CollisionBoxArray(); return; } if (data.rawTileData) { // Only vector tiles have rawTileData this.rawTileData = data.rawTileData; } this.collisionBoxArray = data.collisionBoxArray; this.featureIndex = data.featureIndex; this.featureIndex.rawTileData = this.rawTileData; this.buckets = deserializeBucket(data.buckets, painter.style); if (justReloaded) { for (var id in this$1.buckets) { var bucket = this$1.buckets[id]; if (bucket instanceof SymbolBucket) { bucket.justReloaded = true; } } } if (data.iconAtlasImage) { this.iconAtlasImage = data.iconAtlasImage; } if (data.glyphAtlasImage) { this.glyphAtlasImage = data.glyphAtlasImage; } }; /** * Release any data or WebGL resources referenced by this tile. * @returns {undefined} * @private */ Tile.prototype.unloadVectorData = function unloadVectorData () { var this$1 = this; for (var id in this$1.buckets) { this$1.buckets[id].destroy(); } this.buckets = {}; if (this.iconAtlasTexture) { this.iconAtlasTexture.destroy(); } if (this.glyphAtlasTexture) { this.glyphAtlasTexture.destroy(); } this.collisionBoxArray = null; this.featureIndex = null; this.state = 'unloaded'; }; Tile.prototype.unloadDEMData = function unloadDEMData () { this.dem = null; this.neighboringTiles = null; this.state = 'unloaded'; }; Tile.prototype.getBucket = function getBucket (layer ) { return this.buckets[layer.id]; }; Tile.prototype.upload = function upload (context ) { var this$1 = this; for (var id in this$1.buckets) { var bucket = this$1.buckets[id]; if (!bucket.uploaded) { bucket.upload(context); bucket.uploaded = true; } } var gl = context.gl; if (this.iconAtlasImage) { this.iconAtlasTexture = new Texture(context, this.iconAtlasImage, gl.RGBA); this.iconAtlasImage = null; } if (this.glyphAtlasImage) { this.glyphAtlasTexture = new Texture(context, this.glyphAtlasImage, gl.ALPHA); this.glyphAtlasImage = null; } }; Tile.prototype.queryRenderedFeatures = function queryRenderedFeatures (layers , queryGeometry , scale , params , bearing , sourceID , collisionIndex ) { var this$1 = this; if (!this.featureIndex || !this.collisionBoxArray) { return {}; } // Determine the additional radius needed factoring in property functions var additionalRadius = 0; var bucketInstanceIds = {}; for (var id in layers) { var bucket = this$1.getBucket(layers[id]); if (bucket) { additionalRadius = Math.max(additionalRadius, layers[id].queryRadius(bucket)); // Add the bucket instance's id to the set of current ids. // The query will only include results from current buckets. if (bucket instanceof SymbolBucket && bucket.bucketInstanceId !== undefined) { bucketInstanceIds[bucket.bucketInstanceId] = true; } } } return this.featureIndex.query({ queryGeometry: queryGeometry, scale: scale, tileSize: this.tileSize, bearing: bearing, params: params, additionalRadius: additionalRadius, collisionBoxArray: this.collisionBoxArray, sourceID: sourceID, collisionIndex: collisionIndex, bucketInstanceIds: bucketInstanceIds }, layers); }; Tile.prototype.querySourceFeatures = function querySourceFeatures (result , params ) { var this$1 = this; if (!this.rawTileData) { return; } if (!this.vtLayers) { this.vtLayers = new vt.VectorTile(new Protobuf(this.rawTileData)).layers; } var sourceLayer = params ? params.sourceLayer : ''; var layer = this.vtLayers._geojsonTileLayer || this.vtLayers[sourceLayer]; if (!layer) { return; } var filter = featureFilter(params && params.filter); var coord = { z: this.tileID.overscaledZ, x: this.tileID.canonical.x, y: this.tileID.canonical.y }; for (var i = 0; i < layer.length; i++) { var feature = layer.feature(i); if (filter({zoom: this$1.tileID.overscaledZ}, feature)) { var geojsonFeature = new GeoJSONFeature(feature, coord.z, coord.x, coord.y); (geojsonFeature ).tile = coord; result.push(geojsonFeature); } } }; Tile.prototype.clearMask = function clearMask () { if (this.segments) { this.segments.destroy(); delete this.segments; } if (this.maskedBoundsBuffer) { this.maskedBoundsBuffer.destroy(); delete this.maskedBoundsBuffer; } if (this.maskedIndexBuffer) { this.maskedIndexBuffer.destroy(); delete this.maskedIndexBuffer; } }; Tile.prototype.setMask = function setMask (mask , context ) { var this$1 = this; // don't redo buffer work if the mask is the same; if (util.deepEqual(this.mask, mask)) { return; } this.mask = mask; this.clearMask(); // We want to render the full tile, and keeping the segments/vertices/indices empty means // using the global shared buffers for covering the entire tile. if (util.deepEqual(mask, {'0': true})) { return; } var maskedBoundsArray = new RasterBoundsArray(); var indexArray = new TriangleIndexArray(); this.segments = new SegmentVector(); // Create a new segment so that we will upload (empty) buffers even when there is nothing to // draw for this tile. this.segments.prepareSegment(0, maskedBoundsArray, indexArray); var maskArray = Object.keys(mask); for (var i = 0; i < maskArray.length; i++) { var maskCoord = mask[maskArray[i]]; var vertexExtent = EXTENT >> maskCoord.z; var tlVertex = new Point(maskCoord.x * vertexExtent, maskCoord.y * vertexExtent); var brVertex = new Point(tlVertex.x + vertexExtent, tlVertex.y + vertexExtent); // not sure why flow is complaining here because it doesn't complain at L401 var segment = (this$1.segments ).prepareSegment(4, maskedBoundsArray, indexArray); maskedBoundsArray.emplaceBack(tlVertex.x, tlVertex.y, tlVertex.x, tlVertex.y); maskedBoundsArray.emplaceBack(brVertex.x, tlVertex.y, brVertex.x, tlVertex.y); maskedBoundsArray.emplaceBack(tlVertex.x, brVertex.y, tlVertex.x, brVertex.y); maskedBoundsArray.emplaceBack(brVertex.x, brVertex.y, brVertex.x, brVertex.y); var offset = segment.vertexLength; // 0, 1, 2 // 1, 2, 3 indexArray.emplaceBack(offset, offset + 1, offset + 2); indexArray.emplaceBack(offset + 1, offset + 2, offset + 3); segment.vertexLength += 4; segment.primitiveLength += 2; } this.maskedBoundsBuffer = context.createVertexBuffer(maskedBoundsArray, rasterBoundsAttributes.members); this.maskedIndexBuffer = context.createIndexBuffer(indexArray); }; Tile.prototype.hasData = function hasData () { return this.state === 'loaded' || this.state === 'reloading' || this.state === 'expired'; }; Tile.prototype.setExpiryData = function setExpiryData (data ) { var prior = this.expirationTime; if (data.cacheControl) { var parsedCC = util.parseCacheControl(data.cacheControl); if (parsedCC['max-age']) { this.expirationTime = Date.now() + parsedCC['max-age'] * 1000; } } else if (data.expires) { this.expirationTime = new Date(data.expires).getTime(); } if (this.expirationTime) { var now = Date.now(); var isExpired = false; if (this.expirationTime > now) { isExpired = false; } else if (!prior) { isExpired = true; } else if (this.expirationTime < prior) { // Expiring date is going backwards: // fall back to exponential backoff isExpired = true; } else { var delta = this.expirationTime - prior; if (!delta) { // Server is serving the same expired resource over and over: fall // back to exponential backoff. isExpired = true; } else { // Assume that either the client or the server clock is wrong and // try to interpolate a valid expiration date (from the client POV) // observing a minimum timeout. this.expirationTime = now + Math.max(delta, CLOCK_SKEW_RETRY_TIMEOUT); } } if (isExpired) { this.expiredRequestCount++; this.state = 'expired'; } else { this.expiredRequestCount = 0; } } }; Tile.prototype.getExpiryTimeout = function getExpiryTimeout () { if (this.expirationTime) { if (this.expiredRequestCount) { return 1000 * (1 << Math.min(this.expiredRequestCount - 1, 31)); } else { // Max value for `setTimeout` implementations is a 32 bit integer; cap this accordingly return Math.min(this.expirationTime - new Date().getTime(), Math.pow(2, 31) - 1); } } }; module.exports = Tile; },{"../data/array_types":44,"../data/bucket":45,"../data/bucket/symbol_bucket":56,"../data/extent":58,"../data/feature_index":59,"../data/index_array_type":60,"../data/raster_bounds_attributes":64,"../data/segment":65,"../render/texture":98,"../style-spec/feature_filter":153,"../symbol/collision_index":222,"../util/browser":257,"../util/util":280,"../util/vectortile_to_geojson":281,"@mapbox/point-geometry":4,"@mapbox/vector-tile":8,"pbf":31}],118:[function(require,module,exports){ 'use strict';// var LngLatBounds = require('../geo/lng_lat_bounds'); var clamp = require('../util/util').clamp; var TileBounds = function TileBounds(bounds , minzoom , maxzoom ) { this.bounds = LngLatBounds.convert(this.validateBounds(bounds)); this.minzoom = minzoom || 0; this.maxzoom = maxzoom || 24; }; TileBounds.prototype.validateBounds = function validateBounds (bounds ) { // make sure the bounds property contains valid longitude and latitudes if (!Array.isArray(bounds) || bounds.length !== 4) { return [-180, -90, 180, 90]; } return [Math.max(-180, bounds[0]), Math.max(-90, bounds[1]), Math.min(180, bounds[2]), Math.min(90, bounds[3])]; }; TileBounds.prototype.contains = function contains (tileID ) { var level = { minX: Math.floor(this.lngX(this.bounds.getWest(), tileID.z)), minY: Math.floor(this.latY(this.bounds.getNorth(), tileID.z)), maxX: Math.ceil(this.lngX(this.bounds.getEast(), tileID.z)), maxY: Math.ceil(this.latY(this.bounds.getSouth(), tileID.z)) }; var hit = tileID.x >= level.minX && tileID.x < level.maxX && tileID.y >= level.minY && tileID.y < level.maxY; return hit; }; TileBounds.prototype.lngX = function lngX (lng , zoom ) { return (lng + 180) * (Math.pow(2, zoom) / 360); }; TileBounds.prototype.latY = function latY (lat , zoom ) { var f = clamp(Math.sin(Math.PI / 180 * lat), -0.9999, 0.9999); var scale = Math.pow(2, zoom) / (2 * Math.PI); return Math.pow(2, zoom - 1) + 0.5 * Math.log((1 + f) / (1 - f)) * -scale; }; module.exports = TileBounds; },{"../geo/lng_lat_bounds":68,"../util/util":280}],119:[function(require,module,exports){ 'use strict';// var WhooTS = require('@mapbox/whoots-js'); var assert = require('assert'); var ref = require('../util/web_worker_transfer'); var register = ref.register; var Coordinate = require('../geo/coordinate'); var CanonicalTileID = function CanonicalTileID(z , x , y ) { assert(z >= 0 && z <= 25); assert(x >= 0 && x < Math.pow(2, z)); assert(y >= 0 && y < Math.pow(2, z)); this.z = z; this.x = x; this.y = y; this.key = calculateKey(0, z, x, y); }; CanonicalTileID.prototype.equals = function equals (id ) { return this.z === id.z && this.x === id.x && this.y === id.y; }; // given a list of urls, choose a url template and return a tile URL CanonicalTileID.prototype.url = function url (urls , scheme ) { var bbox = WhooTS.getTileBBox(this.x, this.y, this.z); var quadkey = getQuadkey(this.z, this.x, this.y); return urls[(this.x + this.y) % urls.length] .replace('{prefix}', (this.x % 16).toString(16) + (this.y % 16).toString(16)) .replace('{z}', String(this.z)) .replace('{x}', String(this.x)) .replace('{y}', String(scheme === 'tms' ? (Math.pow(2, this.z) - this.y - 1) : this.y)) .replace('{quadkey}', quadkey) .replace('{bbox-epsg-3857}', bbox); }; var UnwrappedTileID = function UnwrappedTileID(wrap , canonical ) { this.wrap = wrap; this.canonical = canonical; this.key = calculateKey(wrap, canonical.z, canonical.x, canonical.y); }; var OverscaledTileID = function OverscaledTileID(overscaledZ , wrap , z , x , y ) { assert(overscaledZ >= z); this.overscaledZ = overscaledZ; this.wrap = wrap; this.canonical = new CanonicalTileID(z, +x, +y); this.key = calculateKey(wrap, overscaledZ, x, y); }; OverscaledTileID.prototype.scaledTo = function scaledTo (targetZ ) { assert(targetZ <= this.overscaledZ); var zDifference = this.canonical.z - targetZ; if (targetZ > this.canonical.z) { return new OverscaledTileID(targetZ, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y); } else { return new OverscaledTileID(targetZ, this.wrap, targetZ, this.canonical.x >> zDifference, this.canonical.y >> zDifference); } }; OverscaledTileID.prototype.isChildOf = function isChildOf (parent ) { var zDifference = this.canonical.z - parent.canonical.z; // We're first testing for z == 0, to avoid a 32 bit shift, which is undefined. return parent.overscaledZ === 0 || ( parent.overscaledZ < this.overscaledZ && parent.canonical.x === (this.canonical.x >> zDifference) && parent.canonical.y === (this.canonical.y >> zDifference)); }; OverscaledTileID.prototype.children = function children (sourceMaxZoom ) { if (this.overscaledZ >= sourceMaxZoom) { // return a single tile coord representing a an overscaled tile return [new OverscaledTileID(this.overscaledZ + 1, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y)]; } var z = this.canonical.z + 1; var x = this.canonical.x * 2; var y = this.canonical.y * 2; return [ new OverscaledTileID(z, this.wrap, z, x, y), new OverscaledTileID(z, this.wrap, z, x + 1, y), new OverscaledTileID(z, this.wrap, z, x, y + 1), new OverscaledTileID(z, this.wrap, z, x + 1, y + 1) ]; }; OverscaledTileID.prototype.isLessThan = function isLessThan (rhs ) { if (this.wrap < rhs.wrap) { return true; } if (this.wrap > rhs.wrap) { return false; } if (this.overscaledZ < rhs.overscaledZ) { return true; } if (this.overscaledZ > rhs.overscaledZ) { return false; } if (this.canonical.x < rhs.canonical.x) { return true; } if (this.canonical.x > rhs.canonical.x) { return false; } if (this.canonical.y < rhs.canonical.y) { return true; } return false; }; OverscaledTileID.prototype.wrapped = function wrapped () { return new OverscaledTileID(this.overscaledZ, 0, this.canonical.z, this.canonical.x, this.canonical.y); }; OverscaledTileID.prototype.overscaleFactor = function overscaleFactor () { return Math.pow(2, this.overscaledZ - this.canonical.z); }; OverscaledTileID.prototype.toUnwrapped = function toUnwrapped () { return new UnwrappedTileID(this.wrap, this.canonical); }; OverscaledTileID.prototype.toString = function toString () { return ((this.overscaledZ) + "/" + (this.canonical.x) + "/" + (this.canonical.y)); }; OverscaledTileID.prototype.toCoordinate = function toCoordinate () { return new Coordinate(this.canonical.x + Math.pow(2, this.wrap), this.canonical.y, this.canonical.z); }; function calculateKey(wrap , z , x , y ) { wrap *= 2; if (wrap < 0) { wrap = wrap * -1 - 1; } var dim = 1 << z; return ((dim * dim * wrap + dim * y + x) * 32) + z; } function getQuadkey(z, x, y) { var quadkey = '', mask; for (var i = z; i > 0; i--) { mask = 1 << (i - 1); quadkey += ((x & mask ? 1 : 0) + (y & mask ? 2 : 0)); } return quadkey; } register('CanonicalTileID', CanonicalTileID); register('OverscaledTileID', OverscaledTileID, {omit: ['posMatrix']}); module.exports = { CanonicalTileID: CanonicalTileID, OverscaledTileID: OverscaledTileID, UnwrappedTileID: UnwrappedTileID }; },{"../geo/coordinate":66,"../util/web_worker_transfer":283,"@mapbox/whoots-js":12,"assert":13}],120:[function(require,module,exports){ 'use strict';// var Evented = require('../util/evented'); var util = require('../util/util'); var loadTileJSON = require('./load_tilejson'); var normalizeURL = require('../util/mapbox').normalizeTileURL; var TileBounds = require('./tile_bounds'); var ResourceType = require('../util/ajax').ResourceType; var browser = require('../util/browser'); var VectorTileSource = (function (Evented) { function VectorTileSource(id , options , dispatcher , eventedParent ) { Evented.call(this); this.id = id; this.dispatcher = dispatcher; this.type = 'vector'; this.minzoom = 0; this.maxzoom = 22; this.scheme = 'xyz'; this.tileSize = 512; this.reparseOverscaled = true; this.isTileClipped = true; util.extend(this, util.pick(options, ['url', 'scheme', 'tileSize'])); this._options = util.extend({ type: 'vector' }, options); this._collectResourceTiming = options.collectResourceTiming; if (this.tileSize !== 512) { throw new Error('vector tile sources must have a tileSize of 512'); } this.setEventedParent(eventedParent); } if ( Evented ) VectorTileSource.__proto__ = Evented; VectorTileSource.prototype = Object.create( Evented && Evented.prototype ); VectorTileSource.prototype.constructor = VectorTileSource; VectorTileSource.prototype.load = function load () { var this$1 = this; this.fire('dataloading', {dataType: 'source'}); loadTileJSON(this._options, this.map._transformRequest, function (err, tileJSON) { if (err) { this$1.fire('error', err); } else if (tileJSON) { util.extend(this$1, tileJSON); if (tileJSON.bounds) { this$1.tileBounds = new TileBounds(tileJSON.bounds, this$1.minzoom, this$1.maxzoom); } // `content` is included here to prevent a race condition where `Style#_updateSources` is called // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088 this$1.fire('data', {dataType: 'source', sourceDataType: 'metadata'}); this$1.fire('data', {dataType: 'source', sourceDataType: 'content'}); } }); }; VectorTileSource.prototype.hasTile = function hasTile (tileID ) { return !this.tileBounds || this.tileBounds.contains(tileID.canonical); }; VectorTileSource.prototype.onAdd = function onAdd (map ) { this.map = map; this.load(); }; VectorTileSource.prototype.serialize = function serialize () { return util.extend({}, this._options); }; VectorTileSource.prototype.loadTile = function loadTile (tile , callback ) { var overscaling = tile.tileID.overscaleFactor(); var url = normalizeURL(tile.tileID.canonical.url(this.tiles, this.scheme), this.url); var params = { request: this.map._transformRequest(url, ResourceType.Tile), uid: tile.uid, tileID: tile.tileID, zoom: tile.tileID.overscaledZ, tileSize: this.tileSize * overscaling, type: this.type, source: this.id, pixelRatio: browser.devicePixelRatio, overscaling: overscaling, showCollisionBoxes: this.map.showCollisionBoxes, }; params.request.collectResourceTiming = this._collectResourceTiming; if (tile.workerID === undefined || tile.state === 'expired') { tile.workerID = this.dispatcher.send('loadTile', params, done.bind(this)); } else if (tile.state === 'loading') { // schedule tile reloading after it has been loaded tile.reloadCallback = callback; } else { this.dispatcher.send('reloadTile', params, done.bind(this), tile.workerID); } function done(err, data) { if (tile.aborted) { return callback(null); } if (err) { return callback(err); } if (data && data.resourceTiming) { tile.resourceTiming = data.resourceTiming; } if (this.map._refreshExpiredTiles) { tile.setExpiryData(data); } tile.loadVectorData(data, this.map.painter); callback(null); if (tile.reloadCallback) { this.loadTile(tile, tile.reloadCallback); tile.reloadCallback = null; } } }; VectorTileSource.prototype.abortTile = function abortTile (tile ) { this.dispatcher.send('abortTile', { uid: tile.uid, type: this.type, source: this.id }, undefined, tile.workerID); }; VectorTileSource.prototype.unloadTile = function unloadTile (tile ) { tile.unloadVectorData(); this.dispatcher.send('removeTile', { uid: tile.uid, type: this.type, source: this.id }, undefined, tile.workerID); }; VectorTileSource.prototype.hasTransition = function hasTransition () { return false; }; return VectorTileSource; }(Evented)); module.exports = VectorTileSource; },{"../util/ajax":256,"../util/browser":257,"../util/evented":265,"../util/mapbox":272,"../util/util":280,"./load_tilejson":108,"./tile_bounds":118}],121:[function(require,module,exports){ 'use strict';// var ajax = require('../util/ajax'); var vt = require('@mapbox/vector-tile'); var Protobuf = require('pbf'); var WorkerTile = require('./worker_tile'); var util = require('../util/util'); var perf = require('../util/performance'); /** * @callback LoadVectorDataCallback * @param error * @param vectorTile * @private */ /** * @private */ function loadVectorTile(params , callback ) { var xhr = ajax.getArrayBuffer(params.request, function (err, response) { if (err) { callback(err); } else if (response) { callback(null, { vectorTile: new vt.VectorTile(new Protobuf(response.data)), rawData: response.data, cacheControl: response.cacheControl, expires: response.expires }); } }); return function () { xhr.abort(); callback(); }; } /** * The {@link WorkerSource} implementation that supports {@link VectorTileSource}. * This class is designed to be easily reused to support custom source types * for data formats that can be parsed/converted into an in-memory VectorTile * representation. To do so, create it with * `new VectorTileWorkerSource(actor, styleLayers, customLoadVectorDataFunction)`. * * @private */ var VectorTileWorkerSource = function VectorTileWorkerSource(actor , layerIndex , loadVectorData ) { this.actor = actor; this.layerIndex = layerIndex; this.loadVectorData = loadVectorData || loadVectorTile; this.loading = {}; this.loaded = {}; }; /** * Implements {@link WorkerSource#loadTile}. Delegates to * {@link VectorTileWorkerSource#loadVectorData} (which by default expects * a `params.url` property) for fetching and producing a VectorTile object. */ VectorTileWorkerSource.prototype.loadTile = function loadTile (params , callback ) { var this$1 = this; var source = params.source, uid = params.uid; if (!this.loading[source]) { this.loading[source] = {}; } var workerTile = this.loading[source][uid] = new WorkerTile(params); workerTile.abort = this.loadVectorData(params, function (err, response) { delete this$1.loading[source][uid]; if (err || !response) { return callback(err); } var rawTileData = response.rawData; var cacheControl = {}; if (response.expires) { cacheControl.expires = response.expires; } if (response.cacheControl) { cacheControl.cacheControl = response.cacheControl; } var resourceTiming = {}; if (params.request && params.request.collectResourceTiming) { var resourceTimingData = perf.getEntriesByName(params.request.url); // it's necessary to eval the result of getEntriesByName() here via parse/stringify // late evaluation in the main thread causes TypeError: illegal invocation if (resourceTimingData) { resourceTiming.resourceTiming = JSON.parse(JSON.stringify(resourceTimingData)); } } workerTile.vectorTile = response.vectorTile; workerTile.parse(response.vectorTile, this$1.layerIndex, this$1.actor, function (err, result) { if (err || !result) { return callback(err); } // Transferring a copy of rawTileData because the worker needs to retain its copy. callback(null, util.extend({rawTileData: rawTileData.slice(0)}, result, cacheControl, resourceTiming)); }); this$1.loaded[source] = this$1.loaded[source] || {}; this$1.loaded[source][uid] = workerTile; }); }; /** * Implements {@link WorkerSource#reloadTile}. */ VectorTileWorkerSource.prototype.reloadTile = function reloadTile (params , callback ) { var loaded = this.loaded[params.source], uid = params.uid, vtSource = this; if (loaded && loaded[uid]) { var workerTile = loaded[uid]; workerTile.showCollisionBoxes = params.showCollisionBoxes; if (workerTile.status === 'parsing') { workerTile.reloadCallback = callback; } else if (workerTile.status === 'done') { workerTile.parse(workerTile.vectorTile, this.layerIndex, this.actor, done.bind(workerTile)); } } function done(err, data) { if (this.reloadCallback) { var reloadCallback = this.reloadCallback; delete this.reloadCallback; this.parse(this.vectorTile, vtSource.layerIndex, vtSource.actor, reloadCallback); } callback(err, data); } }; /** * Implements {@link WorkerSource#abortTile}. * * @param params * @param params.source The id of the source for which we're loading this tile. * @param params.uid The UID for this tile. */ VectorTileWorkerSource.prototype.abortTile = function abortTile (params , callback ) { var loading = this.loading[params.source], uid = params.uid; if (loading && loading[uid] && loading[uid].abort) { loading[uid].abort(); delete loading[uid]; } callback(); }; /** * Implements {@link WorkerSource#removeTile}. * * @param params * @param params.source The id of the source for which we're loading this tile. * @param params.uid The UID for this tile. */ VectorTileWorkerSource.prototype.removeTile = function removeTile (params , callback ) { var loaded = this.loaded[params.source], uid = params.uid; if (loaded && loaded[uid]) { delete loaded[uid]; } callback(); }; module.exports = VectorTileWorkerSource; },{"../util/ajax":256,"../util/performance":273,"../util/util":280,"./worker_tile":124,"@mapbox/vector-tile":8,"pbf":31}],122:[function(require,module,exports){ 'use strict';// var ajax = require('../util/ajax'); var ImageSource = require('./image_source'); var rasterBoundsAttributes = require('../data/raster_bounds_attributes'); var VertexArrayObject = require('../render/vertex_array_object'); var Texture = require('../render/texture'); /** * A data source containing video. * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-video) for detailed documentation of options.) * @interface VideoSource * @example * // add to map * map.addSource('some id', { * type: 'video', * url: [ * 'https://www.mapbox.com/blog/assets/baltimore-smoke.mp4', * 'https://www.mapbox.com/blog/assets/baltimore-smoke.webm' * ], * coordinates: [ * [-76.54, 39.18], * [-76.52, 39.18], * [-76.52, 39.17], * [-76.54, 39.17] * ] * }); * * // update * var mySource = map.getSource('some id'); * mySource.setCoordinates([ * [-76.54335737228394, 39.18579907229748], * [-76.52803659439087, 39.1838364847587], * [-76.5295386314392, 39.17683392507606], * [-76.54520273208618, 39.17876344106642] * ]); * * map.removeSource('some id'); // remove * @see [Add a video](https://www.mapbox.com/mapbox-gl-js/example/video-on-a-map/) */ var VideoSource = (function (ImageSource) { function VideoSource(id , options , dispatcher , eventedParent ) { ImageSource.call(this, id, options, dispatcher, eventedParent); this.roundZoom = true; this.type = 'video'; this.options = options; } if ( ImageSource ) VideoSource.__proto__ = ImageSource; VideoSource.prototype = Object.create( ImageSource && ImageSource.prototype ); VideoSource.prototype.constructor = VideoSource; VideoSource.prototype.load = function load () { var this$1 = this; var options = this.options; this.urls = options.urls; ajax.getVideo(options.urls, function (err, video) { if (err) { this$1.fire('error', {error: err}); } else if (video) { this$1.video = video; this$1.video.loop = true; // Start repainting when video starts playing. hasTransition() will then return // true to trigger additional frames as long as the videos continues playing. this$1.video.addEventListener('playing', function () { this$1.map._rerender(); }); if (this$1.map) { this$1.video.play(); } this$1._finishLoading(); } }); }; /** * Returns the HTML `video` element. * * @returns {HTMLVideoElement} The HTML `video` element. */ VideoSource.prototype.getVideo = function getVideo () { return this.video; }; VideoSource.prototype.onAdd = function onAdd (map ) { if (this.map) { return; } this.map = map; this.load(); if (this.video) { this.video.play(); this.setCoordinates(this.coordinates); } }; /** * Sets the video's coordinates and re-renders the map. * * @method setCoordinates * @instance * @memberof VideoSource * @param {Array>} coordinates Four geographical coordinates, * represented as arrays of longitude and latitude numbers, which define the corners of the video. * The coordinates start at the top left corner of the video and proceed in clockwise order. * They do not have to represent a rectangle. * @returns {VideoSource} this */ // setCoordinates inherited from ImageSource VideoSource.prototype.prepare = function prepare () { var this$1 = this; if (Object.keys(this.tiles).length === 0 || this.video.readyState < 2) { return; // not enough data for current position } var context = this.map.painter.context; var gl = context.gl; if (!this.boundsBuffer) { this.boundsBuffer = context.createVertexBuffer(this._boundsArray, rasterBoundsAttributes.members); } if (!this.boundsVAO) { this.boundsVAO = new VertexArrayObject(); } if (!this.texture) { this.texture = new Texture(context, this.video, gl.RGBA); this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); } else if (!this.video.paused) { this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.video); } for (var w in this$1.tiles) { var tile = this$1.tiles[w]; if (tile.state !== 'loaded') { tile.state = 'loaded'; tile.texture = this$1.texture; } } }; VideoSource.prototype.serialize = function serialize () { return { type: 'video', urls: this.urls, coordinates: this.coordinates }; }; VideoSource.prototype.hasTransition = function hasTransition () { return this.video && !this.video.paused; }; return VideoSource; }(ImageSource)); module.exports = VideoSource; },{"../data/raster_bounds_attributes":64,"../render/texture":98,"../render/vertex_array_object":100,"../util/ajax":256,"./image_source":107}],123:[function(require,module,exports){ 'use strict';// var Actor = require('../util/actor'); var StyleLayerIndex = require('../style/style_layer_index'); var VectorTileWorkerSource = require('./vector_tile_worker_source'); var RasterDEMTileWorkerSource = require('./raster_dem_tile_worker_source'); var GeoJSONWorkerSource = require('./geojson_worker_source'); var assert = require('assert'); var globalRTLTextPlugin = require('./rtl_text_plugin'); /** * @private */ var Worker = function Worker(self ) { var this$1 = this; this.self = self; this.actor = new Actor(self, this); this.layerIndexes = {}; this.workerSourceTypes = { vector: VectorTileWorkerSource, geojson: GeoJSONWorkerSource }; // [mapId][sourceType] => worker source instance this.workerSources = {}; this.demWorkerSources = {}; this.self.registerWorkerSource = function (name , WorkerSource ) { if (this$1.workerSourceTypes[name]) { throw new Error(("Worker source with name \"" + name + "\" already registered.")); } this$1.workerSourceTypes[name] = WorkerSource; }; this.self.registerRTLTextPlugin = function (rtlTextPlugin ) { if (globalRTLTextPlugin.applyArabicShaping || globalRTLTextPlugin.processBidirectionalText) { throw new Error('RTL text plugin already registered.'); } globalRTLTextPlugin['applyArabicShaping'] = rtlTextPlugin.applyArabicShaping; globalRTLTextPlugin['processBidirectionalText'] = rtlTextPlugin.processBidirectionalText; }; }; Worker.prototype.setLayers = function setLayers (mapId , layers , callback ) { this.getLayerIndex(mapId).replace(layers); callback(); }; Worker.prototype.updateLayers = function updateLayers (mapId , params , callback ) { this.getLayerIndex(mapId).update(params.layers, params.removedIds); callback(); }; Worker.prototype.loadTile = function loadTile (mapId , params , callback ) { assert(params.type); this.getWorkerSource(mapId, params.type).loadTile(params, callback); }; Worker.prototype.loadDEMTile = function loadDEMTile (mapId , params , callback ) { this.getDEMWorkerSource(mapId).loadTile(params, callback); }; Worker.prototype.reloadTile = function reloadTile (mapId , params , callback ) { assert(params.type); this.getWorkerSource(mapId, params.type).reloadTile(params, callback); }; Worker.prototype.abortTile = function abortTile (mapId , params , callback ) { assert(params.type); this.getWorkerSource(mapId, params.type).abortTile(params, callback); }; Worker.prototype.removeTile = function removeTile (mapId , params , callback ) { assert(params.type); this.getWorkerSource(mapId, params.type).removeTile(params, callback); }; Worker.prototype.removeDEMTile = function removeDEMTile (mapId , params ) { this.getDEMWorkerSource(mapId).removeTile(params); }; Worker.prototype.removeSource = function removeSource (mapId , params , callback ) { assert(params.type); var worker = this.getWorkerSource(mapId, params.type); if (worker.removeSource !== undefined) { worker.removeSource(params, callback); } else { callback(); } }; /** * Load a {@link WorkerSource} script at params.url. The script is run * (using importScripts) with `registerWorkerSource` in scope, which is a * function taking `(name, workerSourceObject)`. * @private */ Worker.prototype.loadWorkerSource = function loadWorkerSource (map , params , callback ) { try { this.self.importScripts(params.url); callback(); } catch (e) { callback(e); } }; Worker.prototype.loadRTLTextPlugin = function loadRTLTextPlugin (map , pluginURL , callback ) { try { if (!globalRTLTextPlugin.applyArabicShaping && !globalRTLTextPlugin.processBidirectionalText) { this.self.importScripts(pluginURL); if (!globalRTLTextPlugin.applyArabicShaping || !globalRTLTextPlugin.processBidirectionalText) { callback(new Error(("RTL Text Plugin failed to import scripts from " + pluginURL))); } } } catch (e) { callback(e); } }; Worker.prototype.getLayerIndex = function getLayerIndex (mapId ) { var layerIndexes = this.layerIndexes[mapId]; if (!layerIndexes) { layerIndexes = this.layerIndexes[mapId] = new StyleLayerIndex(); } return layerIndexes; }; Worker.prototype.getWorkerSource = function getWorkerSource (mapId , type ) { var this$1 = this; if (!this.workerSources[mapId]) { this.workerSources[mapId] = {}; } if (!this.workerSources[mapId][type]) { // use a wrapped actor so that we can attach a target mapId param // to any messages invoked by the WorkerSource var actor = { send: function (type, data, callback) { this$1.actor.send(type, data, callback, mapId); } }; this.workerSources[mapId][type] = new (this.workerSourceTypes[type] )((actor ), this.getLayerIndex(mapId)); } return this.workerSources[mapId][type]; }; Worker.prototype.getDEMWorkerSource = function getDEMWorkerSource (mapId ) { if (!this.demWorkerSources[mapId]) { this.demWorkerSources[mapId] = new RasterDEMTileWorkerSource(); } return this.demWorkerSources[mapId]; }; module.exports = function createWorker(self ) { return new Worker(self); }; },{"../style/style_layer_index":215,"../util/actor":255,"./geojson_worker_source":105,"./raster_dem_tile_worker_source":112,"./rtl_text_plugin":114,"./vector_tile_worker_source":121,"assert":13}],124:[function(require,module,exports){ 'use strict';// var FeatureIndex = require('../data/feature_index'); var ref = require('../symbol/symbol_layout'); var performSymbolLayout = ref.performSymbolLayout; var ref$1 = require('../data/array_types'); var CollisionBoxArray = ref$1.CollisionBoxArray; var DictionaryCoder = require('../util/dictionary_coder'); var SymbolBucket = require('../data/bucket/symbol_bucket'); var util = require('../util/util'); var assert = require('assert'); var ref$2 = require('../render/image_atlas'); var makeImageAtlas = ref$2.makeImageAtlas; var ref$3 = require('../render/glyph_atlas'); var makeGlyphAtlas = ref$3.makeGlyphAtlas; var EvaluationParameters = require('../style/evaluation_parameters'); var ref$4 = require('./tile_id'); var OverscaledTileID = ref$4.OverscaledTileID; var WorkerTile = function WorkerTile(params ) { this.tileID = new OverscaledTileID(params.tileID.overscaledZ, params.tileID.wrap, params.tileID.canonical.z, params.tileID.canonical.x, params.tileID.canonical.y); this.uid = params.uid; this.zoom = params.zoom; this.pixelRatio = params.pixelRatio; this.tileSize = params.tileSize; this.source = params.source; this.overscaling = params.overscaling; this.showCollisionBoxes = params.showCollisionBoxes; this.collectResourceTiming = !!params.collectResourceTiming; }; WorkerTile.prototype.parse = function parse (data , layerIndex , actor , callback ) { var this$1 = this; this.status = 'parsing'; this.data = data; this.collisionBoxArray = new CollisionBoxArray(); var sourceLayerCoder = new DictionaryCoder(Object.keys(data.layers).sort()); var featureIndex = new FeatureIndex(this.tileID, this.overscaling); featureIndex.bucketLayerIDs = []; var buckets = {}; var options = { featureIndex: featureIndex, iconDependencies: {}, glyphDependencies: {} }; var layerFamilies = layerIndex.familiesBySource[this.source]; for (var sourceLayerId in layerFamilies) { var sourceLayer = data.layers[sourceLayerId]; if (!sourceLayer) { continue; } if (sourceLayer.version === 1) { util.warnOnce("Vector tile source \"" + (this$1.source) + "\" layer \"" + sourceLayerId + "\" " + "does not use vector tile spec v2 and therefore may have some rendering errors."); } var sourceLayerIndex = sourceLayerCoder.encode(sourceLayerId); var features = []; for (var index = 0; index < sourceLayer.length; index++) { var feature = sourceLayer.feature(index); features.push({ feature: feature, index: index, sourceLayerIndex: sourceLayerIndex }); } for (var i = 0, list = layerFamilies[sourceLayerId]; i < list.length; i += 1) { var family = list[i]; var layer = family[0]; assert(layer.source === this$1.source); if (layer.minzoom && this$1.zoom < Math.floor(layer.minzoom)) { continue; } if (layer.maxzoom && this$1.zoom >= layer.maxzoom) { continue; } if (layer.visibility === 'none') { continue; } recalculateLayers(family, this$1.zoom); var bucket = buckets[layer.id] = layer.createBucket({ index: featureIndex.bucketLayerIDs.length, layers: family, zoom: this$1.zoom, pixelRatio: this$1.pixelRatio, overscaling: this$1.overscaling, collisionBoxArray: this$1.collisionBoxArray }); bucket.populate(features, options); featureIndex.bucketLayerIDs.push(family.map(function (l) { return l.id; })); } } var error ; var glyphMap ; var imageMap ; var stacks = util.mapObject(options.glyphDependencies, function (glyphs) { return Object.keys(glyphs).map(Number); }); if (Object.keys(stacks).length) { actor.send('getGlyphs', {uid: this.uid, stacks: stacks}, function (err, result) { if (!error) { error = err; glyphMap = result; maybePrepare.call(this$1); } }); } else { glyphMap = {}; } var icons = Object.keys(options.iconDependencies); if (icons.length) { actor.send('getImages', {icons: icons}, function (err, result) { if (!error) { error = err; imageMap = result; maybePrepare.call(this$1); } }); } else { imageMap = {}; } maybePrepare.call(this); function maybePrepare() { var this$1 = this; if (error) { return callback(error); } else if (glyphMap && imageMap) { var glyphAtlas = makeGlyphAtlas(glyphMap); var imageAtlas = makeImageAtlas(imageMap); for (var key in buckets) { var bucket = buckets[key]; if (bucket instanceof SymbolBucket) { recalculateLayers(bucket.layers, this$1.zoom); performSymbolLayout(bucket, glyphMap, glyphAtlas.positions, imageMap, imageAtlas.positions, this$1.showCollisionBoxes); } } this.status = 'done'; callback(null, { buckets: util.values(buckets).filter(function (b) { return !b.isEmpty(); }), featureIndex: featureIndex, collisionBoxArray: this.collisionBoxArray, glyphAtlasImage: glyphAtlas.image, iconAtlasImage: imageAtlas.image }); } } }; function recalculateLayers(layers , zoom ) { // Layers are shared and may have been used by a WorkerTile with a different zoom. var parameters = new EvaluationParameters(zoom); for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; layer.recalculate(parameters); } } module.exports = WorkerTile; },{"../data/array_types":44,"../data/bucket/symbol_bucket":56,"../data/feature_index":59,"../render/glyph_atlas":90,"../render/image_atlas":92,"../style/evaluation_parameters":187,"../symbol/symbol_layout":232,"../util/dictionary_coder":262,"../util/util":280,"./tile_id":119,"assert":13}],125:[function(require,module,exports){ 'use strict'; var refProperties = require('./util/ref_properties'); function deref(layer, parent) { var result = {}; for (var k in layer) { if (k !== 'ref') { result[k] = layer[k]; } } refProperties.forEach(function (k) { if (k in parent) { result[k] = parent[k]; } }); return result; } module.exports = derefLayers; /** * Given an array of layers, some of which may contain `ref` properties * whose value is the `id` of another property, return a new array where * such layers have been augmented with the 'type', 'source', etc. properties * from the parent layer, and the `ref` property has been removed. * * The input is not modified. The output may contain references to portions * of the input. * * @private * @param {Array} layers * @returns {Array} */ function derefLayers(layers) { layers = layers.slice(); var map = Object.create(null); for (var i = 0; i < layers.length; i++) { map[layers[i].id] = layers[i]; } for (var i$1 = 0; i$1 < layers.length; i$1++) { if ('ref' in layers[i$1]) { layers[i$1] = deref(layers[i$1], map[layers[i$1].ref]); } } return layers; } },{"./util/ref_properties":164}],126:[function(require,module,exports){ 'use strict'; var isEqual = require('./util/deep_equal'); var operations = { /* * { command: 'setStyle', args: [stylesheet] } */ setStyle: 'setStyle', /* * { command: 'addLayer', args: [layer, 'beforeLayerId'] } */ addLayer: 'addLayer', /* * { command: 'removeLayer', args: ['layerId'] } */ removeLayer: 'removeLayer', /* * { command: 'setPaintProperty', args: ['layerId', 'prop', value] } */ setPaintProperty: 'setPaintProperty', /* * { command: 'setLayoutProperty', args: ['layerId', 'prop', value] } */ setLayoutProperty: 'setLayoutProperty', /* * { command: 'setFilter', args: ['layerId', filter] } */ setFilter: 'setFilter', /* * { command: 'addSource', args: ['sourceId', source] } */ addSource: 'addSource', /* * { command: 'removeSource', args: ['sourceId'] } */ removeSource: 'removeSource', /* * { command: 'setGeoJSONSourceData', args: ['sourceId', data] } */ setGeoJSONSourceData: 'setGeoJSONSourceData', /* * { command: 'setLayerZoomRange', args: ['layerId', 0, 22] } */ setLayerZoomRange: 'setLayerZoomRange', /* * { command: 'setLayerProperty', args: ['layerId', 'prop', value] } */ setLayerProperty: 'setLayerProperty', /* * { command: 'setCenter', args: [[lon, lat]] } */ setCenter: 'setCenter', /* * { command: 'setZoom', args: [zoom] } */ setZoom: 'setZoom', /* * { command: 'setBearing', args: [bearing] } */ setBearing: 'setBearing', /* * { command: 'setPitch', args: [pitch] } */ setPitch: 'setPitch', /* * { command: 'setSprite', args: ['spriteUrl'] } */ setSprite: 'setSprite', /* * { command: 'setGlyphs', args: ['glyphsUrl'] } */ setGlyphs: 'setGlyphs', /* * { command: 'setTransition', args: [transition] } */ setTransition: 'setTransition', /* * { command: 'setLighting', args: [lightProperties] } */ setLight: 'setLight' }; function addSource(sourceId, after, commands) { commands.push({ command: operations.addSource, args: [sourceId, after[sourceId]] }); } function removeSource(sourceId, commands, sourcesRemoved) { commands.push({ command: operations.removeSource, args: [sourceId] }); sourcesRemoved[sourceId] = true; } function updateSource(sourceId, after, commands, sourcesRemoved) { removeSource(sourceId, commands, sourcesRemoved); addSource(sourceId, after, commands); } function canUpdateGeoJSON(before, after, sourceId) { var prop; for (prop in before[sourceId]) { if (!before[sourceId].hasOwnProperty(prop)) { continue; } if (prop !== 'data' && !isEqual(before[sourceId][prop], after[sourceId][prop])) { return false; } } for (prop in after[sourceId]) { if (!after[sourceId].hasOwnProperty(prop)) { continue; } if (prop !== 'data' && !isEqual(before[sourceId][prop], after[sourceId][prop])) { return false; } } return true; } function diffSources(before, after, commands, sourcesRemoved) { before = before || {}; after = after || {}; var sourceId; // look for sources to remove for (sourceId in before) { if (!before.hasOwnProperty(sourceId)) { continue; } if (!after.hasOwnProperty(sourceId)) { removeSource(sourceId, commands, sourcesRemoved); } } // look for sources to add/update for (sourceId in after) { if (!after.hasOwnProperty(sourceId)) { continue; } if (!before.hasOwnProperty(sourceId)) { addSource(sourceId, after, commands); } else if (!isEqual(before[sourceId], after[sourceId])) { if (before[sourceId].type === 'geojson' && after[sourceId].type === 'geojson' && canUpdateGeoJSON(before, after, sourceId)) { commands.push({ command: operations.setGeoJSONSourceData, args: [sourceId, after[sourceId].data] }); } else { // no update command, must remove then add updateSource(sourceId, after, commands, sourcesRemoved); } } } } function diffLayerPropertyChanges(before, after, commands, layerId, klass, command) { before = before || {}; after = after || {}; var prop; for (prop in before) { if (!before.hasOwnProperty(prop)) { continue; } if (!isEqual(before[prop], after[prop])) { commands.push({ command: command, args: [layerId, prop, after[prop], klass] }); } } for (prop in after) { if (!after.hasOwnProperty(prop) || before.hasOwnProperty(prop)) { continue; } if (!isEqual(before[prop], after[prop])) { commands.push({ command: command, args: [layerId, prop, after[prop], klass] }); } } } function pluckId(layer) { return layer.id; } function indexById(group, layer) { group[layer.id] = layer; return group; } function diffLayers(before, after, commands) { before = before || []; after = after || []; // order of layers by id var beforeOrder = before.map(pluckId); var afterOrder = after.map(pluckId); // index of layer by id var beforeIndex = before.reduce(indexById, {}); var afterIndex = after.reduce(indexById, {}); // track order of layers as if they have been mutated var tracker = beforeOrder.slice(); // layers that have been added do not need to be diffed var clean = Object.create(null); var i, d, layerId, beforeLayer, afterLayer, insertBeforeLayerId, prop; // remove layers for (i = 0, d = 0; i < beforeOrder.length; i++) { layerId = beforeOrder[i]; if (!afterIndex.hasOwnProperty(layerId)) { commands.push({ command: operations.removeLayer, args: [layerId] }); tracker.splice(tracker.indexOf(layerId, d), 1); } else { // limit where in tracker we need to look for a match d++; } } // add/reorder layers for (i = 0, d = 0; i < afterOrder.length; i++) { // work backwards as insert is before an existing layer layerId = afterOrder[afterOrder.length - 1 - i]; if (tracker[tracker.length - 1 - i] === layerId) { continue; } if (beforeIndex.hasOwnProperty(layerId)) { // remove the layer before we insert at the correct position commands.push({ command: operations.removeLayer, args: [layerId] }); tracker.splice(tracker.lastIndexOf(layerId, tracker.length - d), 1); } else { // limit where in tracker we need to look for a match d++; } // add layer at correct position insertBeforeLayerId = tracker[tracker.length - i]; commands.push({ command: operations.addLayer, args: [afterIndex[layerId], insertBeforeLayerId] }); tracker.splice(tracker.length - i, 0, layerId); clean[layerId] = true; } // update layers for (i = 0; i < afterOrder.length; i++) { layerId = afterOrder[i]; beforeLayer = beforeIndex[layerId]; afterLayer = afterIndex[layerId]; // no need to update if previously added (new or moved) if (clean[layerId] || isEqual(beforeLayer, afterLayer)) { continue; } // If source, source-layer, or type have changes, then remove the layer // and add it back 'from scratch'. if (!isEqual(beforeLayer.source, afterLayer.source) || !isEqual(beforeLayer['source-layer'], afterLayer['source-layer']) || !isEqual(beforeLayer.type, afterLayer.type)) { commands.push({ command: operations.removeLayer, args: [layerId] }); // we add the layer back at the same position it was already in, so // there's no need to update the `tracker` insertBeforeLayerId = tracker[tracker.lastIndexOf(layerId) + 1]; commands.push({ command: operations.addLayer, args: [afterLayer, insertBeforeLayerId] }); continue; } // layout, paint, filter, minzoom, maxzoom diffLayerPropertyChanges(beforeLayer.layout, afterLayer.layout, commands, layerId, null, operations.setLayoutProperty); diffLayerPropertyChanges(beforeLayer.paint, afterLayer.paint, commands, layerId, null, operations.setPaintProperty); if (!isEqual(beforeLayer.filter, afterLayer.filter)) { commands.push({ command: operations.setFilter, args: [layerId, afterLayer.filter] }); } if (!isEqual(beforeLayer.minzoom, afterLayer.minzoom) || !isEqual(beforeLayer.maxzoom, afterLayer.maxzoom)) { commands.push({ command: operations.setLayerZoomRange, args: [layerId, afterLayer.minzoom, afterLayer.maxzoom] }); } // handle all other layer props, including paint.* for (prop in beforeLayer) { if (!beforeLayer.hasOwnProperty(prop)) { continue; } if (prop === 'layout' || prop === 'paint' || prop === 'filter' || prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom') { continue; } if (prop.indexOf('paint.') === 0) { diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty); } else if (!isEqual(beforeLayer[prop], afterLayer[prop])) { commands.push({ command: operations.setLayerProperty, args: [layerId, prop, afterLayer[prop]] }); } } for (prop in afterLayer) { if (!afterLayer.hasOwnProperty(prop) || beforeLayer.hasOwnProperty(prop)) { continue; } if (prop === 'layout' || prop === 'paint' || prop === 'filter' || prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom') { continue; } if (prop.indexOf('paint.') === 0) { diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty); } else if (!isEqual(beforeLayer[prop], afterLayer[prop])) { commands.push({ command: operations.setLayerProperty, args: [layerId, prop, afterLayer[prop]] }); } } } } /** * Diff two stylesheet * * Creates semanticly aware diffs that can easily be applied at runtime. * Operations produced by the diff closely resemble the mapbox-gl-js API. Any * error creating the diff will fall back to the 'setStyle' operation. * * Example diff: * [ * { command: 'setConstant', args: ['@water', '#0000FF'] }, * { command: 'setPaintProperty', args: ['background', 'background-color', 'black'] } * ] * * @private * @param {*} [before] stylesheet to compare from * @param {*} after stylesheet to compare to * @returns Array list of changes */ function diffStyles(before, after) { if (!before) { return [{ command: operations.setStyle, args: [after] }]; } var commands = []; try { // Handle changes to top-level properties if (!isEqual(before.version, after.version)) { return [{ command: operations.setStyle, args: [after] }]; } if (!isEqual(before.center, after.center)) { commands.push({ command: operations.setCenter, args: [after.center] }); } if (!isEqual(before.zoom, after.zoom)) { commands.push({ command: operations.setZoom, args: [after.zoom] }); } if (!isEqual(before.bearing, after.bearing)) { commands.push({ command: operations.setBearing, args: [after.bearing] }); } if (!isEqual(before.pitch, after.pitch)) { commands.push({ command: operations.setPitch, args: [after.pitch] }); } if (!isEqual(before.sprite, after.sprite)) { commands.push({ command: operations.setSprite, args: [after.sprite] }); } if (!isEqual(before.glyphs, after.glyphs)) { commands.push({ command: operations.setGlyphs, args: [after.glyphs] }); } if (!isEqual(before.transition, after.transition)) { commands.push({ command: operations.setTransition, args: [after.transition] }); } if (!isEqual(before.light, after.light)) { commands.push({ command: operations.setLight, args: [after.light] }); } // Handle changes to `sources` // If a source is to be removed, we also--before the removeSource // command--need to remove all the style layers that depend on it. var sourcesRemoved = {}; // First collect the {add,remove}Source commands var removeOrAddSourceCommands = []; diffSources(before.sources, after.sources, removeOrAddSourceCommands, sourcesRemoved); // Push a removeLayer command for each style layer that depends on a // source that's being removed. // Also, exclude any such layers them from the input to `diffLayers` // below, so that diffLayers produces the appropriate `addLayers` // command var beforeLayers = []; if (before.layers) { before.layers.forEach(function (layer) { if (sourcesRemoved[layer.source]) { commands.push({ command: operations.removeLayer, args: [layer.id] }); } else { beforeLayers.push(layer); } }); } commands = commands.concat(removeOrAddSourceCommands); // Handle changes to `layers` diffLayers(beforeLayers, after.layers, commands); } catch (e) { // fall back to setStyle console.warn('Unable to compute style diff:', e); commands = [{ command: operations.setStyle, args: [after] }]; } return commands; } module.exports = diffStyles; module.exports.operations = operations; },{"./util/deep_equal":160}],127:[function(require,module,exports){ 'use strict'; function ValidationError(key, value, message) { this.message = (key ? (key + ": ") : '') + message; if (value !== null && value !== undefined && value.__line__) { this.line = value.__line__; } } module.exports = ValidationError; },{}],128:[function(require,module,exports){ 'use strict';// var ref = require('./types'); var toString = ref.toString; var ParsingContext = require('./parsing_context'); var EvaluationContext = require('./evaluation_context'); var assert = require('assert'); var CompoundExpression = function CompoundExpression(name , type , evaluate , args ) { this.name = name; this.type = type; this._evaluate = evaluate; this.args = args; }; CompoundExpression.prototype.evaluate = function evaluate (ctx ) { return this._evaluate(ctx, this.args); }; CompoundExpression.prototype.eachChild = function eachChild (fn ) { this.args.forEach(fn); }; CompoundExpression.prototype.possibleOutputs = function possibleOutputs () { return [undefined]; }; CompoundExpression.parse = function parse (args , context ) { var op = (args[0] ); var definition = CompoundExpression.definitions[op]; if (!definition) { return context.error(("Unknown expression \"" + op + "\". If you wanted a literal array, use [\"literal\", [...]]."), 0); } // Now check argument types against each signature var type = Array.isArray(definition) ? definition[0] : definition.type; var availableOverloads = Array.isArray(definition) ? [[definition[1], definition[2]]] : definition.overloads; var overloads = availableOverloads.filter(function (ref) { var signature = ref[0]; return ( !Array.isArray(signature) || // varags signature.length === args.length - 1 // correct param count ); }); // First parse all the args var parsedArgs = []; for (var i = 1; i < args.length; i++) { var arg = args[i]; var expected = (void 0); if (overloads.length === 1) { var params = overloads[0][0]; expected = Array.isArray(params) ? params[i - 1] : params.type; } var parsed = context.parse(arg, 1 + parsedArgs.length, expected); if (!parsed) { return null; } parsedArgs.push(parsed); } var signatureContext = (null ); for (var i$2 = 0, list = overloads; i$2 < list.length; i$2 += 1) { // Use a fresh context for each attempted signature so that, if // we eventually succeed, we haven't polluted `context.errors`. var ref = list[i$2]; var params$1 = ref[0]; var evaluate = ref[1]; signatureContext = new ParsingContext(context.registry, context.path, null, context.scope); if (Array.isArray(params$1)) { if (params$1.length !== parsedArgs.length) { signatureContext.error(("Expected " + (params$1.length) + " arguments, but found " + (parsedArgs.length) + " instead.")); continue; } } for (var i$1 = 0; i$1 < parsedArgs.length; i$1++) { var expected$1 = Array.isArray(params$1) ? params$1[i$1] : params$1.type; var arg$1 = parsedArgs[i$1]; signatureContext.concat(i$1 + 1).checkSubtype(expected$1, arg$1.type); } if (signatureContext.errors.length === 0) { return new CompoundExpression(op, type, evaluate, parsedArgs); } } assert(!signatureContext || signatureContext.errors.length > 0); if (overloads.length === 1) { context.errors.push.apply(context.errors, signatureContext.errors); } else { var expected$2 = overloads.length ? overloads : availableOverloads; var signatures = expected$2 .map(function (ref) { var params = ref[0]; return stringifySignature(params); }) .join(' | '); var actualTypes = parsedArgs .map(function (arg) { return toString(arg.type); }) .join(', '); context.error(("Expected arguments of type " + signatures + ", but found (" + actualTypes + ") instead.")); } return null; }; CompoundExpression.register = function register ( registry , definitions ) { assert(!CompoundExpression.definitions); CompoundExpression.definitions = definitions; for (var name in definitions) { registry[name] = CompoundExpression; } }; function varargs(type ) { return { type: type }; } function stringifySignature(signature ) { if (Array.isArray(signature)) { return ("(" + (signature.map(toString).join(', ')) + ")"); } else { return ("(" + (toString(signature.type)) + "...)"); } } module.exports = { CompoundExpression: CompoundExpression, varargs: varargs }; },{"./evaluation_context":143,"./parsing_context":146,"./types":151,"assert":13}],129:[function(require,module,exports){ 'use strict';// var ref = require('../types'); var toString = ref.toString; var array = ref.array; var ValueType = ref.ValueType; var StringType = ref.StringType; var NumberType = ref.NumberType; var BooleanType = ref.BooleanType; var checkSubtype = ref.checkSubtype; var ref$1 = require('../values'); var typeOf = ref$1.typeOf; var RuntimeError = require('../runtime_error'); var types = { string: StringType, number: NumberType, boolean: BooleanType }; var ArrayAssertion = function ArrayAssertion(type , input ) { this.type = type; this.input = input; }; ArrayAssertion.parse = function parse (args , context ) { if (args.length < 2 || args.length > 4) { return context.error(("Expected 1, 2, or 3 arguments, but found " + (args.length - 1) + " instead.")); } var itemType; var N; if (args.length > 2) { var type$1 = args[1]; if (typeof type$1 !== 'string' || !(type$1 in types)) { return context.error('The item type argument of "array" must be one of string, number, boolean', 1); } itemType = types[type$1]; } else { itemType = ValueType; } if (args.length > 3) { if ( typeof args[2] !== 'number' || args[2] < 0 || args[2] !== Math.floor(args[2]) ) { return context.error('The length argument to "array" must be a positive integer literal', 2); } N = args[2]; } var type = array(itemType, N); var input = context.parse(args[args.length - 1], args.length - 1, ValueType); if (!input) { return null; } return new ArrayAssertion(type, input); }; ArrayAssertion.prototype.evaluate = function evaluate (ctx ) { var value = this.input.evaluate(ctx); var error = checkSubtype(this.type, typeOf(value)); if (error) { throw new RuntimeError(("Expected value to be of type " + (toString(this.type)) + ", but found " + (toString(typeOf(value))) + " instead.")); } return value; }; ArrayAssertion.prototype.eachChild = function eachChild (fn ) { fn(this.input); }; ArrayAssertion.prototype.possibleOutputs = function possibleOutputs () { return this.input.possibleOutputs(); }; module.exports = ArrayAssertion; },{"../runtime_error":148,"../types":151,"../values":152}],130:[function(require,module,exports){ 'use strict';// var assert = require('assert'); var ref = require('../types'); var ObjectType = ref.ObjectType; var ValueType = ref.ValueType; var StringType = ref.StringType; var NumberType = ref.NumberType; var BooleanType = ref.BooleanType; var RuntimeError = require('../runtime_error'); var ref$1 = require('../types'); var checkSubtype = ref$1.checkSubtype; var toString = ref$1.toString; var ref$2 = require('../values'); var typeOf = ref$2.typeOf; var types = { string: StringType, number: NumberType, boolean: BooleanType, object: ObjectType }; var Assertion = function Assertion(type , args ) { this.type = type; this.args = args; }; Assertion.parse = function parse (args , context ) { if (args.length < 2) { return context.error("Expected at least one argument."); } var name = (args[0] ); assert(types[name], name); var type = types[name]; var parsed = []; for (var i = 1; i < args.length; i++) { var input = context.parse(args[i], i, ValueType); if (!input) { return null; } parsed.push(input); } return new Assertion(type, parsed); }; Assertion.prototype.evaluate = function evaluate (ctx ) { var this$1 = this; for (var i = 0; i < this.args.length; i++) { var value = this$1.args[i].evaluate(ctx); var error = checkSubtype(this$1.type, typeOf(value)); if (!error) { return value; } else if (i === this$1.args.length - 1) { throw new RuntimeError(("Expected value to be of type " + (toString(this$1.type)) + ", but found " + (toString(typeOf(value))) + " instead.")); } } assert(false); return null; }; Assertion.prototype.eachChild = function eachChild (fn ) { this.args.forEach(fn); }; Assertion.prototype.possibleOutputs = function possibleOutputs () { return (ref = []).concat.apply(ref, this.args.map(function (arg) { return arg.possibleOutputs(); })); var ref; }; module.exports = Assertion; },{"../runtime_error":148,"../types":151,"../values":152,"assert":13}],131:[function(require,module,exports){ 'use strict';// var ref = require('../types'); var array = ref.array; var ValueType = ref.ValueType; var NumberType = ref.NumberType; var RuntimeError = require('../runtime_error'); var At = function At(type , index , input ) { this.type = type; this.index = index; this.input = input; }; At.parse = function parse (args , context ) { if (args.length !== 3) { return context.error(("Expected 2 arguments, but found " + (args.length - 1) + " instead.")); } var index = context.parse(args[1], 1, NumberType); var input = context.parse(args[2], 2, array(context.expectedType || ValueType)); if (!index || !input) { return null; } var t = (input.type ); return new At(t.itemType, index, input); }; At.prototype.evaluate = function evaluate (ctx ) { var index = ((this.index.evaluate(ctx) ) ); var array = ((this.input.evaluate(ctx) ) ); if (index < 0 || index >= array.length) { throw new RuntimeError(("Array index out of bounds: " + index + " > " + (array.length) + ".")); } if (index !== Math.floor(index)) { throw new RuntimeError(("Array index must be an integer, but found " + index + " instead.")); } return array[index]; }; At.prototype.eachChild = function eachChild (fn ) { fn(this.index); fn(this.input); }; At.prototype.possibleOutputs = function possibleOutputs () { return [undefined]; }; module.exports = At; },{"../runtime_error":148,"../types":151}],132:[function(require,module,exports){ 'use strict';// var assert = require('assert'); var ref = require('../types'); var BooleanType = ref.BooleanType; var Case = function Case(type , branches , otherwise ) { this.type = type; this.branches = branches; this.otherwise = otherwise; }; Case.parse = function parse (args , context ) { if (args.length < 4) { return context.error(("Expected at least 3 arguments, but found only " + (args.length - 1) + ".")); } if (args.length % 2 !== 0) { return context.error("Expected an odd number of arguments."); } var outputType ; if (context.expectedType && context.expectedType.kind !== 'value') { outputType = context.expectedType; } var branches = []; for (var i = 1; i < args.length - 1; i += 2) { var test = context.parse(args[i], i, BooleanType); if (!test) { return null; } var result = context.parse(args[i + 1], i + 1, outputType); if (!result) { return null; } branches.push([test, result]); outputType = outputType || result.type; } var otherwise = context.parse(args[args.length - 1], args.length - 1, outputType); if (!otherwise) { return null; } assert(outputType); return new Case((outputType ), branches, otherwise); }; Case.prototype.evaluate = function evaluate (ctx ) { var this$1 = this; for (var i = 0, list = this$1.branches; i < list.length; i += 1) { var ref = list[i]; var test = ref[0]; var expression = ref[1]; if (test.evaluate(ctx)) { return expression.evaluate(ctx); } } return this.otherwise.evaluate(ctx); }; Case.prototype.eachChild = function eachChild (fn ) { var this$1 = this; for (var i = 0, list = this$1.branches; i < list.length; i += 1) { var ref = list[i]; var test = ref[0]; var expression = ref[1]; fn(test); fn(expression); } fn(this.otherwise); }; Case.prototype.possibleOutputs = function possibleOutputs () { return (ref = []) .concat.apply(ref, this.branches.map(function (ref) { var _ = ref[0]; var out = ref[1]; return out.possibleOutputs(); })) .concat(this.otherwise.possibleOutputs()); var ref; }; module.exports = Case; },{"../types":151,"assert":13}],133:[function(require,module,exports){ 'use strict';// var assert = require('assert'); var ref = require('../types'); var checkSubtype = ref.checkSubtype; var ValueType = ref.ValueType; var Coalesce = function Coalesce(type , args ) { this.type = type; this.args = args; }; Coalesce.parse = function parse (args , context ) { if (args.length < 2) { return context.error("Expectected at least one argument."); } var outputType = (null ); var expectedType = context.expectedType; if (expectedType && expectedType.kind !== 'value') { outputType = expectedType; } var parsedArgs = []; for (var i = 0, list = args.slice(1); i < list.length; i += 1) { var arg = list[i]; var parsed = context.parse(arg, 1 + parsedArgs.length, outputType, undefined, {omitTypeAnnotations: true}); if (!parsed) { return null; } outputType = outputType || parsed.type; parsedArgs.push(parsed); } assert(outputType); // Above, we parse arguments without inferred type annotation so that // they don't produce a runtime error for `null` input, which would // preempt the desired null-coalescing behavior. // Thus, if any of our arguments would have needed an annotation, we // need to wrap the enclosing coalesce expression with it instead. var needsAnnotation = expectedType && parsedArgs.some(function (arg) { return checkSubtype(expectedType, arg.type); }); return needsAnnotation ? new Coalesce(ValueType, parsedArgs) : new Coalesce((outputType ), parsedArgs); }; Coalesce.prototype.evaluate = function evaluate (ctx ) { var this$1 = this; var result = null; for (var i = 0, list = this$1.args; i < list.length; i += 1) { var arg = list[i]; result = arg.evaluate(ctx); if (result !== null) { break; } } return result; }; Coalesce.prototype.eachChild = function eachChild (fn ) { this.args.forEach(fn); }; Coalesce.prototype.possibleOutputs = function possibleOutputs () { return (ref = []).concat.apply(ref, this.args.map(function (arg) { return arg.possibleOutputs(); })); var ref; }; module.exports = Coalesce; },{"../types":151,"assert":13}],134:[function(require,module,exports){ 'use strict';// var assert = require('assert'); var ref = require('../types'); var ColorType = ref.ColorType; var ValueType = ref.ValueType; var NumberType = ref.NumberType; var ref$1 = require('../values'); var Color = ref$1.Color; var validateRGBA = ref$1.validateRGBA; var RuntimeError = require('../runtime_error'); var types = { 'to-number': NumberType, 'to-color': ColorType }; /** * Special form for error-coalescing coercion expressions "to-number", * "to-color". Since these coercions can fail at runtime, they accept multiple * arguments, only evaluating one at a time until one succeeds. * * @private */ var Coercion = function Coercion(type , args ) { this.type = type; this.args = args; }; Coercion.parse = function parse (args , context ) { if (args.length < 2) { return context.error("Expected at least one argument."); } var name = (args[0] ); assert(types[name], name); var type = types[name]; var parsed = []; for (var i = 1; i < args.length; i++) { var input = context.parse(args[i], i, ValueType); if (!input) { return null; } parsed.push(input); } return new Coercion(type, parsed); }; Coercion.prototype.evaluate = function evaluate (ctx ) { var this$1 = this; if (this.type.kind === 'color') { var input; var error; for (var i = 0, list = this$1.args; i < list.length; i += 1) { var arg = list[i]; input = arg.evaluate(ctx); error = null; if (typeof input === 'string') { var c = ctx.parseColor(input); if (c) { return c; } } else if (Array.isArray(input)) { if (input.length < 3 || input.length > 4) { error = "Invalid rbga value " + (JSON.stringify(input)) + ": expected an array containing either three or four numeric values."; } else { error = validateRGBA(input[0], input[1], input[2], input[3]); } if (!error) { return new Color((input[0] ) / 255, (input[1] ) / 255, (input[2] ) / 255, (input[3] )); } } } throw new RuntimeError(error || ("Could not parse color from value '" + (typeof input === 'string' ? input : JSON.stringify(input)) + "'")); } else { var value = null; for (var i$1 = 0, list$1 = this$1.args; i$1 < list$1.length; i$1 += 1) { var arg$1 = list$1[i$1]; value = arg$1.evaluate(ctx); if (value === null) { continue; } var num = Number(value); if (isNaN(num)) { continue; } return num; } throw new RuntimeError(("Could not convert " + (JSON.stringify(value)) + " to number.")); } }; Coercion.prototype.eachChild = function eachChild (fn ) { this.args.forEach(fn); }; Coercion.prototype.possibleOutputs = function possibleOutputs () { return (ref = []).concat.apply(ref, this.args.map(function (arg) { return arg.possibleOutputs(); })); var ref; }; module.exports = Coercion; },{"../runtime_error":148,"../types":151,"../values":152,"assert":13}],135:[function(require,module,exports){ 'use strict';// var ref = require('../types'); var ValueType = ref.ValueType; var BooleanType = ref.BooleanType; var ref$1 = require('../types'); var toString = ref$1.toString; function isComparableType(type ) { return type.kind === 'string' || type.kind === 'number' || type.kind === 'boolean' || type.kind === 'null'; } /** * Special form for ==, !=, implementing the following signatures: * - (T1: Comparable, T2: Comparable) => boolean { T1 == T2 } * - (Comparable, value) => boolean * - (value, Comparable) => boolean * * Where Comparable = string | number | boolean | null. * * Evaluation semantics for the value cases are equivalent to Javascript's * strict equality (===/!==) -- i.e., when the value argument's type doesn't * match that of the Comparable argument, == evaluates to false, != to true. * * @private */ function makeComparison(compare) { return (function () { function Comparison(lhs , rhs ) { this.type = BooleanType; this.lhs = lhs; this.rhs = rhs; } Comparison.parse = function parse (args , context ) { if (args.length !== 3) { return context.error("Expected two arguments."); } var lhs = context.parse(args[1], 1, ValueType); if (!lhs) { return null; } var rhs = context.parse(args[2], 2, ValueType); if (!rhs) { return null; } if (!isComparableType(lhs.type) && !isComparableType(rhs.type)) { return context.error(("Expected at least one argument to be a string, number, boolean, or null, but found (" + (toString(lhs.type)) + ", " + (toString(rhs.type)) + ") instead.")); } if (lhs.type.kind !== rhs.type.kind && lhs.type.kind !== 'value' && rhs.type.kind !== 'value') { return context.error(("Cannot compare " + (toString(lhs.type)) + " and " + (toString(rhs.type)) + ".")); } return new Comparison(lhs, rhs); }; Comparison.prototype.evaluate = function evaluate (ctx ) { return compare(this.lhs.evaluate(ctx), this.rhs.evaluate(ctx)); }; Comparison.prototype.eachChild = function eachChild (fn ) { fn(this.lhs); fn(this.rhs); }; Comparison.prototype.possibleOutputs = function possibleOutputs () { return [true, false]; }; return Comparison; }()); } module.exports = { Equals: makeComparison(function (lhs, rhs) { return lhs === rhs; }), NotEquals: makeComparison(function (lhs, rhs) { return lhs !== rhs; }) }; },{"../types":151}],136:[function(require,module,exports){ 'use strict';// var ref = require('../types'); var NumberType = ref.NumberType; var StringType = ref.StringType; var BooleanType = ref.BooleanType; var ColorType = ref.ColorType; var ObjectType = ref.ObjectType; var ValueType = ref.ValueType; var ErrorType = ref.ErrorType; var array = ref.array; var toString = ref.toString; var ref$1 = require('../values'); var typeOf = ref$1.typeOf; var Color = ref$1.Color; var validateRGBA = ref$1.validateRGBA; var ref$2 = require('../compound_expression'); var CompoundExpression = ref$2.CompoundExpression; var varargs = ref$2.varargs; var RuntimeError = require('../runtime_error'); var Let = require('./let'); var Var = require('./var'); var Literal = require('./literal'); var Assertion = require('./assertion'); var ArrayAssertion = require('./array'); var Coercion = require('./coercion'); var At = require('./at'); var Match = require('./match'); var Case = require('./case'); var Step = require('./step'); var Interpolate = require('./interpolate'); var Coalesce = require('./coalesce'); var ref$3 = require('./equals'); var Equals = ref$3.Equals; var NotEquals = ref$3.NotEquals; var expressions = { // special forms '==': Equals, '!=': NotEquals, 'array': ArrayAssertion, 'at': At, 'boolean': Assertion, 'case': Case, 'coalesce': Coalesce, 'interpolate': Interpolate, 'let': Let, 'literal': Literal, 'match': Match, 'number': Assertion, 'object': Assertion, 'step': Step, 'string': Assertion, 'to-color': Coercion, 'to-number': Coercion, 'var': Var }; function rgba(ctx, ref) { var r = ref[0]; var g = ref[1]; var b = ref[2]; var a = ref[3]; r = r.evaluate(ctx); g = g.evaluate(ctx); b = b.evaluate(ctx); var alpha = a ? a.evaluate(ctx) : 1; var error = validateRGBA(r, g, b, alpha); if (error) { throw new RuntimeError(error); } return new Color(r / 255 * alpha, g / 255 * alpha, b / 255 * alpha, alpha); } function has(key, obj) { return key in obj; } function get(key, obj) { var v = obj[key]; return typeof v === 'undefined' ? null : v; } function length(ctx, ref) { var v = ref[0]; return v.evaluate(ctx).length; } function lt(ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) < b.evaluate(ctx); } function gt(ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) > b.evaluate(ctx); } function lteq(ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) <= b.evaluate(ctx); } function gteq(ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) >= b.evaluate(ctx); } function binarySearch(v, a, i, j) { while (i <= j) { var m = (i + j) >> 1; if (a[m] === v) { return true; } if (a[m] > v) { j = m - 1; } else { i = m + 1; } } return false; } CompoundExpression.register(expressions, { 'error': [ ErrorType, [StringType], function (ctx, ref) { var v = ref[0]; throw new RuntimeError(v.evaluate(ctx)); } ], 'typeof': [ StringType, [ValueType], function (ctx, ref) { var v = ref[0]; return toString(typeOf(v.evaluate(ctx))); } ], 'to-string': [ StringType, [ValueType], function (ctx, ref) { var v = ref[0]; v = v.evaluate(ctx); var type = typeof v; if (v === null || type === 'string' || type === 'number' || type === 'boolean') { return String(v); } else if (v instanceof Color) { return v.toString(); } else { return JSON.stringify(v); } } ], 'to-boolean': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; return Boolean(v.evaluate(ctx)); } ], 'to-rgba': [ array(NumberType, 4), [ColorType], function (ctx, ref) { var v = ref[0]; var ref$1 = v.evaluate(ctx); var r = ref$1.r; var g = ref$1.g; var b = ref$1.b; var a = ref$1.a; return [255 * r / a, 255 * g / a, 255 * b / a, a]; } ], 'rgb': [ ColorType, [NumberType, NumberType, NumberType], rgba ], 'rgba': [ ColorType, [NumberType, NumberType, NumberType, NumberType], rgba ], 'length': { type: NumberType, overloads: [ [ [StringType], length ], [ [array(ValueType)], length ] ] }, 'has': { type: BooleanType, overloads: [ [ [StringType], function (ctx, ref) { var key = ref[0]; return has(key.evaluate(ctx), ctx.properties()); } ], [ [StringType, ObjectType], function (ctx, ref) { var key = ref[0]; var obj = ref[1]; return has(key.evaluate(ctx), obj.evaluate(ctx)); } ] ] }, 'get': { type: ValueType, overloads: [ [ [StringType], function (ctx, ref) { var key = ref[0]; return get(key.evaluate(ctx), ctx.properties()); } ], [ [StringType, ObjectType], function (ctx, ref) { var key = ref[0]; var obj = ref[1]; return get(key.evaluate(ctx), obj.evaluate(ctx)); } ] ] }, 'properties': [ ObjectType, [], function (ctx) { return ctx.properties(); } ], 'geometry-type': [ StringType, [], function (ctx) { return ctx.geometryType(); } ], 'id': [ ValueType, [], function (ctx) { return ctx.id(); } ], 'zoom': [ NumberType, [], function (ctx) { return ctx.globals.zoom; } ], 'heatmap-density': [ NumberType, [], function (ctx) { return ctx.globals.heatmapDensity || 0; } ], '+': [ NumberType, varargs(NumberType), function (ctx, args) { var result = 0; for (var i = 0, list = args; i < list.length; i += 1) { var arg = list[i]; result += arg.evaluate(ctx); } return result; } ], '*': [ NumberType, varargs(NumberType), function (ctx, args) { var result = 1; for (var i = 0, list = args; i < list.length; i += 1) { var arg = list[i]; result *= arg.evaluate(ctx); } return result; } ], '-': { type: NumberType, overloads: [ [ [NumberType, NumberType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) - b.evaluate(ctx); } ], [ [NumberType], function (ctx, ref) { var a = ref[0]; return -a.evaluate(ctx); } ] ] }, '/': [ NumberType, [NumberType, NumberType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) / b.evaluate(ctx); } ], '%': [ NumberType, [NumberType, NumberType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) % b.evaluate(ctx); } ], 'ln2': [ NumberType, [], function () { return Math.LN2; } ], 'pi': [ NumberType, [], function () { return Math.PI; } ], 'e': [ NumberType, [], function () { return Math.E; } ], '^': [ NumberType, [NumberType, NumberType], function (ctx, ref) { var b = ref[0]; var e = ref[1]; return Math.pow(b.evaluate(ctx), e.evaluate(ctx)); } ], 'sqrt': [ NumberType, [NumberType], function (ctx, ref) { var x = ref[0]; return Math.sqrt(x.evaluate(ctx)); } ], 'log10': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.log10(n.evaluate(ctx)); } ], 'ln': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.log(n.evaluate(ctx)); } ], 'log2': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.log2(n.evaluate(ctx)); } ], 'sin': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.sin(n.evaluate(ctx)); } ], 'cos': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.cos(n.evaluate(ctx)); } ], 'tan': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.tan(n.evaluate(ctx)); } ], 'asin': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.asin(n.evaluate(ctx)); } ], 'acos': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.acos(n.evaluate(ctx)); } ], 'atan': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.atan(n.evaluate(ctx)); } ], 'min': [ NumberType, varargs(NumberType), function (ctx, args) { return Math.min.apply(Math, args.map(function (arg) { return arg.evaluate(ctx); })); } ], 'max': [ NumberType, varargs(NumberType), function (ctx, args) { return Math.max.apply(Math, args.map(function (arg) { return arg.evaluate(ctx); })); } ], 'filter-==': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; return ctx.properties()[(k ).value] === (v ).value; } ], 'filter-id-==': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; return ctx.id() === (v ).value; } ], 'filter-type-==': [ BooleanType, [StringType], function (ctx, ref) { var v = ref[0]; return ctx.geometryType() === (v ).value; } ], 'filter-<': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; var a = ctx.properties()[(k ).value]; var b = (v ).value; return typeof a === typeof b && a < b; } ], 'filter-id-<': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; var a = ctx.id(); var b = (v ).value; return typeof a === typeof b && a < b; } ], 'filter->': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; var a = ctx.properties()[(k ).value]; var b = (v ).value; return typeof a === typeof b && a > b; } ], 'filter-id->': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; var a = ctx.id(); var b = (v ).value; return typeof a === typeof b && a > b; } ], 'filter-<=': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; var a = ctx.properties()[(k ).value]; var b = (v ).value; return typeof a === typeof b && a <= b; } ], 'filter-id-<=': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; var a = ctx.id(); var b = (v ).value; return typeof a === typeof b && a <= b; } ], 'filter->=': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; var a = ctx.properties()[(k ).value]; var b = (v ).value; return typeof a === typeof b && a >= b; } ], 'filter-id->=': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; var a = ctx.id(); var b = (v ).value; return typeof a === typeof b && a >= b; } ], 'filter-has': [ BooleanType, [ValueType], function (ctx, ref) { var k = ref[0]; return (k ).value in ctx.properties(); } ], 'filter-has-id': [ BooleanType, [], function (ctx) { return ctx.id() !== null; } ], 'filter-type-in': [ BooleanType, [array(StringType)], function (ctx, ref) { var v = ref[0]; return (v ).value.indexOf(ctx.geometryType()) >= 0; } ], 'filter-id-in': [ BooleanType, [array(ValueType)], function (ctx, ref) { var v = ref[0]; return (v ).value.indexOf(ctx.id()) >= 0; } ], 'filter-in-small': [ BooleanType, [StringType, array(ValueType)], // assumes v is an array literal function (ctx, ref) { var k = ref[0]; var v = ref[1]; return (v ).value.indexOf(ctx.properties()[(k ).value]) >= 0; } ], 'filter-in-large': [ BooleanType, [StringType, array(ValueType)], // assumes v is a array literal with values sorted in ascending order and of a single type function (ctx, ref) { var k = ref[0]; var v = ref[1]; return binarySearch(ctx.properties()[(k ).value], (v ).value, 0, (v ).value.length - 1); } ], '>': { type: BooleanType, overloads: [ [[NumberType, NumberType], gt], [[StringType, StringType], gt] ] }, '<': { type: BooleanType, overloads: [ [[NumberType, NumberType], lt], [[StringType, StringType], lt] ] }, '>=': { type: BooleanType, overloads: [ [[NumberType, NumberType], gteq], [[StringType, StringType], gteq] ] }, '<=': { type: BooleanType, overloads: [ [[NumberType, NumberType], lteq], [[StringType, StringType], lteq] ] }, 'all': { type: BooleanType, overloads: [ [ [BooleanType, BooleanType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) && b.evaluate(ctx); } ], [ varargs(BooleanType), function (ctx, args) { for (var i = 0, list = args; i < list.length; i += 1) { var arg = list[i]; if (!arg.evaluate(ctx)) { return false; } } return true; } ] ] }, 'any': { type: BooleanType, overloads: [ [ [BooleanType, BooleanType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) || b.evaluate(ctx); } ], [ varargs(BooleanType), function (ctx, args) { for (var i = 0, list = args; i < list.length; i += 1) { var arg = list[i]; if (arg.evaluate(ctx)) { return true; } } return false; } ] ] }, '!': [ BooleanType, [BooleanType], function (ctx, ref) { var b = ref[0]; return !b.evaluate(ctx); } ], 'upcase': [ StringType, [StringType], function (ctx, ref) { var s = ref[0]; return s.evaluate(ctx).toUpperCase(); } ], 'downcase': [ StringType, [StringType], function (ctx, ref) { var s = ref[0]; return s.evaluate(ctx).toLowerCase(); } ], 'concat': [ StringType, varargs(StringType), function (ctx, args) { return args.map(function (arg) { return arg.evaluate(ctx); }).join(''); } ] }); module.exports = expressions; },{"../compound_expression":128,"../runtime_error":148,"../types":151,"../values":152,"./array":129,"./assertion":130,"./at":131,"./case":132,"./coalesce":133,"./coercion":134,"./equals":135,"./interpolate":137,"./let":138,"./literal":139,"./match":140,"./step":141,"./var":142}],137:[function(require,module,exports){ 'use strict';// var UnitBezier = require('@mapbox/unitbezier'); var interpolate = require('../../util/interpolate'); var ref = require('../types'); var toString = ref.toString; var NumberType = ref.NumberType; var ref$1 = require("../stops"); var findStopLessThanOrEqualTo = ref$1.findStopLessThanOrEqualTo; var Interpolate = function Interpolate(type , interpolation , input , stops ) { var this$1 = this; this.type = type; this.interpolation = interpolation; this.input = input; this.labels = []; this.outputs = []; for (var i = 0, list = stops; i < list.length; i += 1) { var ref = list[i]; var label = ref[0]; var expression = ref[1]; this$1.labels.push(label); this$1.outputs.push(expression); } }; Interpolate.interpolationFactor = function interpolationFactor (interpolation , input , lower , upper ) { var t = 0; if (interpolation.name === 'exponential') { t = exponentialInterpolation(input, interpolation.base, lower, upper); } else if (interpolation.name === 'linear') { t = exponentialInterpolation(input, 1, lower, upper); } else if (interpolation.name === 'cubic-bezier') { var c = interpolation.controlPoints; var ub = new UnitBezier(c[0], c[1], c[2], c[3]); t = ub.solve(exponentialInterpolation(input, 1, lower, upper)); } return t; }; Interpolate.parse = function parse (args , context ) { var interpolation = args[1]; var input = args[2]; var rest = args.slice(3); if (!Array.isArray(interpolation) || interpolation.length === 0) { return context.error("Expected an interpolation type expression.", 1); } if (interpolation[0] === 'linear') { interpolation = { name: 'linear' }; } else if (interpolation[0] === 'exponential') { var base = interpolation[1]; if (typeof base !== 'number') { return context.error("Exponential interpolation requires a numeric base.", 1, 1); } interpolation = { name: 'exponential', base: base }; } else if (interpolation[0] === 'cubic-bezier') { var controlPoints = interpolation.slice(1); if ( controlPoints.length !== 4 || controlPoints.some(function (t) { return typeof t !== 'number' || t < 0 || t > 1; }) ) { return context.error('Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.', 1); } interpolation = { name: 'cubic-bezier', controlPoints: (controlPoints ) }; } else { return context.error(("Unknown interpolation type " + (String(interpolation[0]))), 1, 0); } if (args.length - 1 < 4) { return context.error(("Expected at least 4 arguments, but found only " + (args.length - 1) + ".")); } if ((args.length - 1) % 2 !== 0) { return context.error("Expected an even number of arguments."); } input = context.parse(input, 2, NumberType); if (!input) { return null; } var stops = []; var outputType = (null ); if (context.expectedType && context.expectedType.kind !== 'value') { outputType = context.expectedType; } for (var i = 0; i < rest.length; i += 2) { var label = rest[i]; var value = rest[i + 1]; var labelKey = i + 3; var valueKey = i + 4; if (typeof label !== 'number') { return context.error('Input/output pairs for "interpolate" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey); } if (stops.length && stops[stops.length - 1][0] >= label) { return context.error('Input/output pairs for "interpolate" expressions must be arranged with input values in strictly ascending order.', labelKey); } var parsed = context.parse(value, valueKey, outputType); if (!parsed) { return null; } outputType = outputType || parsed.type; stops.push([label, parsed]); } if (outputType.kind !== 'number' && outputType.kind !== 'color' && !( outputType.kind === 'array' && outputType.itemType.kind === 'number' && typeof outputType.N === 'number' ) ) { return context.error(("Type " + (toString(outputType)) + " is not interpolatable.")); } return new Interpolate(outputType, interpolation, input, stops); }; Interpolate.prototype.evaluate = function evaluate (ctx ) { var labels = this.labels; var outputs = this.outputs; if (labels.length === 1) { return outputs[0].evaluate(ctx); } var value = ((this.input.evaluate(ctx) ) ); if (value <= labels[0]) { return outputs[0].evaluate(ctx); } var stopCount = labels.length; if (value >= labels[stopCount - 1]) { return outputs[stopCount - 1].evaluate(ctx); } var index = findStopLessThanOrEqualTo(labels, value); var lower = labels[index]; var upper = labels[index + 1]; var t = Interpolate.interpolationFactor(this.interpolation, value, lower, upper); var outputLower = outputs[index].evaluate(ctx); var outputUpper = outputs[index + 1].evaluate(ctx); return (interpolate[this.type.kind.toLowerCase()] )(outputLower, outputUpper, t); }; Interpolate.prototype.eachChild = function eachChild (fn ) { var this$1 = this; fn(this.input); for (var i = 0, list = this$1.outputs; i < list.length; i += 1) { var expression = list[i]; fn(expression); } }; Interpolate.prototype.possibleOutputs = function possibleOutputs () { return (ref = []).concat.apply(ref, this.outputs.map(function (output) { return output.possibleOutputs(); })); var ref; }; /** * Returns a ratio that can be used to interpolate between exponential function * stops. * How it works: Two consecutive stop values define a (scaled and shifted) exponential function `f(x) = a * base^x + b`, where `base` is the user-specified base, * and `a` and `b` are constants affording sufficient degrees of freedom to fit * the function to the given stops. * * Here's a bit of algebra that lets us compute `f(x)` directly from the stop * values without explicitly solving for `a` and `b`: * * First stop value: `f(x0) = y0 = a * base^x0 + b` * Second stop value: `f(x1) = y1 = a * base^x1 + b` * => `y1 - y0 = a(base^x1 - base^x0)` * => `a = (y1 - y0)/(base^x1 - base^x0)` * * Desired value: `f(x) = y = a * base^x + b` * => `f(x) = y0 + a * (base^x - base^x0)` * * From the above, we can replace the `a` in `a * (base^x - base^x0)` and do a * little algebra: * ``` * a * (base^x - base^x0) = (y1 - y0)/(base^x1 - base^x0) * (base^x - base^x0) * = (y1 - y0) * (base^x - base^x0) / (base^x1 - base^x0) * ``` * * If we let `(base^x - base^x0) / (base^x1 base^x0)`, then we have * `f(x) = y0 + (y1 - y0) * ratio`. In other words, `ratio` may be treated as * an interpolation factor between the two stops' output values. * * (Note: a slightly different form for `ratio`, * `(base^(x-x0) - 1) / (base^(x1-x0) - 1) `, is equivalent, but requires fewer * expensive `Math.pow()` operations.) * * @private */ function exponentialInterpolation(input, base, lowerValue, upperValue) { var difference = upperValue - lowerValue; var progress = input - lowerValue; if (difference === 0) { return 0; } else if (base === 1) { return progress / difference; } else { return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1); } } module.exports = Interpolate; },{"../../util/interpolate":163,"../stops":150,"../types":151,"@mapbox/unitbezier":7}],138:[function(require,module,exports){ 'use strict';// var Let = function Let(bindings , result ) { this.type = result.type; this.bindings = [].concat(bindings); this.result = result; }; Let.prototype.evaluate = function evaluate (ctx ) { ctx.pushScope(this.bindings); var result = this.result.evaluate(ctx); ctx.popScope(); return result; }; Let.prototype.eachChild = function eachChild (fn ) { var this$1 = this; for (var i = 0, list = this$1.bindings; i < list.length; i += 1) { var binding = list[i]; fn(binding[1]); } fn(this.result); }; Let.parse = function parse (args , context ) { if (args.length < 4) { return context.error(("Expected at least 3 arguments, but found " + (args.length - 1) + " instead.")); } var bindings = []; for (var i = 1; i < args.length - 1; i += 2) { var name = args[i]; if (typeof name !== 'string') { return context.error(("Expected string, but found " + (typeof name) + " instead."), i); } if (/[^a-zA-Z0-9_]/.test(name)) { return context.error("Variable names must contain only alphanumeric characters or '_'.", i); } var value = context.parse(args[i + 1], i + 1); if (!value) { return null; } bindings.push([name, value]); } var result = context.parse(args[args.length - 1], args.length - 1, undefined, bindings); if (!result) { return null; } return new Let(bindings, result); }; Let.prototype.possibleOutputs = function possibleOutputs () { return this.result.possibleOutputs(); }; module.exports = Let; },{}],139:[function(require,module,exports){ 'use strict';// var ref = require('../values'); var isValue = ref.isValue; var typeOf = ref.typeOf; var Literal = function Literal(type , value ) { this.type = type; this.value = value; }; Literal.parse = function parse (args , context ) { if (args.length !== 2) { return context.error(("'literal' expression requires exactly one argument, but found " + (args.length - 1) + " instead.")); } if (!isValue(args[1])) { return context.error("invalid value"); } var value = (args[1] ); var type = typeOf(value); // special case: infer the item type if possible for zero-length arrays var expected = context.expectedType; if ( type.kind === 'array' && type.N === 0 && expected && expected.kind === 'array' && (typeof expected.N !== 'number' || expected.N === 0) ) { type = expected; } return new Literal(type, value); }; Literal.prototype.evaluate = function evaluate () { return this.value; }; Literal.prototype.eachChild = function eachChild () {}; Literal.prototype.possibleOutputs = function possibleOutputs () { return [this.value]; }; module.exports = Literal; },{"../values":152}],140:[function(require,module,exports){ 'use strict';// var assert = require('assert'); var ref = require('../values'); var typeOf = ref.typeOf; // Map input label values to output expression index var Match = function Match(inputType , outputType , input , cases , outputs , otherwise ) { this.inputType = inputType; this.type = outputType; this.input = input; this.cases = cases; this.outputs = outputs; this.otherwise = otherwise; }; Match.parse = function parse (args , context ) { if (args.length < 5) { return context.error(("Expected at least 4 arguments, but found only " + (args.length - 1) + ".")); } if (args.length % 2 !== 1) { return context.error("Expected an even number of arguments."); } var inputType; var outputType; if (context.expectedType && context.expectedType.kind !== 'value') { outputType = context.expectedType; } var cases = {}; var outputs = []; for (var i = 2; i < args.length - 1; i += 2) { var labels = args[i]; var value = args[i + 1]; if (!Array.isArray(labels)) { labels = [labels]; } var labelContext = context.concat(i); if (labels.length === 0) { return labelContext.error('Expected at least one branch label.'); } for (var i$1 = 0, list = labels; i$1 < list.length; i$1 += 1) { var label = list[i$1]; if (typeof label !== 'number' && typeof label !== 'string') { return labelContext.error("Branch labels must be numbers or strings."); } else if (typeof label === 'number' && Math.abs(label) > Number.MAX_SAFE_INTEGER) { return labelContext.error(("Branch labels must be integers no larger than " + (Number.MAX_SAFE_INTEGER) + ".")); } else if (typeof label === 'number' && Math.floor(label) !== label) { return labelContext.error("Numeric branch labels must be integer values."); } else if (!inputType) { inputType = typeOf(label); } else if (labelContext.checkSubtype(inputType, typeOf(label))) { return null; } if (typeof cases[String(label)] !== 'undefined') { return labelContext.error('Branch labels must be unique.'); } cases[String(label)] = outputs.length; } var result = context.parse(value, i, outputType); if (!result) { return null; } outputType = outputType || result.type; outputs.push(result); } var input = context.parse(args[1], 1, inputType); if (!input) { return null; } var otherwise = context.parse(args[args.length - 1], args.length - 1, outputType); if (!otherwise) { return null; } assert(inputType && outputType); return new Match((inputType ), (outputType ), input, cases, outputs, otherwise); }; Match.prototype.evaluate = function evaluate (ctx ) { var input = (this.input.evaluate(ctx) ); return (this.outputs[this.cases[input]] || this.otherwise).evaluate(ctx); }; Match.prototype.eachChild = function eachChild (fn ) { fn(this.input); this.outputs.forEach(fn); fn(this.otherwise); }; Match.prototype.possibleOutputs = function possibleOutputs () { return (ref = []) .concat.apply(ref, this.outputs.map(function (out) { return out.possibleOutputs(); })) .concat(this.otherwise.possibleOutputs()); var ref; }; module.exports = Match; },{"../values":152,"assert":13}],141:[function(require,module,exports){ 'use strict';// var ref = require('../types'); var NumberType = ref.NumberType; var ref$1 = require("../stops"); var findStopLessThanOrEqualTo = ref$1.findStopLessThanOrEqualTo; var Step = function Step(type , input , stops ) { var this$1 = this; this.type = type; this.input = input; this.labels = []; this.outputs = []; for (var i = 0, list = stops; i < list.length; i += 1) { var ref = list[i]; var label = ref[0]; var expression = ref[1]; this$1.labels.push(label); this$1.outputs.push(expression); } }; Step.parse = function parse (args , context ) { var input = args[1]; var rest = args.slice(2); if (args.length - 1 < 4) { return context.error(("Expected at least 4 arguments, but found only " + (args.length - 1) + ".")); } if ((args.length - 1) % 2 !== 0) { return context.error("Expected an even number of arguments."); } input = context.parse(input, 1, NumberType); if (!input) { return null; } var stops = []; var outputType = (null ); if (context.expectedType && context.expectedType.kind !== 'value') { outputType = context.expectedType; } rest.unshift(-Infinity); for (var i = 0; i < rest.length; i += 2) { var label = rest[i]; var value = rest[i + 1]; var labelKey = i + 1; var valueKey = i + 2; if (typeof label !== 'number') { return context.error('Input/output pairs for "step" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey); } if (stops.length && stops[stops.length - 1][0] >= label) { return context.error('Input/output pairs for "step" expressions must be arranged with input values in strictly ascending order.', labelKey); } var parsed = context.parse(value, valueKey, outputType); if (!parsed) { return null; } outputType = outputType || parsed.type; stops.push([label, parsed]); } return new Step(outputType, input, stops); }; Step.prototype.evaluate = function evaluate (ctx ) { var labels = this.labels; var outputs = this.outputs; if (labels.length === 1) { return outputs[0].evaluate(ctx); } var value = ((this.input.evaluate(ctx) ) ); if (value <= labels[0]) { return outputs[0].evaluate(ctx); } var stopCount = labels.length; if (value >= labels[stopCount - 1]) { return outputs[stopCount - 1].evaluate(ctx); } var index = findStopLessThanOrEqualTo(labels, value); return outputs[index].evaluate(ctx); }; Step.prototype.eachChild = function eachChild (fn ) { var this$1 = this; fn(this.input); for (var i = 0, list = this$1.outputs; i < list.length; i += 1) { var expression = list[i]; fn(expression); } }; Step.prototype.possibleOutputs = function possibleOutputs () { return (ref = []).concat.apply(ref, this.outputs.map(function (output) { return output.possibleOutputs(); })); var ref; }; module.exports = Step; },{"../stops":150,"../types":151}],142:[function(require,module,exports){ 'use strict';// var Var = function Var(name , type ) { this.type = type; this.name = name; }; Var.parse = function parse (args , context ) { if (args.length !== 2 || typeof args[1] !== 'string') { return context.error("'var' expression requires exactly one string literal argument."); } var name = args[1]; if (!context.scope.has(name)) { return context.error(("Unknown variable \"" + name + "\". Make sure \"" + name + "\" has been bound in an enclosing \"let\" expression before using it."), 1); } return new Var(name, context.scope.get(name).type); }; Var.prototype.evaluate = function evaluate (ctx ) { return ctx.scope.get(this.name).evaluate(ctx); }; Var.prototype.eachChild = function eachChild () {}; Var.prototype.possibleOutputs = function possibleOutputs () { return [undefined]; }; module.exports = Var; },{}],143:[function(require,module,exports){ 'use strict';// var assert = require('assert'); var Scope = require('./scope'); var ref = require('./values'); var Color = ref.Color; var geometryTypes = ['Unknown', 'Point', 'LineString', 'Polygon']; var EvaluationContext = function EvaluationContext() { this.scope = new Scope(); this._parseColorCache = {}; }; EvaluationContext.prototype.id = function id () { return this.feature && 'id' in this.feature ? this.feature.id : null; }; EvaluationContext.prototype.geometryType = function geometryType () { return this.feature ? typeof this.feature.type === 'number' ? geometryTypes[this.feature.type] : this.feature.type : null; }; EvaluationContext.prototype.properties = function properties () { return this.feature && this.feature.properties || {}; }; EvaluationContext.prototype.pushScope = function pushScope (bindings ) { this.scope = this.scope.concat(bindings); }; EvaluationContext.prototype.popScope = function popScope () { assert(this.scope.parent); this.scope = (this.scope.parent ); }; EvaluationContext.prototype.parseColor = function parseColor (input ) { var cached = this._parseColorCache[input]; if (!cached) { cached = this._parseColorCache[input] = Color.parse(input); } return cached; }; module.exports = EvaluationContext; },{"./scope":149,"./values":152,"assert":13}],144:[function(require,module,exports){ 'use strict';// var assert = require('assert'); var extend = require('../util/extend'); var ParsingError = require('./parsing_error'); var ParsingContext = require('./parsing_context'); var EvaluationContext = require('./evaluation_context'); var ref = require('./compound_expression'); var CompoundExpression = ref.CompoundExpression; var Step = require('./definitions/step'); var Interpolate = require('./definitions/interpolate'); var Coalesce = require('./definitions/coalesce'); var Let = require('./definitions/let'); var definitions = require('./definitions'); var isConstant = require('./is_constant'); var RuntimeError = require('./runtime_error'); var ref$1 = require('../util/result'); var success = ref$1.success; var error = ref$1.error; var StyleExpression = function StyleExpression(expression ) { this.expression = expression; }; StyleExpression.prototype.evaluate = function evaluate (globals , feature ) { if (!this._evaluator) { this._evaluator = new EvaluationContext(); } this._evaluator.globals = globals; this._evaluator.feature = feature; return this.expression.evaluate(this._evaluator); }; var StyleExpressionWithErrorHandling = (function (StyleExpression) { function StyleExpressionWithErrorHandling(expression , propertySpec ) { StyleExpression.call(this, expression); this._warningHistory = {}; this._defaultValue = getDefaultValue(propertySpec); if (propertySpec.type === 'enum') { this._enumValues = propertySpec.values; } } if ( StyleExpression ) StyleExpressionWithErrorHandling.__proto__ = StyleExpression; StyleExpressionWithErrorHandling.prototype = Object.create( StyleExpression && StyleExpression.prototype ); StyleExpressionWithErrorHandling.prototype.constructor = StyleExpressionWithErrorHandling; StyleExpressionWithErrorHandling.prototype.evaluate = function evaluate (globals , feature ) { if (!this._evaluator) { this._evaluator = new EvaluationContext(); } this._evaluator.globals = globals; this._evaluator.feature = feature; try { var val = this.expression.evaluate(this._evaluator); if (val === null || val === undefined) { return this._defaultValue; } if (this._enumValues && !(val in this._enumValues)) { throw new RuntimeError(("Expected value to be one of " + (Object.keys(this._enumValues).map(function (v) { return JSON.stringify(v); }).join(', ')) + ", but found " + (JSON.stringify(val)) + " instead.")); } return val; } catch (e) { if (!this._warningHistory[e.message]) { this._warningHistory[e.message] = true; if (typeof console !== 'undefined') { console.warn(e.message); } } return this._defaultValue; } }; return StyleExpressionWithErrorHandling; }(StyleExpression)); function isExpression(expression ) { return Array.isArray(expression) && expression.length > 0 && typeof expression[0] === 'string' && expression[0] in definitions; } /** * Parse and typecheck the given style spec JSON expression. If * options.defaultValue is provided, then the resulting StyleExpression's * `evaluate()` method will handle errors by logging a warning (once per * message) and returning the default value. Otherwise, it will throw * evaluation errors. * * @private */ function createExpression(expression , propertySpec , options) { if ( options === void 0 ) options = {}; var parser = new ParsingContext(definitions, [], getExpectedType(propertySpec)); var parsed = parser.parse(expression); if (!parsed) { assert(parser.errors.length > 0); return error(parser.errors); } if (options.handleErrors === false) { return success(new StyleExpression(parsed)); } else { return success(new StyleExpressionWithErrorHandling(parsed, propertySpec)); } } var ZoomConstantExpression = function ZoomConstantExpression(kind , expression ) { this.kind = kind; this._styleExpression = expression; }; ZoomConstantExpression.prototype.evaluate = function evaluate (globals , feature ) { return this._styleExpression.evaluate(globals, feature); }; var ZoomDependentExpression = function ZoomDependentExpression(kind , expression , zoomCurve ) { this.kind = kind; this.zoomStops = zoomCurve.labels; this._styleExpression = expression; if (zoomCurve instanceof Interpolate) { this._interpolationType = zoomCurve.interpolation; } }; ZoomDependentExpression.prototype.evaluate = function evaluate (globals , feature ) { return this._styleExpression.evaluate(globals, feature); }; ZoomDependentExpression.prototype.interpolationFactor = function interpolationFactor (input , lower , upper ) { if (this._interpolationType) { return Interpolate.interpolationFactor(this._interpolationType, input, lower, upper); } else { return 0; } }; function createPropertyExpression(expression , propertySpec , options) { if ( options === void 0 ) options = {}; expression = createExpression(expression, propertySpec, options); if (expression.result === 'error') { return expression; } var parsed = expression.value.expression; var isFeatureConstant = isConstant.isFeatureConstant(parsed); if (!isFeatureConstant && !propertySpec['property-function']) { return error([new ParsingError('', 'property expressions not supported')]); } var isZoomConstant = isConstant.isGlobalPropertyConstant(parsed, ['zoom']); if (!isZoomConstant && propertySpec['zoom-function'] === false) { return error([new ParsingError('', 'zoom expressions not supported')]); } var zoomCurve = findZoomCurve(parsed); if (!zoomCurve && !isZoomConstant) { return error([new ParsingError('', '"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.')]); } else if (zoomCurve instanceof ParsingError) { return error([zoomCurve]); } else if (zoomCurve instanceof Interpolate && propertySpec['function'] === 'piecewise-constant') { return error([new ParsingError('', '"interpolate" expressions cannot be used with this property')]); } if (!zoomCurve) { return success(isFeatureConstant ? (new ZoomConstantExpression('constant', expression.value) ) : (new ZoomConstantExpression('source', expression.value) )); } return success(isFeatureConstant ? (new ZoomDependentExpression('camera', expression.value, zoomCurve) ) : (new ZoomDependentExpression('composite', expression.value, zoomCurve) )); } var ref$2 = require('../function'); var isFunction = ref$2.isFunction; var createFunction = ref$2.createFunction; var ref$3 = require('./values'); var Color = ref$3.Color; // serialization wrapper for old-style stop functions normalized to the // expression interface var StylePropertyFunction = function StylePropertyFunction(parameters , specification ) { this._parameters = parameters; this._specification = specification; extend(this, createFunction(this._parameters, this._specification)); }; StylePropertyFunction.deserialize = function deserialize (serialized ) { return ((new StylePropertyFunction(serialized._parameters, serialized._specification)) ); }; StylePropertyFunction.serialize = function serialize (input ) { return { _parameters: input._parameters, _specification: input._specification }; }; function normalizePropertyExpression (value , specification ) { if (isFunction(value)) { return (new StylePropertyFunction(value, specification) ); } else if (isExpression(value)) { var expression = createPropertyExpression(value, specification); if (expression.result === 'error') { // this should have been caught in validation throw new Error(expression.value.map(function (err) { return ((err.key) + ": " + (err.message)); }).join(', ')); } return expression.value; } else { var constant = value; if (typeof value === 'string' && specification.type === 'color') { constant = Color.parse(value); } return { kind: 'constant', evaluate: function () { return constant; } }; } } module.exports = { StyleExpression: StyleExpression, StyleExpressionWithErrorHandling: StyleExpressionWithErrorHandling, isExpression: isExpression, createExpression: createExpression, createPropertyExpression: createPropertyExpression, normalizePropertyExpression: normalizePropertyExpression, ZoomConstantExpression: ZoomConstantExpression, ZoomDependentExpression: ZoomDependentExpression, StylePropertyFunction: StylePropertyFunction }; // Zoom-dependent expressions may only use ["zoom"] as the input to a top-level "step" or "interpolate" // expression (collectively referred to as a "curve"). The curve may be wrapped in one or more "let" or // "coalesce" expressions. function findZoomCurve(expression ) { var result = null; if (expression instanceof Let) { result = findZoomCurve(expression.result); } else if (expression instanceof Coalesce) { for (var i = 0, list = expression.args; i < list.length; i += 1) { var arg = list[i]; result = findZoomCurve(arg); if (result) { break; } } } else if ((expression instanceof Step || expression instanceof Interpolate) && expression.input instanceof CompoundExpression && expression.input.name === 'zoom') { result = expression; } if (result instanceof ParsingError) { return result; } expression.eachChild(function (child) { var childResult = findZoomCurve(child); if (childResult instanceof ParsingError) { result = childResult; } else if (!result && childResult) { result = new ParsingError('', '"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.'); } else if (result && childResult && result !== childResult) { result = new ParsingError('', 'Only one zoom-based "step" or "interpolate" subexpression may be used in an expression.'); } }); return result; } var ref$4 = require('./types'); var ColorType = ref$4.ColorType; var StringType = ref$4.StringType; var NumberType = ref$4.NumberType; var BooleanType = ref$4.BooleanType; var ValueType = ref$4.ValueType; var array = ref$4.array; function getExpectedType(spec ) { var types = { color: ColorType, string: StringType, number: NumberType, enum: StringType, boolean: BooleanType }; if (spec.type === 'array') { return array(types[spec.value] || ValueType, spec.length); } return types[spec.type] || null; } function getDefaultValue(spec ) { if (spec.type === 'color' && isFunction(spec.default)) { // Special case for heatmap-color: it uses the 'default:' to define a // default color ramp, but createExpression expects a simple value to fall // back to in case of runtime errors return new Color(0, 0, 0, 0); } else if (spec.type === 'color') { return Color.parse(spec.default) || null; } else if (spec.default === undefined) { return null; } else { return spec.default; } } },{"../function":154,"../util/extend":161,"../util/result":165,"./compound_expression":128,"./definitions":136,"./definitions/coalesce":133,"./definitions/interpolate":137,"./definitions/let":138,"./definitions/step":141,"./evaluation_context":143,"./is_constant":145,"./parsing_context":146,"./parsing_error":147,"./runtime_error":148,"./types":151,"./values":152,"assert":13}],145:[function(require,module,exports){ 'use strict';// var ref = require('./compound_expression'); var CompoundExpression = ref.CompoundExpression; function isFeatureConstant(e ) { if (e instanceof CompoundExpression) { if (e.name === 'get' && e.args.length === 1) { return false; } else if (e.name === 'has' && e.args.length === 1) { return false; } else if ( e.name === 'properties' || e.name === 'geometry-type' || e.name === 'id' ) { return false; } else if (/^filter-/.test(e.name)) { return false; } } var result = true; e.eachChild(function (arg) { if (result && !isFeatureConstant(arg)) { result = false; } }); return result; } function isGlobalPropertyConstant(e , properties ) { if (e instanceof CompoundExpression && properties.indexOf(e.name) >= 0) { return false; } var result = true; e.eachChild(function (arg) { if (result && !isGlobalPropertyConstant(arg, properties)) { result = false; } }); return result; } module.exports = { isFeatureConstant: isFeatureConstant, isGlobalPropertyConstant: isGlobalPropertyConstant, }; },{"./compound_expression":128}],146:[function(require,module,exports){ 'use strict';// var Scope = require('./scope'); var ref = require('./types'); var checkSubtype = ref.checkSubtype; var ParsingError = require('./parsing_error'); var Literal = require('./definitions/literal'); var Assertion = require('./definitions/assertion'); var ArrayAssertion = require('./definitions/array'); var Coercion = require('./definitions/coercion'); /** * State associated parsing at a given point in an expression tree. * @private */ var ParsingContext = function ParsingContext( registry , path, expectedType , scope, errors ) { if ( path === void 0 ) path = []; if ( scope === void 0 ) scope = new Scope(); if ( errors === void 0 ) errors = []; this.registry = registry; this.path = path; this.key = path.map(function (part) { return ("[" + part + "]"); }).join(''); this.scope = scope; this.errors = errors; this.expectedType = expectedType; }; /** * @param expr the JSON expression to parse * @param index the optional argument index if this expression is an argument of a parent expression that's being parsed * @param options * @param options.omitTypeAnnotations set true to omit inferred type annotations. Caller beware: with this option set, the parsed expression's type will NOT satisfy `expectedType` if it would normally be wrapped in an inferred annotation. * @private */ ParsingContext.prototype.parse = function parse ( expr , index , expectedType , bindings , options ) { if ( options === void 0 ) options = {}; var context = this; if (index) { context = context.concat(index, expectedType, bindings); } if (expr === null || typeof expr === 'string' || typeof expr === 'boolean' || typeof expr === 'number') { expr = ['literal', expr]; } if (Array.isArray(expr)) { if (expr.length === 0) { return context.error("Expected an array with at least one element. If you wanted a literal array, use [\"literal\", []]."); } var op = expr[0]; if (typeof op !== 'string') { context.error(("Expression name must be a string, but found " + (typeof op) + " instead. If you wanted a literal array, use [\"literal\", [...]]."), 0); return null; } var Expr = context.registry[op]; if (Expr) { var parsed = Expr.parse(expr, context); if (!parsed) { return null; } if (context.expectedType) { var expected = context.expectedType; var actual = parsed.type; // When we expect a number, string, boolean, or array but // have a Value, we can wrap it in a refining assertion. // When we expect a Color but have a String or Value, we // can wrap it in "to-color" coercion. // Otherwise, we do static type-checking. if ((expected.kind === 'string' || expected.kind === 'number' || expected.kind === 'boolean') && actual.kind === 'value') { if (!options.omitTypeAnnotations) { parsed = new Assertion(expected, [parsed]); } } else if (expected.kind === 'array' && actual.kind === 'value') { if (!options.omitTypeAnnotations) { parsed = new ArrayAssertion(expected, parsed); } } else if (expected.kind === 'color' && (actual.kind === 'value' || actual.kind === 'string')) { if (!options.omitTypeAnnotations) { parsed = new Coercion(expected, [parsed]); } } else if (context.checkSubtype(context.expectedType, parsed.type)) { return null; } } // If an expression's arguments are all literals, we can evaluate // it immediately and replace it with a literal value in the // parsed/compiled result. if (!(parsed instanceof Literal) && isConstant(parsed)) { var ec = new (require('./evaluation_context'))(); try { parsed = new Literal(parsed.type, parsed.evaluate(ec)); } catch (e) { context.error(e.message); return null; } } return parsed; } return context.error(("Unknown expression \"" + op + "\". If you wanted a literal array, use [\"literal\", [...]]."), 0); } else if (typeof expr === 'undefined') { return context.error("'undefined' value invalid. Use null instead."); } else if (typeof expr === 'object') { return context.error("Bare objects invalid. Use [\"literal\", {...}] instead."); } else { return context.error(("Expected an array, but found " + (typeof expr) + " instead.")); } }; /** * Returns a copy of this context suitable for parsing the subexpression at * index `index`, optionally appending to 'let' binding map. * * Note that `errors` property, intended for collecting errors while * parsing, is copied by reference rather than cloned. * @private */ ParsingContext.prototype.concat = function concat (index , expectedType , bindings ) { var path = typeof index === 'number' ? this.path.concat(index) : this.path; var scope = bindings ? this.scope.concat(bindings) : this.scope; return new ParsingContext( this.registry, path, expectedType || null, scope, this.errors ); }; /** * Push a parsing (or type checking) error into the `this.errors` * @param error The message * @param keys Optionally specify the source of the error at a child * of the current expression at `this.key`. * @private */ ParsingContext.prototype.error = function error (error$1 ) { var keys = [], len = arguments.length - 1; while ( len-- > 0 ) keys[ len ] = arguments[ len + 1 ]; var key = "" + (this.key) + (keys.map(function (k) { return ("[" + k + "]"); }).join('')); this.errors.push(new ParsingError(key, error$1)); }; /** * Returns null if `t` is a subtype of `expected`; otherwise returns an * error message and also pushes it to `this.errors`. */ ParsingContext.prototype.checkSubtype = function checkSubtype$1 (expected , t ) { var error = checkSubtype(expected, t); if (error) { this.error(error); } return error; }; module.exports = ParsingContext; function isConstant(expression ) { // requires within function body to workaround circular dependency var ref = require('./compound_expression'); var CompoundExpression = ref.CompoundExpression; var ref$1 = require('./is_constant'); var isGlobalPropertyConstant = ref$1.isGlobalPropertyConstant; var isFeatureConstant = ref$1.isFeatureConstant; var Var = require('./definitions/var'); if (expression instanceof Var) { return false; } else if (expression instanceof CompoundExpression && expression.name === 'error') { return false; } var literalArgs = true; expression.eachChild(function (arg) { if (!(arg instanceof Literal)) { literalArgs = false; } }); if (!literalArgs) { return false; } return isFeatureConstant(expression) && isGlobalPropertyConstant(expression, ['zoom', 'heatmap-density']); } },{"./compound_expression":128,"./definitions/array":129,"./definitions/assertion":130,"./definitions/coercion":134,"./definitions/literal":139,"./definitions/var":142,"./evaluation_context":143,"./is_constant":145,"./parsing_error":147,"./scope":149,"./types":151}],147:[function(require,module,exports){ 'use strict';// var ParsingError = (function (Error) { function ParsingError(key , message ) { Error.call(this, message); this.message = message; this.key = key; } if ( Error ) ParsingError.__proto__ = Error; ParsingError.prototype = Object.create( Error && Error.prototype ); ParsingError.prototype.constructor = ParsingError; return ParsingError; }(Error)); module.exports = ParsingError; },{}],148:[function(require,module,exports){ 'use strict';// var RuntimeError = function RuntimeError(message ) { this.name = 'ExpressionEvaluationError'; this.message = message; }; RuntimeError.prototype.toJSON = function toJSON () { return this.message; }; module.exports = RuntimeError; },{}],149:[function(require,module,exports){ 'use strict';// /** * Tracks `let` bindings during expression parsing. * @private */ var Scope = function Scope(parent , bindings) { var this$1 = this; if ( bindings === void 0 ) bindings = []; this.parent = parent; this.bindings = {}; for (var i = 0, list = bindings; i < list.length; i += 1) { var ref = list[i]; var name = ref[0]; var expression = ref[1]; this$1.bindings[name] = expression; } }; Scope.prototype.concat = function concat (bindings ) { return new Scope(this, bindings); }; Scope.prototype.get = function get (name ) { if (this.bindings[name]) { return this.bindings[name]; } if (this.parent) { return this.parent.get(name); } throw new Error((name + " not found in scope.")); }; Scope.prototype.has = function has (name ) { if (this.bindings[name]) { return true; } return this.parent ? this.parent.has(name) : false; }; module.exports = Scope; },{}],150:[function(require,module,exports){ 'use strict';// var RuntimeError = require('./runtime_error'); /** * Returns the index of the last stop <= input, or 0 if it doesn't exist. * @private */ function findStopLessThanOrEqualTo(stops , input ) { var n = stops.length; var lowerIndex = 0; var upperIndex = n - 1; var currentIndex = 0; var currentValue, upperValue; while (lowerIndex <= upperIndex) { currentIndex = Math.floor((lowerIndex + upperIndex) / 2); currentValue = stops[currentIndex]; upperValue = stops[currentIndex + 1]; if (input === currentValue || input > currentValue && input < upperValue) { // Search complete return currentIndex; } else if (currentValue < input) { lowerIndex = currentIndex + 1; } else if (currentValue > input) { upperIndex = currentIndex - 1; } else { throw new RuntimeError('Input is not a number.'); } } return Math.max(currentIndex - 1, 0); } module.exports = {findStopLessThanOrEqualTo: findStopLessThanOrEqualTo}; },{"./runtime_error":148}],151:[function(require,module,exports){ 'use strict';// var NullType = { kind: 'null' }; var NumberType = { kind: 'number' }; var StringType = { kind: 'string' }; var BooleanType = { kind: 'boolean' }; var ColorType = { kind: 'color' }; var ObjectType = { kind: 'object' }; var ValueType = { kind: 'value' }; var ErrorType = { kind: 'error' }; function array(itemType , N ) { return { kind: 'array', itemType: itemType, N: N }; } function toString(type ) { if (type.kind === 'array') { var itemType = toString(type.itemType); return typeof type.N === 'number' ? ("array<" + itemType + ", " + (type.N) + ">") : type.itemType.kind === 'value' ? 'array' : ("array<" + itemType + ">"); } else { return type.kind; } } var valueMemberTypes = [ NullType, NumberType, StringType, BooleanType, ColorType, ObjectType, array(ValueType) ]; /** * Returns null if `t` is a subtype of `expected`; otherwise returns an * error message. * @private */ function checkSubtype(expected , t ) { if (t.kind === 'error') { // Error is a subtype of every type return null; } else if (expected.kind === 'array') { if (t.kind === 'array' && !checkSubtype(expected.itemType, t.itemType) && (typeof expected.N !== 'number' || expected.N === t.N)) { return null; } } else if (expected.kind === t.kind) { return null; } else if (expected.kind === 'value') { for (var i = 0, list = valueMemberTypes; i < list.length; i += 1) { var memberType = list[i]; if (!checkSubtype(memberType, t)) { return null; } } } return ("Expected " + (toString(expected)) + " but found " + (toString(t)) + " instead."); } module.exports = { NullType: NullType, NumberType: NumberType, StringType: StringType, BooleanType: BooleanType, ColorType: ColorType, ObjectType: ObjectType, ValueType: ValueType, array: array, ErrorType: ErrorType, toString: toString, checkSubtype: checkSubtype }; },{}],152:[function(require,module,exports){ 'use strict';// var assert = require('assert'); var Color = require('../util/color'); var ref = require('./types'); var NullType = ref.NullType; var NumberType = ref.NumberType; var StringType = ref.StringType; var BooleanType = ref.BooleanType; var ColorType = ref.ColorType; var ObjectType = ref.ObjectType; var ValueType = ref.ValueType; var array = ref.array; function validateRGBA(r , g , b , a ) { if (!( typeof r === 'number' && r >= 0 && r <= 255 && typeof g === 'number' && g >= 0 && g <= 255 && typeof b === 'number' && b >= 0 && b <= 255 )) { var value = typeof a === 'number' ? [r, g, b, a] : [r, g, b]; return ("Invalid rgba value [" + (value.join(', ')) + "]: 'r', 'g', and 'b' must be between 0 and 255."); } if (!( typeof a === 'undefined' || (typeof a === 'number' && a >= 0 && a <= 1) )) { return ("Invalid rgba value [" + ([r, g, b, a].join(', ')) + "]: 'a' must be between 0 and 1."); } return null; } function isValue(mixed ) { if (mixed === null) { return true; } else if (typeof mixed === 'string') { return true; } else if (typeof mixed === 'boolean') { return true; } else if (typeof mixed === 'number') { return true; } else if (mixed instanceof Color) { return true; } else if (Array.isArray(mixed)) { for (var i = 0, list = mixed; i < list.length; i += 1) { var item = list[i]; if (!isValue(item)) { return false; } } return true; } else if (typeof mixed === 'object') { for (var key in mixed) { if (!isValue(mixed[key])) { return false; } } return true; } else { return false; } } function typeOf(value ) { if (value === null) { return NullType; } else if (typeof value === 'string') { return StringType; } else if (typeof value === 'boolean') { return BooleanType; } else if (typeof value === 'number') { return NumberType; } else if (value instanceof Color) { return ColorType; } else if (Array.isArray(value)) { var length = value.length; var itemType ; for (var i = 0, list = value; i < list.length; i += 1) { var item = list[i]; var t = typeOf(item); if (!itemType) { itemType = t; } else if (itemType === t) { continue; } else { itemType = ValueType; break; } } return array(itemType || ValueType, length); } else { assert(typeof value === 'object'); return ObjectType; } } module.exports = { Color: Color, validateRGBA: validateRGBA, isValue: isValue, typeOf: typeOf }; },{"../util/color":158,"./types":151,"assert":13}],153:[function(require,module,exports){ 'use strict';// var ref = require('../expression'); var createExpression = ref.createExpression; module.exports = createFilter; module.exports.isExpressionFilter = isExpressionFilter; function isExpressionFilter(filter) { if (!Array.isArray(filter) || filter.length === 0) { return false; } switch (filter[0]) { case 'has': return filter.length >= 2 && filter[1] !== '$id' && filter[1] !== '$type'; case 'in': case '!in': case '!has': case 'none': return false; case '==': case '!=': case '>': case '>=': case '<': case '<=': return filter.length === 3 && (Array.isArray(filter[1]) || Array.isArray(filter[2])); case 'any': case 'all': for (var i = 0, list = filter.slice(1); i < list.length; i += 1) { var f = list[i]; if (!isExpressionFilter(f) && typeof f !== 'boolean') { return false; } } return true; default: return true; } } var filterSpec = { 'type': 'boolean', 'default': false, 'function': true, 'property-function': true, 'zoom-function': true }; /** * Given a filter expressed as nested arrays, return a new function * that evaluates whether a given feature (with a .properties or .tags property) * passes its test. * * @private * @param {Array} filter mapbox gl filter * @returns {Function} filter-evaluating function */ function createFilter(filter ) { if (!filter) { return function () { return true; }; } if (!isExpressionFilter(filter)) { filter = convertFilter(filter); } var compiled = createExpression(filter, filterSpec); if (compiled.result === 'error') { throw new Error(compiled.value.map(function (err) { return ((err.key) + ": " + (err.message)); }).join(', ')); } else { return function (globalProperties , feature ) { return compiled.value.evaluate(globalProperties, feature); }; } } // Comparison function to sort numbers and strings function compare(a, b) { return a < b ? -1 : a > b ? 1 : 0; } function convertFilter(filter ) { if (!filter) { return true; } var op = filter[0]; if (filter.length <= 1) { return (op !== 'any'); } var converted = op === '==' ? convertComparisonOp(filter[1], filter[2], '==') : op === '!=' ? convertNegation(convertComparisonOp(filter[1], filter[2], '==')) : op === '<' || op === '>' || op === '<=' || op === '>=' ? convertComparisonOp(filter[1], filter[2], op) : op === 'any' ? convertDisjunctionOp(filter.slice(1)) : op === 'all' ? ['all'].concat(filter.slice(1).map(convertFilter)) : op === 'none' ? ['all'].concat(filter.slice(1).map(convertFilter).map(convertNegation)) : op === 'in' ? convertInOp(filter[1], filter.slice(2)) : op === '!in' ? convertNegation(convertInOp(filter[1], filter.slice(2))) : op === 'has' ? convertHasOp(filter[1]) : op === '!has' ? convertNegation(convertHasOp(filter[1])) : true; return converted; } function convertComparisonOp(property , value , op ) { switch (property) { case '$type': return [("filter-type-" + op), value]; case '$id': return [("filter-id-" + op), value]; default: return [("filter-" + op), property, value]; } } function convertDisjunctionOp(filters ) { return ['any'].concat(filters.map(convertFilter)); } function convertInOp(property , values ) { if (values.length === 0) { return false; } switch (property) { case '$type': return ["filter-type-in", ['literal', values]]; case '$id': return ["filter-id-in", ['literal', values]]; default: if (values.length > 200 && !values.some(function (v) { return typeof v !== typeof values[0]; })) { return ['filter-in-large', property, ['literal', values.sort(compare)]]; } else { return ['filter-in-small', property, ['literal', values]]; } } } function convertHasOp(property ) { switch (property) { case '$type': return true; case '$id': return ["filter-has-id"]; default: return ["filter-has", property]; } } function convertNegation(filter ) { return ['!', filter]; } },{"../expression":144}],154:[function(require,module,exports){ 'use strict'; var colorSpaces = require('../util/color_spaces'); var Color = require('../util/color'); var extend = require('../util/extend'); var getType = require('../util/get_type'); var interpolate = require('../util/interpolate'); var Interpolate = require('../expression/definitions/interpolate'); function isFunction(value) { return typeof value === 'object' && value !== null && !Array.isArray(value); } function identityFunction(x) { return x; } function createFunction(parameters, propertySpec) { var isColor = propertySpec.type === 'color'; var zoomAndFeatureDependent = parameters.stops && typeof parameters.stops[0][0] === 'object'; var featureDependent = zoomAndFeatureDependent || parameters.property !== undefined; var zoomDependent = zoomAndFeatureDependent || !featureDependent; var type = parameters.type || (propertySpec.function === 'interpolated' ? 'exponential' : 'interval'); if (isColor) { parameters = extend({}, parameters); if (parameters.stops) { parameters.stops = parameters.stops.map(function (stop) { return [stop[0], Color.parse(stop[1])]; }); } if (parameters.default) { parameters.default = Color.parse(parameters.default); } else { parameters.default = Color.parse(propertySpec.default); } } if (parameters.colorSpace && parameters.colorSpace !== 'rgb' && !colorSpaces[parameters.colorSpace]) { throw new Error(("Unknown color space: " + (parameters.colorSpace))); } var innerFun; var hashedStops; var categoricalKeyType; if (type === 'exponential') { innerFun = evaluateExponentialFunction; } else if (type === 'interval') { innerFun = evaluateIntervalFunction; } else if (type === 'categorical') { innerFun = evaluateCategoricalFunction; // For categorical functions, generate an Object as a hashmap of the stops for fast searching hashedStops = Object.create(null); for (var i = 0, list = parameters.stops; i < list.length; i += 1) { var stop = list[i]; hashedStops[stop[0]] = stop[1]; } // Infer key type based on first stop key-- used to encforce strict type checking later categoricalKeyType = typeof parameters.stops[0][0]; } else if (type === 'identity') { innerFun = evaluateIdentityFunction; } else { throw new Error(("Unknown function type \"" + type + "\"")); } if (zoomAndFeatureDependent) { var featureFunctions = {}; var zoomStops = []; for (var s = 0; s < parameters.stops.length; s++) { var stop$1 = parameters.stops[s]; var zoom = stop$1[0].zoom; if (featureFunctions[zoom] === undefined) { featureFunctions[zoom] = { zoom: zoom, type: parameters.type, property: parameters.property, default: parameters.default, stops: [] }; zoomStops.push(zoom); } featureFunctions[zoom].stops.push([stop$1[0].value, stop$1[1]]); } var featureFunctionStops = []; for (var i$1 = 0, list$1 = zoomStops; i$1 < list$1.length; i$1 += 1) { var z = list$1[i$1]; featureFunctionStops.push([featureFunctions[z].zoom, createFunction(featureFunctions[z], propertySpec)]); } return { kind: 'composite', interpolationFactor: Interpolate.interpolationFactor.bind(undefined, {name: 'linear'}), zoomStops: featureFunctionStops.map(function (s) { return s[0]; }), evaluate: function evaluate(ref, properties) { var zoom = ref.zoom; return evaluateExponentialFunction({ stops: featureFunctionStops, base: parameters.base }, propertySpec, zoom).evaluate(zoom, properties); } }; } else if (zoomDependent) { return { kind: 'camera', interpolationFactor: type === 'exponential' ? Interpolate.interpolationFactor.bind(undefined, {name: 'exponential', base: parameters.base !== undefined ? parameters.base : 1}) : function () { return 0; }, zoomStops: parameters.stops.map(function (s) { return s[0]; }), evaluate: function (ref) { var zoom = ref.zoom; return innerFun(parameters, propertySpec, zoom, hashedStops, categoricalKeyType); } }; } else { return { kind: 'source', evaluate: function evaluate(_, feature) { var value = feature && feature.properties ? feature.properties[parameters.property] : undefined; if (value === undefined) { return coalesce(parameters.default, propertySpec.default); } return innerFun(parameters, propertySpec, value, hashedStops, categoricalKeyType); } }; } } function coalesce(a, b, c) { if (a !== undefined) { return a; } if (b !== undefined) { return b; } if (c !== undefined) { return c; } } function evaluateCategoricalFunction(parameters, propertySpec, input, hashedStops, keyType) { var evaluated = typeof input === keyType ? hashedStops[input] : undefined; // Enforce strict typing on input return coalesce(evaluated, parameters.default, propertySpec.default); } function evaluateIntervalFunction(parameters, propertySpec, input) { // Edge cases if (getType(input) !== 'number') { return coalesce(parameters.default, propertySpec.default); } var n = parameters.stops.length; if (n === 1) { return parameters.stops[0][1]; } if (input <= parameters.stops[0][0]) { return parameters.stops[0][1]; } if (input >= parameters.stops[n - 1][0]) { return parameters.stops[n - 1][1]; } var index = findStopLessThanOrEqualTo(parameters.stops, input); return parameters.stops[index][1]; } function evaluateExponentialFunction(parameters, propertySpec, input) { var base = parameters.base !== undefined ? parameters.base : 1; // Edge cases if (getType(input) !== 'number') { return coalesce(parameters.default, propertySpec.default); } var n = parameters.stops.length; if (n === 1) { return parameters.stops[0][1]; } if (input <= parameters.stops[0][0]) { return parameters.stops[0][1]; } if (input >= parameters.stops[n - 1][0]) { return parameters.stops[n - 1][1]; } var index = findStopLessThanOrEqualTo(parameters.stops, input); var t = interpolationFactor( input, base, parameters.stops[index][0], parameters.stops[index + 1][0]); var outputLower = parameters.stops[index][1]; var outputUpper = parameters.stops[index + 1][1]; var interp = interpolate[propertySpec.type] || identityFunction; if (parameters.colorSpace && parameters.colorSpace !== 'rgb') { var colorspace = colorSpaces[parameters.colorSpace]; interp = function (a, b) { return colorspace.reverse(colorspace.interpolate(colorspace.forward(a), colorspace.forward(b), t)); }; } if (typeof outputLower.evaluate === 'function') { return { evaluate: function evaluate() { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; var evaluatedLower = outputLower.evaluate.apply(undefined, args); var evaluatedUpper = outputUpper.evaluate.apply(undefined, args); // Special case for fill-outline-color, which has no spec default. if (evaluatedLower === undefined || evaluatedUpper === undefined) { return undefined; } return interp(evaluatedLower, evaluatedUpper, t); } }; } return interp(outputLower, outputUpper, t); } function evaluateIdentityFunction(parameters, propertySpec, input) { if (propertySpec.type === 'color') { input = Color.parse(input); } else if (getType(input) !== propertySpec.type && (propertySpec.type !== 'enum' || !propertySpec.values[input])) { input = undefined; } return coalesce(input, parameters.default, propertySpec.default); } /** * Returns the index of the last stop <= input, or 0 if it doesn't exist. * * @private */ function findStopLessThanOrEqualTo(stops, input) { var n = stops.length; var lowerIndex = 0; var upperIndex = n - 1; var currentIndex = 0; var currentValue, upperValue; while (lowerIndex <= upperIndex) { currentIndex = Math.floor((lowerIndex + upperIndex) / 2); currentValue = stops[currentIndex][0]; upperValue = stops[currentIndex + 1][0]; if (input === currentValue || input > currentValue && input < upperValue) { // Search complete return currentIndex; } else if (currentValue < input) { lowerIndex = currentIndex + 1; } else if (currentValue > input) { upperIndex = currentIndex - 1; } } return Math.max(currentIndex - 1, 0); } /** * Returns a ratio that can be used to interpolate between exponential function * stops. * * How it works: * Two consecutive stop values define a (scaled and shifted) exponential * function `f(x) = a * base^x + b`, where `base` is the user-specified base, * and `a` and `b` are constants affording sufficient degrees of freedom to fit * the function to the given stops. * * Here's a bit of algebra that lets us compute `f(x)` directly from the stop * values without explicitly solving for `a` and `b`: * * First stop value: `f(x0) = y0 = a * base^x0 + b` * Second stop value: `f(x1) = y1 = a * base^x1 + b` * => `y1 - y0 = a(base^x1 - base^x0)` * => `a = (y1 - y0)/(base^x1 - base^x0)` * * Desired value: `f(x) = y = a * base^x + b` * => `f(x) = y0 + a * (base^x - base^x0)` * * From the above, we can replace the `a` in `a * (base^x - base^x0)` and do a * little algebra: * ``` * a * (base^x - base^x0) = (y1 - y0)/(base^x1 - base^x0) * (base^x - base^x0) * = (y1 - y0) * (base^x - base^x0) / (base^x1 - base^x0) * ``` * * If we let `(base^x - base^x0) / (base^x1 base^x0)`, then we have * `f(x) = y0 + (y1 - y0) * ratio`. In other words, `ratio` may be treated as * an interpolation factor between the two stops' output values. * * (Note: a slightly different form for `ratio`, * `(base^(x-x0) - 1) / (base^(x1-x0) - 1) `, is equivalent, but requires fewer * expensive `Math.pow()` operations.) * * @private */ function interpolationFactor(input, base, lowerValue, upperValue) { var difference = upperValue - lowerValue; var progress = input - lowerValue; if (difference === 0) { return 0; } else if (base === 1) { return progress / difference; } else { return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1); } } module.exports = { createFunction: createFunction, isFunction: isFunction }; },{"../expression/definitions/interpolate":137,"../util/color":158,"../util/color_spaces":159,"../util/extend":161,"../util/get_type":162,"../util/interpolate":163}],155:[function(require,module,exports){ 'use strict'; var refProperties = require('./util/ref_properties'); function stringify(obj) { var type = typeof obj; if (type === 'number' || type === 'boolean' || type === 'string' || obj === undefined || obj === null) { return JSON.stringify(obj); } if (Array.isArray(obj)) { var str$1 = '['; for (var i$1 = 0, list = obj; i$1 < list.length; i$1 += 1) { var val = list[i$1]; str$1 += (stringify(val)) + ","; } return (str$1 + "]"); } var keys = Object.keys(obj).sort(); var str = '{'; for (var i = 0; i < keys.length; i++) { str += (JSON.stringify(keys[i])) + ":" + (stringify(obj[keys[i]])) + ","; } return (str + "}"); } function getKey(layer) { var key = ''; for (var i = 0, list = refProperties; i < list.length; i += 1) { var k = list[i]; key += "/" + (stringify(layer[k])); } return key; } module.exports = groupByLayout; /** * Given an array of layers, return an array of arrays of layers where all * layers in each group have identical layout-affecting properties. These * are the properties that were formerly used by explicit `ref` mechanism * for layers: 'type', 'source', 'source-layer', 'minzoom', 'maxzoom', * 'filter', and 'layout'. * * The input is not modified. The output layers are references to the * input layers. * * @private * @param {Array} layers * @returns {Array>} */ function groupByLayout(layers) { var groups = {}; for (var i = 0; i < layers.length; i++) { var k = getKey(layers[i]); var group = groups[k]; if (!group) { group = groups[k] = []; } group.push(layers[i]); } var result = []; for (var k$1 in groups) { result.push(groups[k$1]); } return result; } },{"./util/ref_properties":164}],156:[function(require,module,exports){ 'use strict'; module.exports = require('./v8.json'); },{"./v8.json":157}],157:[function(require,module,exports){ module.exports={"$version":8,"$root":{"version":{"required":true,"type":"enum","values":[8]},"name":{"type":"string"},"metadata":{"type":"*"},"center":{"type":"array","value":"number"},"zoom":{"type":"number"},"bearing":{"type":"number","default":0,"period":360,"units":"degrees"},"pitch":{"type":"number","default":0,"units":"degrees"},"light":{"type":"light"},"sources":{"required":true,"type":"sources"},"sprite":{"type":"string"},"glyphs":{"type":"string"},"transition":{"type":"transition"},"layers":{"required":true,"type":"array","value":"layer"}},"sources":{"*":{"type":"source"}},"source":["source_vector","source_raster","source_raster_dem","source_geojson","source_video","source_image","source_canvas"],"source_vector":{"type":{"required":true,"type":"enum","values":{"vector":{}}},"url":{"type":"string"},"tiles":{"type":"array","value":"string"},"bounds":{"type":"array","value":"number","length":4,"default":[-180,-85.0511,180,85.0511]},"minzoom":{"type":"number","default":0},"maxzoom":{"type":"number","default":22},"attribution":{"type":"string"},"*":{"type":"*"}},"source_raster":{"type":{"required":true,"type":"enum","values":{"raster":{}}},"url":{"type":"string"},"tiles":{"type":"array","value":"string"},"bounds":{"type":"array","value":"number","length":4,"default":[-180,-85.0511,180,85.0511]},"minzoom":{"type":"number","default":0},"maxzoom":{"type":"number","default":22},"tileSize":{"type":"number","default":512,"units":"pixels"},"scheme":{"type":"enum","values":{"xyz":{},"tms":{}},"default":"xyz"},"attribution":{"type":"string"},"*":{"type":"*"}},"source_raster_dem":{"type":{"required":true,"type":"enum","values":{"raster-dem":{}}},"url":{"type":"string"},"tiles":{"type":"array","value":"string"},"bounds":{"type":"array","value":"number","length":4,"default":[-180,-85.0511,180,85.0511]},"minzoom":{"type":"number","default":0},"maxzoom":{"type":"number","default":22},"tileSize":{"type":"number","default":512,"units":"pixels"},"attribution":{"type":"string"},"*":{"type":"*"}},"source_geojson":{"type":{"required":true,"type":"enum","values":{"geojson":{}}},"data":{"type":"*"},"maxzoom":{"type":"number","default":18},"buffer":{"type":"number","default":128,"maximum":512,"minimum":0},"tolerance":{"type":"number","default":0.375},"cluster":{"type":"boolean","default":false},"clusterRadius":{"type":"number","default":50,"minimum":0},"clusterMaxZoom":{"type":"number"}},"source_video":{"type":{"required":true,"type":"enum","values":{"video":{}}},"urls":{"required":true,"type":"array","value":"string"},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}}},"source_image":{"type":{"required":true,"type":"enum","values":{"image":{}}},"url":{"required":true,"type":"string"},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}}},"source_canvas":{"type":{"required":true,"type":"enum","values":{"canvas":{}}},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}},"animate":{"type":"boolean","default":"true"},"canvas":{"type":"string","required":true}},"layer":{"id":{"type":"string","required":true},"type":{"type":"enum","values":{"fill":{},"line":{},"symbol":{},"circle":{},"heatmap":{},"fill-extrusion":{},"raster":{},"hillshade":{},"background":{}},"required":true},"metadata":{"type":"*"},"source":{"type":"string"},"source-layer":{"type":"string"},"minzoom":{"type":"number","minimum":0,"maximum":24},"maxzoom":{"type":"number","minimum":0,"maximum":24},"filter":{"type":"filter"},"layout":{"type":"layout"},"paint":{"type":"paint"}},"layout":["layout_fill","layout_line","layout_circle","layout_heatmap","layout_fill-extrusion","layout_symbol","layout_raster","layout_hillshade","layout_background"],"layout_background":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_fill":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_circle":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_heatmap":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_fill-extrusion":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_line":{"line-cap":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"butt":{},"round":{},"square":{}},"default":"butt"},"line-join":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"bevel":{},"round":{},"miter":{}},"default":"miter"},"line-miter-limit":{"type":"number","default":2,"function":"interpolated","zoom-function":true,"requires":[{"line-join":"miter"}]},"line-round-limit":{"type":"number","default":1.05,"function":"interpolated","zoom-function":true,"requires":[{"line-join":"round"}]},"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_symbol":{"symbol-placement":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"point":{},"line":{}},"default":"point"},"symbol-spacing":{"type":"number","default":250,"minimum":1,"function":"interpolated","zoom-function":true,"units":"pixels","requires":[{"symbol-placement":"line"}]},"symbol-avoid-edges":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false},"icon-allow-overlap":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["icon-image"]},"icon-ignore-placement":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["icon-image"]},"icon-optional":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["icon-image","text-field"]},"icon-rotation-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["icon-image"]},"icon-size":{"type":"number","default":1,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"units":"factor of the original icon size","requires":["icon-image"]},"icon-text-fit":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"none":{},"width":{},"height":{},"both":{}},"default":"none","requires":["icon-image","text-field"]},"icon-text-fit-padding":{"type":"array","value":"number","length":4,"default":[0,0,0,0],"units":"pixels","function":"interpolated","zoom-function":true,"requires":["icon-image","text-field",{"icon-text-fit":["both","width","height"]}]},"icon-image":{"type":"string","function":"piecewise-constant","zoom-function":true,"property-function":true,"tokens":true},"icon-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","zoom-function":true,"property-function":true,"units":"degrees","requires":["icon-image"]},"icon-padding":{"type":"number","default":2,"minimum":0,"function":"interpolated","zoom-function":true,"units":"pixels","requires":["icon-image"]},"icon-keep-upright":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":"line"}]},"icon-offset":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"property-function":true,"requires":["icon-image"]},"icon-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"center":{},"left":{},"right":{},"top":{},"bottom":{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},"default":"center","requires":["icon-image"]},"icon-pitch-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["icon-image"]},"text-pitch-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["text-field"]},"text-rotation-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["text-field"]},"text-field":{"type":"string","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":"","tokens":true},"text-font":{"type":"array","value":"string","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":["Open Sans Regular","Arial Unicode MS Regular"],"requires":["text-field"]},"text-size":{"type":"number","default":16,"minimum":0,"units":"pixels","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field"]},"text-max-width":{"type":"number","default":10,"minimum":0,"units":"ems","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field"]},"text-line-height":{"type":"number","default":1.2,"units":"ems","function":"interpolated","zoom-function":true,"requires":["text-field"]},"text-letter-spacing":{"type":"number","default":0,"units":"ems","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field"]},"text-justify":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"left":{},"center":{},"right":{}},"default":"center","requires":["text-field"]},"text-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"center":{},"left":{},"right":{},"top":{},"bottom":{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},"default":"center","requires":["text-field"]},"text-max-angle":{"type":"number","default":45,"units":"degrees","function":"interpolated","zoom-function":true,"requires":["text-field",{"symbol-placement":"line"}]},"text-rotate":{"type":"number","default":0,"period":360,"units":"degrees","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field"]},"text-padding":{"type":"number","default":2,"minimum":0,"units":"pixels","function":"interpolated","zoom-function":true,"requires":["text-field"]},"text-keep-upright":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":true,"requires":["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":"line"}]},"text-transform":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"none":{},"uppercase":{},"lowercase":{}},"default":"none","requires":["text-field"]},"text-offset":{"type":"array","value":"number","units":"ems","function":"interpolated","zoom-function":true,"property-function":true,"length":2,"default":[0,0],"requires":["text-field"]},"text-allow-overlap":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["text-field"]},"text-ignore-placement":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["text-field"]},"text-optional":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["text-field","icon-image"]},"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_raster":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_hillshade":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"filter":{"type":"array","value":"*"},"filter_operator":{"type":"enum","values":{"==":{},"!=":{},">":{},">=":{},"<":{},"<=":{},"in":{},"!in":{},"all":{},"any":{},"none":{},"has":{},"!has":{}}},"geometry_type":{"type":"enum","values":{"Point":{},"LineString":{},"Polygon":{}}},"function":{"expression":{"type":"expression"},"stops":{"type":"array","value":"function_stop"},"base":{"type":"number","default":1,"minimum":0},"property":{"type":"string","default":"$zoom"},"type":{"type":"enum","values":{"identity":{},"exponential":{},"interval":{},"categorical":{}},"default":"exponential"},"colorSpace":{"type":"enum","values":{"rgb":{},"lab":{},"hcl":{}},"default":"rgb"},"default":{"type":"*","required":false}},"function_stop":{"type":"array","minimum":0,"maximum":22,"value":["number","color"],"length":2},"expression":{"type":"array","value":"*","minimum":1},"expression_name":{"type":"enum","values":{"let":{"group":"Variable binding"},"var":{"group":"Variable binding"},"literal":{"group":"Types"},"array":{"group":"Types"},"at":{"group":"Lookup"},"case":{"group":"Decision"},"match":{"group":"Decision"},"coalesce":{"group":"Decision"},"step":{"group":"Ramps, scales, curves"},"interpolate":{"group":"Ramps, scales, curves"},"ln2":{"group":"Math"},"pi":{"group":"Math"},"e":{"group":"Math"},"typeof":{"group":"Types"},"string":{"group":"Types"},"number":{"group":"Types"},"boolean":{"group":"Types"},"object":{"group":"Types"},"to-string":{"group":"Types"},"to-number":{"group":"Types"},"to-boolean":{"group":"Types"},"to-rgba":{"group":"Color"},"to-color":{"group":"Types"},"rgb":{"group":"Color"},"rgba":{"group":"Color"},"get":{"group":"Lookup"},"has":{"group":"Lookup"},"length":{"group":"Lookup"},"properties":{"group":"Feature data"},"geometry-type":{"group":"Feature data"},"id":{"group":"Feature data"},"zoom":{"group":"Zoom"},"heatmap-density":{"group":"Heatmap"},"+":{"group":"Math"},"*":{"group":"Math"},"-":{"group":"Math"},"/":{"group":"Math"},"%":{"group":"Math"},"^":{"group":"Math"},"sqrt":{"group":"Math"},"log10":{"group":"Math"},"ln":{"group":"Math"},"log2":{"group":"Math"},"sin":{"group":"Math"},"cos":{"group":"Math"},"tan":{"group":"Math"},"asin":{"group":"Math"},"acos":{"group":"Math"},"atan":{"group":"Math"},"min":{"group":"Math"},"max":{"group":"Math"},"==":{"group":"Decision"},"!=":{"group":"Decision"},">":{"group":"Decision"},"<":{"group":"Decision"},">=":{"group":"Decision"},"<=":{"group":"Decision"},"all":{"group":"Decision"},"any":{"group":"Decision"},"!":{"group":"Decision"},"upcase":{"group":"String"},"downcase":{"group":"String"},"concat":{"group":"String"}}},"light":{"anchor":{"type":"enum","default":"viewport","values":{"map":{},"viewport":{}},"transition":false,"zoom-function":true,"property-function":false,"function":"piecewise-constant"},"position":{"type":"array","default":[1.15,210,30],"length":3,"value":"number","transition":true,"function":"interpolated","zoom-function":true,"property-function":false},"color":{"type":"color","default":"#ffffff","function":"interpolated","zoom-function":true,"property-function":false,"transition":true},"intensity":{"type":"number","default":0.5,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":false,"transition":true}},"paint":["paint_fill","paint_line","paint_circle","paint_heatmap","paint_fill-extrusion","paint_symbol","paint_raster","paint_hillshade","paint_background"],"paint_fill":{"fill-antialias":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":true},"fill-opacity":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":1,"minimum":0,"maximum":1,"transition":true},"fill-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"fill-pattern"}]},"fill-outline-color":{"type":"color","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"fill-pattern"},{"fill-antialias":true}]},"fill-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels"},"fill-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["fill-translate"]},"fill-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"transition":true}},"paint_fill-extrusion":{"fill-extrusion-opacity":{"type":"number","function":"interpolated","zoom-function":true,"property-function":false,"default":1,"minimum":0,"maximum":1,"transition":true},"fill-extrusion-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"fill-extrusion-pattern"}]},"fill-extrusion-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels"},"fill-extrusion-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["fill-extrusion-translate"]},"fill-extrusion-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"transition":true},"fill-extrusion-height":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":0,"minimum":0,"units":"meters","transition":true},"fill-extrusion-base":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":0,"minimum":0,"units":"meters","transition":true,"requires":["fill-extrusion-height"]}},"paint_line":{"line-opacity":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":1,"minimum":0,"maximum":1,"transition":true},"line-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"line-pattern"}]},"line-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels"},"line-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["line-translate"]},"line-width":{"type":"number","default":1,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-gap-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-offset":{"type":"number","default":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-dasharray":{"type":"array","value":"number","function":"piecewise-constant","zoom-function":true,"minimum":0,"transition":true,"units":"line widths","requires":[{"!":"line-pattern"}]},"line-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"transition":true}},"paint_circle":{"circle-radius":{"type":"number","default":5,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"circle-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-blur":{"type":"number","default":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels"},"circle-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["circle-translate"]},"circle-pitch-scale":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map"},"circle-pitch-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"viewport"},"circle-stroke-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"circle-stroke-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-stroke-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true}},"paint_heatmap":{"heatmap-radius":{"type":"number","default":30,"minimum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"heatmap-weight":{"type":"number","default":1,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":false},"heatmap-intensity":{"type":"number","default":1,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":false,"transition":true},"heatmap-color":{"type":"color","default":["interpolate",["linear"],["heatmap-density"],0,"rgba(0, 0, 255, 0)",0.1,"royalblue",0.3,"cyan",0.5,"lime",0.7,"yellow",1,"red"],"function":"interpolated","zoom-function":false,"property-function":false,"transition":false},"heatmap-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":false,"transition":true}},"paint_symbol":{"icon-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["icon-image"]},"icon-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["icon-image"]},"icon-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["icon-image"]},"icon-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["icon-image"]},"icon-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["icon-image"]},"icon-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels","requires":["icon-image"]},"icon-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["icon-image","icon-translate"]},"text-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["text-field"]},"text-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["text-field"]},"text-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["text-field"]},"text-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["text-field"]},"text-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["text-field"]},"text-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels","requires":["text-field"]},"text-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["text-field","text-translate"]}},"paint_raster":{"raster-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true},"raster-hue-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","zoom-function":true,"transition":true,"units":"degrees"},"raster-brightness-min":{"type":"number","function":"interpolated","zoom-function":true,"default":0,"minimum":0,"maximum":1,"transition":true},"raster-brightness-max":{"type":"number","function":"interpolated","zoom-function":true,"default":1,"minimum":0,"maximum":1,"transition":true},"raster-saturation":{"type":"number","default":0,"minimum":-1,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true},"raster-contrast":{"type":"number","default":0,"minimum":-1,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true},"raster-fade-duration":{"type":"number","default":300,"minimum":0,"function":"interpolated","zoom-function":true,"transition":false,"units":"milliseconds"}},"paint_hillshade":{"hillshade-illumination-direction":{"type":"number","default":335,"minimum":0,"maximum":359,"function":"interpolated","zoom-function":true,"transition":false},"hillshade-illumination-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"viewport"},"hillshade-exaggeration":{"type":"number","default":0.5,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true},"hillshade-shadow-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"transition":true},"hillshade-highlight-color":{"type":"color","default":"#FFFFFF","function":"interpolated","zoom-function":true,"transition":true},"hillshade-accent-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"transition":true}},"paint_background":{"background-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"transition":true,"requires":[{"!":"background-pattern"}]},"background-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"transition":true},"background-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true}},"transition":{"duration":{"type":"number","default":300,"minimum":0,"units":"milliseconds"},"delay":{"type":"number","default":0,"minimum":0,"units":"milliseconds"}}} },{}],158:[function(require,module,exports){ 'use strict';// var ref = require('csscolorparser'); var parseCSSColor = ref.parseCSSColor; /** * An RGBA color value. Create instances from color strings using the static * method `Color.parse`. The constructor accepts RGB channel values in the range * `[0, 1]`, premultiplied by A. * * @param {number} r The red channel. * @param {number} g The green channel. * @param {number} b The blue channel. * @param {number} a The alpha channel. * @private */ var Color = function Color(r , g , b , a) { if ( a === void 0 ) a = 1; this.r = r; this.g = g; this.b = b; this.a = a; }; /** * Parses valid CSS color strings and returns a `Color` instance. * @returns A `Color` instance, or `undefined` if the input is not a valid color string. */ Color.parse = function parse (input ) { if (!input) { return undefined; } if (input instanceof Color) { return input; } if (typeof input !== 'string') { return undefined; } var rgba = parseCSSColor(input); if (!rgba) { return undefined; } return new Color( rgba[0] / 255 * rgba[3], rgba[1] / 255 * rgba[3], rgba[2] / 255 * rgba[3], rgba[3] ); }; /** * Returns an RGBA string representing the color value. * * @returns An RGBA string. * @example * var purple = new Color.parse('purple'); * purple.toString; // = "rgba(128,0,128,1)" * var translucentGreen = new Color.parse('rgba(26, 207, 26, .73)'); * translucentGreen.toString(); // = "rgba(26,207,26,0.73)" */ Color.prototype.toString = function toString () { var this$1 = this; var transformRgb = function (value ) { return Math.round(value * 255 / this$1.a); }; var rgb = [this.r, this.g, this.b].map(transformRgb); return ("rgba(" + (rgb.concat(this.a).join(',')) + ")"); }; Color.black = new Color(0, 0, 0, 1); Color.white = new Color(1, 1, 1, 1); Color.transparent = new Color(0, 0, 0, 0); module.exports = Color; },{"csscolorparser":14}],159:[function(require,module,exports){ 'use strict';// var Color = require('./color'); var interpolateNumber = require('./interpolate').number; // Constants var Xn = 0.950470, // D65 standard referent Yn = 1, Zn = 1.088830, t0 = 4 / 29, t1 = 6 / 29, t2 = 3 * t1 * t1, t3 = t1 * t1 * t1, deg2rad = Math.PI / 180, rad2deg = 180 / Math.PI; // Utilities function xyz2lab(t) { return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; } function lab2xyz(t) { return t > t1 ? t * t * t : t2 * (t - t0); } function xyz2rgb(x) { return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); } function rgb2xyz(x) { x /= 255; return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); } // LAB function rgbToLab(rgbColor ) { var b = rgb2xyz(rgbColor.r), a = rgb2xyz(rgbColor.g), l = rgb2xyz(rgbColor.b), x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn), y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn), z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn); return { l: 116 * y - 16, a: 500 * (x - y), b: 200 * (y - z), alpha: rgbColor.a }; } function labToRgb(labColor ) { var y = (labColor.l + 16) / 116, x = isNaN(labColor.a) ? y : y + labColor.a / 500, z = isNaN(labColor.b) ? y : y - labColor.b / 200; y = Yn * lab2xyz(y); x = Xn * lab2xyz(x); z = Zn * lab2xyz(z); return new Color( xyz2rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z), xyz2rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z), labColor.alpha ); } function interpolateLab(from , to , t ) { return { l: interpolateNumber(from.l, to.l, t), a: interpolateNumber(from.a, to.a, t), b: interpolateNumber(from.b, to.b, t), alpha: interpolateNumber(from.alpha, to.alpha, t) }; } // HCL function rgbToHcl(rgbColor ) { var ref = rgbToLab(rgbColor); var l = ref.l; var a = ref.a; var b = ref.b; var h = Math.atan2(b, a) * rad2deg; return { h: h < 0 ? h + 360 : h, c: Math.sqrt(a * a + b * b), l: l, alpha: rgbColor.a }; } function hclToRgb(hclColor ) { var h = hclColor.h * deg2rad, c = hclColor.c, l = hclColor.l; return labToRgb({ l: l, a: Math.cos(h) * c, b: Math.sin(h) * c, alpha: hclColor.alpha }); } function interpolateHue(a , b , t ) { var d = b - a; return a + t * (d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d); } function interpolateHcl(from , to , t ) { return { h: interpolateHue(from.h, to.h, t), c: interpolateNumber(from.c, to.c, t), l: interpolateNumber(from.l, to.l, t), alpha: interpolateNumber(from.alpha, to.alpha, t) }; } module.exports = { lab: { forward: rgbToLab, reverse: labToRgb, interpolate: interpolateLab }, hcl: { forward: rgbToHcl, reverse: hclToRgb, interpolate: interpolateHcl } }; },{"./color":158,"./interpolate":163}],160:[function(require,module,exports){ 'use strict';// /** * Deeply compares two object literals. * * @private */ function deepEqual(a , b ) { if (Array.isArray(a)) { if (!Array.isArray(b) || a.length !== b.length) { return false; } for (var i = 0; i < a.length; i++) { if (!deepEqual(a[i], b[i])) { return false; } } return true; } if (typeof a === 'object' && a !== null && b !== null) { if (!(typeof b === 'object')) { return false; } var keys = Object.keys(a); if (keys.length !== Object.keys(b).length) { return false; } for (var key in a) { if (!deepEqual(a[key], b[key])) { return false; } } return true; } return a === b; } module.exports = deepEqual; },{}],161:[function(require,module,exports){ 'use strict'; module.exports = function (output) { var inputs = [], len = arguments.length - 1; while ( len-- > 0 ) inputs[ len ] = arguments[ len + 1 ]; for (var i = 0, list = inputs; i < list.length; i += 1) { var input = list[i]; for (var k in input) { output[k] = input[k]; } } return output; }; },{}],162:[function(require,module,exports){ 'use strict'; module.exports = function getType(val) { if (val instanceof Number) { return 'number'; } else if (val instanceof String) { return 'string'; } else if (val instanceof Boolean) { return 'boolean'; } else if (Array.isArray(val)) { return 'array'; } else if (val === null) { return 'null'; } else { return typeof val; } }; },{}],163:[function(require,module,exports){ 'use strict';// var Color = require('./color'); module.exports = { number: number, color: color, array: array }; function number(a , b , t ) { return (a * (1 - t)) + (b * t); } function color(from , to , t ) { return new Color( number(from.r, to.r, t), number(from.g, to.g, t), number(from.b, to.b, t), number(from.a, to.a, t) ); } function array(from , to , t ) { return from.map(function (d, i) { return number(d, to[i], t); }); } },{"./color":158}],164:[function(require,module,exports){ 'use strict'; module.exports = ['type', 'source', 'source-layer', 'minzoom', 'maxzoom', 'filter', 'layout']; },{}],165:[function(require,module,exports){ 'use strict';// /** * A type used for returning and propagating errors. The first element of the union * represents success and contains a value, and the second represents an error and * contains an error value. * @private */ function success (value ) { return { result: 'success', value: value }; } function error (value ) { return { result: 'error', value: value }; } module.exports = { success: success, error: error }; },{}],166:[function(require,module,exports){ 'use strict'; // Turn jsonlint-lines-primitives objects into primitive objects function unbundle(value) { if (value instanceof Number || value instanceof String || value instanceof Boolean) { return value.valueOf(); } else { return value; } } function deepUnbundle(value) { if (Array.isArray(value)) { return value.map(deepUnbundle); } return unbundle(value); } module.exports = unbundle; module.exports.deep = deepUnbundle; },{}],167:[function(require,module,exports){ 'use strict'; var extend = require('../util/extend'); var unbundle = require('../util/unbundle_jsonlint'); var ref = require('../expression'); var isExpression = ref.isExpression; var ref$1 = require('../function'); var isFunction = ref$1.isFunction; // Main recursive validation function. Tracks: // // - key: string representing location of validation in style tree. Used only // for more informative error reporting. // - value: current value from style being evaluated. May be anything from a // high level object that needs to be descended into deeper or a simple // scalar value. // - valueSpec: current spec being evaluated. Tracks value. // - styleSpec: current full spec being evaluated. module.exports = function validate(options) { var validateFunction = require('./validate_function'); var validateExpression = require('./validate_expression'); var validateObject = require('./validate_object'); var VALIDATORS = { '*': function() { return []; }, 'array': require('./validate_array'), 'boolean': require('./validate_boolean'), 'number': require('./validate_number'), 'color': require('./validate_color'), 'constants': require('./validate_constants'), 'enum': require('./validate_enum'), 'filter': require('./validate_filter'), 'function': require('./validate_function'), 'layer': require('./validate_layer'), 'object': require('./validate_object'), 'source': require('./validate_source'), 'light': require('./validate_light'), 'string': require('./validate_string') }; var value = options.value; var valueSpec = options.valueSpec; var styleSpec = options.styleSpec; if (valueSpec.function && isFunction(unbundle(value))) { return validateFunction(options); } else if (valueSpec.function && isExpression(unbundle.deep(value))) { return validateExpression(options); } else if (valueSpec.type && VALIDATORS[valueSpec.type]) { return VALIDATORS[valueSpec.type](options); } else { return validateObject(extend({}, options, { valueSpec: valueSpec.type ? styleSpec[valueSpec.type] : valueSpec })); } }; },{"../expression":144,"../function":154,"../util/extend":161,"../util/unbundle_jsonlint":166,"./validate_array":168,"./validate_boolean":169,"./validate_color":170,"./validate_constants":171,"./validate_enum":172,"./validate_expression":173,"./validate_filter":174,"./validate_function":175,"./validate_layer":177,"./validate_light":179,"./validate_number":180,"./validate_object":181,"./validate_source":184,"./validate_string":185}],168:[function(require,module,exports){ 'use strict'; var getType = require('../util/get_type'); var validate = require('./validate'); var ValidationError = require('../error/validation_error'); module.exports = function validateArray(options) { var array = options.value; var arraySpec = options.valueSpec; var style = options.style; var styleSpec = options.styleSpec; var key = options.key; var validateArrayElement = options.arrayElementValidator || validate; if (getType(array) !== 'array') { return [new ValidationError(key, array, ("array expected, " + (getType(array)) + " found"))]; } if (arraySpec.length && array.length !== arraySpec.length) { return [new ValidationError(key, array, ("array length " + (arraySpec.length) + " expected, length " + (array.length) + " found"))]; } if (arraySpec['min-length'] && array.length < arraySpec['min-length']) { return [new ValidationError(key, array, ("array length at least " + (arraySpec['min-length']) + " expected, length " + (array.length) + " found"))]; } var arrayElementSpec = { "type": arraySpec.value }; if (styleSpec.$version < 7) { arrayElementSpec.function = arraySpec.function; } if (getType(arraySpec.value) === 'object') { arrayElementSpec = arraySpec.value; } var errors = []; for (var i = 0; i < array.length; i++) { errors = errors.concat(validateArrayElement({ array: array, arrayIndex: i, value: array[i], valueSpec: arrayElementSpec, style: style, styleSpec: styleSpec, key: (key + "[" + i + "]") })); } return errors; }; },{"../error/validation_error":127,"../util/get_type":162,"./validate":167}],169:[function(require,module,exports){ 'use strict'; var getType = require('../util/get_type'); var ValidationError = require('../error/validation_error'); module.exports = function validateBoolean(options) { var value = options.value; var key = options.key; var type = getType(value); if (type !== 'boolean') { return [new ValidationError(key, value, ("boolean expected, " + type + " found"))]; } return []; }; },{"../error/validation_error":127,"../util/get_type":162}],170:[function(require,module,exports){ 'use strict'; var ValidationError = require('../error/validation_error'); var getType = require('../util/get_type'); var parseCSSColor = require('csscolorparser').parseCSSColor; module.exports = function validateColor(options) { var key = options.key; var value = options.value; var type = getType(value); if (type !== 'string') { return [new ValidationError(key, value, ("color expected, " + type + " found"))]; } if (parseCSSColor(value) === null) { return [new ValidationError(key, value, ("color expected, \"" + value + "\" found"))]; } return []; }; },{"../error/validation_error":127,"../util/get_type":162,"csscolorparser":14}],171:[function(require,module,exports){ 'use strict'; var ValidationError = require('../error/validation_error'); module.exports = function validateConstants(options) { var key = options.key; var constants = options.value; if (constants) { return [new ValidationError(key, constants, 'constants have been deprecated as of v8')]; } else { return []; } }; },{"../error/validation_error":127}],172:[function(require,module,exports){ 'use strict'; var ValidationError = require('../error/validation_error'); var unbundle = require('../util/unbundle_jsonlint'); module.exports = function validateEnum(options) { var key = options.key; var value = options.value; var valueSpec = options.valueSpec; var errors = []; if (Array.isArray(valueSpec.values)) { // <=v7 if (valueSpec.values.indexOf(unbundle(value)) === -1) { errors.push(new ValidationError(key, value, ("expected one of [" + (valueSpec.values.join(', ')) + "], " + (JSON.stringify(value)) + " found"))); } } else { // >=v8 if (Object.keys(valueSpec.values).indexOf(unbundle(value)) === -1) { errors.push(new ValidationError(key, value, ("expected one of [" + (Object.keys(valueSpec.values).join(', ')) + "], " + (JSON.stringify(value)) + " found"))); } } return errors; }; },{"../error/validation_error":127,"../util/unbundle_jsonlint":166}],173:[function(require,module,exports){ 'use strict';// var ValidationError = require('../error/validation_error'); var ref = require('../expression'); var createExpression = ref.createExpression; var createPropertyExpression = ref.createPropertyExpression; var unbundle = require('../util/unbundle_jsonlint'); module.exports = function validateExpression(options ) { var expression = (options.expressionContext === 'property' ? createPropertyExpression : createExpression)(unbundle.deep(options.value), options.valueSpec); if (expression.result === 'error') { return expression.value.map(function (error) { return new ValidationError(("" + (options.key) + (error.key)), options.value, error.message); }); } if (options.expressionContext === 'property' && options.propertyKey === 'text-font' && (expression.value )._styleExpression.expression.possibleOutputs().indexOf(undefined) !== -1) { return [new ValidationError(options.key, options.value, 'Invalid data expression for "text-font". Output values must be contained as literals within the expression.')]; } return []; }; },{"../error/validation_error":127,"../expression":144,"../util/unbundle_jsonlint":166}],174:[function(require,module,exports){ 'use strict'; var ValidationError = require('../error/validation_error'); var validateExpression = require('./validate_expression'); var validateEnum = require('./validate_enum'); var getType = require('../util/get_type'); var unbundle = require('../util/unbundle_jsonlint'); var extend = require('../util/extend'); var ref = require('../feature_filter'); var isExpressionFilter = ref.isExpressionFilter; module.exports = function validateFilter(options) { if (isExpressionFilter(unbundle.deep(options.value))) { return validateExpression(extend({}, options, { expressionContext: 'filter', valueSpec: { value: 'boolean' } })); } else { return validateNonExpressionFilter(options); } }; function validateNonExpressionFilter(options) { var value = options.value; var key = options.key; if (getType(value) !== 'array') { return [new ValidationError(key, value, ("array expected, " + (getType(value)) + " found"))]; } var styleSpec = options.styleSpec; var type; var errors = []; if (value.length < 1) { return [new ValidationError(key, value, 'filter array must have at least 1 element')]; } errors = errors.concat(validateEnum({ key: (key + "[0]"), value: value[0], valueSpec: styleSpec.filter_operator, style: options.style, styleSpec: options.styleSpec })); switch (unbundle(value[0])) { case '<': case '<=': case '>': case '>=': if (value.length >= 2 && unbundle(value[1]) === '$type') { errors.push(new ValidationError(key, value, ("\"$type\" cannot be use with operator \"" + (value[0]) + "\""))); } /* falls through */ case '==': case '!=': if (value.length !== 3) { errors.push(new ValidationError(key, value, ("filter array for operator \"" + (value[0]) + "\" must have 3 elements"))); } /* falls through */ case 'in': case '!in': if (value.length >= 2) { type = getType(value[1]); if (type !== 'string') { errors.push(new ValidationError((key + "[1]"), value[1], ("string expected, " + type + " found"))); } } for (var i = 2; i < value.length; i++) { type = getType(value[i]); if (unbundle(value[1]) === '$type') { errors = errors.concat(validateEnum({ key: (key + "[" + i + "]"), value: value[i], valueSpec: styleSpec.geometry_type, style: options.style, styleSpec: options.styleSpec })); } else if (type !== 'string' && type !== 'number' && type !== 'boolean') { errors.push(new ValidationError((key + "[" + i + "]"), value[i], ("string, number, or boolean expected, " + type + " found"))); } } break; case 'any': case 'all': case 'none': for (var i$1 = 1; i$1 < value.length; i$1++) { errors = errors.concat(validateNonExpressionFilter({ key: (key + "[" + i$1 + "]"), value: value[i$1], style: options.style, styleSpec: options.styleSpec })); } break; case 'has': case '!has': type = getType(value[1]); if (value.length !== 2) { errors.push(new ValidationError(key, value, ("filter array for \"" + (value[0]) + "\" operator must have 2 elements"))); } else if (type !== 'string') { errors.push(new ValidationError((key + "[1]"), value[1], ("string expected, " + type + " found"))); } break; } return errors; } },{"../error/validation_error":127,"../feature_filter":153,"../util/extend":161,"../util/get_type":162,"../util/unbundle_jsonlint":166,"./validate_enum":172,"./validate_expression":173}],175:[function(require,module,exports){ 'use strict'; var ValidationError = require('../error/validation_error'); var getType = require('../util/get_type'); var validate = require('./validate'); var validateObject = require('./validate_object'); var validateArray = require('./validate_array'); var validateNumber = require('./validate_number'); var unbundle = require('../util/unbundle_jsonlint'); module.exports = function validateFunction(options) { var functionValueSpec = options.valueSpec; var functionType = unbundle(options.value.type); var stopKeyType; var stopDomainValues = {}; var previousStopDomainValue; var previousStopDomainZoom; var isZoomFunction = functionType !== 'categorical' && options.value.property === undefined; var isPropertyFunction = !isZoomFunction; var isZoomAndPropertyFunction = getType(options.value.stops) === 'array' && getType(options.value.stops[0]) === 'array' && getType(options.value.stops[0][0]) === 'object'; var errors = validateObject({ key: options.key, value: options.value, valueSpec: options.styleSpec.function, style: options.style, styleSpec: options.styleSpec, objectElementValidators: { stops: validateFunctionStops, default: validateFunctionDefault } }); if (functionType === 'identity' && isZoomFunction) { errors.push(new ValidationError(options.key, options.value, 'missing required property "property"')); } if (functionType !== 'identity' && !options.value.stops) { errors.push(new ValidationError(options.key, options.value, 'missing required property "stops"')); } if (functionType === 'exponential' && options.valueSpec['function'] === 'piecewise-constant') { errors.push(new ValidationError(options.key, options.value, 'exponential functions not supported')); } if (options.styleSpec.$version >= 8) { if (isPropertyFunction && !options.valueSpec['property-function']) { errors.push(new ValidationError(options.key, options.value, 'property functions not supported')); } else if (isZoomFunction && !options.valueSpec['zoom-function'] && options.objectKey !== 'heatmap-color') { errors.push(new ValidationError(options.key, options.value, 'zoom functions not supported')); } } if ((functionType === 'categorical' || isZoomAndPropertyFunction) && options.value.property === undefined) { errors.push(new ValidationError(options.key, options.value, '"property" property is required')); } return errors; function validateFunctionStops(options) { if (functionType === 'identity') { return [new ValidationError(options.key, options.value, 'identity function may not have a "stops" property')]; } var errors = []; var value = options.value; errors = errors.concat(validateArray({ key: options.key, value: value, valueSpec: options.valueSpec, style: options.style, styleSpec: options.styleSpec, arrayElementValidator: validateFunctionStop })); if (getType(value) === 'array' && value.length === 0) { errors.push(new ValidationError(options.key, value, 'array must have at least one stop')); } return errors; } function validateFunctionStop(options) { var errors = []; var value = options.value; var key = options.key; if (getType(value) !== 'array') { return [new ValidationError(key, value, ("array expected, " + (getType(value)) + " found"))]; } if (value.length !== 2) { return [new ValidationError(key, value, ("array length 2 expected, length " + (value.length) + " found"))]; } if (isZoomAndPropertyFunction) { if (getType(value[0]) !== 'object') { return [new ValidationError(key, value, ("object expected, " + (getType(value[0])) + " found"))]; } if (value[0].zoom === undefined) { return [new ValidationError(key, value, 'object stop key must have zoom')]; } if (value[0].value === undefined) { return [new ValidationError(key, value, 'object stop key must have value')]; } if (previousStopDomainZoom && previousStopDomainZoom > unbundle(value[0].zoom)) { return [new ValidationError(key, value[0].zoom, 'stop zoom values must appear in ascending order')]; } if (unbundle(value[0].zoom) !== previousStopDomainZoom) { previousStopDomainZoom = unbundle(value[0].zoom); previousStopDomainValue = undefined; stopDomainValues = {}; } errors = errors.concat(validateObject({ key: (key + "[0]"), value: value[0], valueSpec: { zoom: {} }, style: options.style, styleSpec: options.styleSpec, objectElementValidators: { zoom: validateNumber, value: validateStopDomainValue } })); } else { errors = errors.concat(validateStopDomainValue({ key: (key + "[0]"), value: value[0], valueSpec: {}, style: options.style, styleSpec: options.styleSpec }, value)); } return errors.concat(validate({ key: (key + "[1]"), value: value[1], valueSpec: functionValueSpec, style: options.style, styleSpec: options.styleSpec })); } function validateStopDomainValue(options, stop) { var type = getType(options.value); var value = unbundle(options.value); var reportValue = options.value !== null ? options.value : stop; if (!stopKeyType) { stopKeyType = type; } else if (type !== stopKeyType) { return [new ValidationError(options.key, reportValue, (type + " stop domain type must match previous stop domain type " + stopKeyType))]; } if (type !== 'number' && type !== 'string' && type !== 'boolean') { return [new ValidationError(options.key, reportValue, 'stop domain value must be a number, string, or boolean')]; } if (type !== 'number' && functionType !== 'categorical') { var message = "number expected, " + type + " found"; if (functionValueSpec['property-function'] && functionType === undefined) { message += '\nIf you intended to use a categorical function, specify `"type": "categorical"`.'; } return [new ValidationError(options.key, reportValue, message)]; } if (functionType === 'categorical' && type === 'number' && (!isFinite(value) || Math.floor(value) !== value)) { return [new ValidationError(options.key, reportValue, ("integer expected, found " + value))]; } if (functionType !== 'categorical' && type === 'number' && previousStopDomainValue !== undefined && value < previousStopDomainValue) { return [new ValidationError(options.key, reportValue, 'stop domain values must appear in ascending order')]; } else { previousStopDomainValue = value; } if (functionType === 'categorical' && value in stopDomainValues) { return [new ValidationError(options.key, reportValue, 'stop domain values must be unique')]; } else { stopDomainValues[value] = true; } return []; } function validateFunctionDefault(options) { return validate({ key: options.key, value: options.value, valueSpec: functionValueSpec, style: options.style, styleSpec: options.styleSpec }); } }; },{"../error/validation_error":127,"../util/get_type":162,"../util/unbundle_jsonlint":166,"./validate":167,"./validate_array":168,"./validate_number":180,"./validate_object":181}],176:[function(require,module,exports){ 'use strict'; var ValidationError = require('../error/validation_error'); var validateString = require('./validate_string'); module.exports = function(options) { var value = options.value; var key = options.key; var errors = validateString(options); if (errors.length) { return errors; } if (value.indexOf('{fontstack}') === -1) { errors.push(new ValidationError(key, value, '"glyphs" url must include a "{fontstack}" token')); } if (value.indexOf('{range}') === -1) { errors.push(new ValidationError(key, value, '"glyphs" url must include a "{range}" token')); } return errors; }; },{"../error/validation_error":127,"./validate_string":185}],177:[function(require,module,exports){ 'use strict'; var ValidationError = require('../error/validation_error'); var unbundle = require('../util/unbundle_jsonlint'); var validateObject = require('./validate_object'); var validateFilter = require('./validate_filter'); var validatePaintProperty = require('./validate_paint_property'); var validateLayoutProperty = require('./validate_layout_property'); var validateSpec = require('./validate'); var extend = require('../util/extend'); module.exports = function validateLayer(options) { var errors = []; var layer = options.value; var key = options.key; var style = options.style; var styleSpec = options.styleSpec; if (!layer.type && !layer.ref) { errors.push(new ValidationError(key, layer, 'either "type" or "ref" is required')); } var type = unbundle(layer.type); var ref = unbundle(layer.ref); if (layer.id) { var layerId = unbundle(layer.id); for (var i = 0; i < options.arrayIndex; i++) { var otherLayer = style.layers[i]; if (unbundle(otherLayer.id) === layerId) { errors.push(new ValidationError(key, layer.id, ("duplicate layer id \"" + (layer.id) + "\", previously used at line " + (otherLayer.id.__line__)))); } } } if ('ref' in layer) { ['type', 'source', 'source-layer', 'filter', 'layout'].forEach(function (p) { if (p in layer) { errors.push(new ValidationError(key, layer[p], ("\"" + p + "\" is prohibited for ref layers"))); } }); var parent; style.layers.forEach(function (layer) { if (unbundle(layer.id) === ref) { parent = layer; } }); if (!parent) { errors.push(new ValidationError(key, layer.ref, ("ref layer \"" + ref + "\" not found"))); } else if (parent.ref) { errors.push(new ValidationError(key, layer.ref, 'ref cannot reference another ref layer')); } else { type = unbundle(parent.type); } } else if (type !== 'background') { if (!layer.source) { errors.push(new ValidationError(key, layer, 'missing required property "source"')); } else { var source = style.sources && style.sources[layer.source]; var sourceType = source && unbundle(source.type); if (!source) { errors.push(new ValidationError(key, layer.source, ("source \"" + (layer.source) + "\" not found"))); } else if (sourceType === 'vector' && type === 'raster') { errors.push(new ValidationError(key, layer.source, ("layer \"" + (layer.id) + "\" requires a raster source"))); } else if (sourceType === 'raster' && type !== 'raster') { errors.push(new ValidationError(key, layer.source, ("layer \"" + (layer.id) + "\" requires a vector source"))); } else if (sourceType === 'vector' && !layer['source-layer']) { errors.push(new ValidationError(key, layer, ("layer \"" + (layer.id) + "\" must specify a \"source-layer\""))); } else if (sourceType === 'raster-dem' && type !== 'hillshade') { errors.push(new ValidationError(key, layer.source, 'raster-dem source can only be used with layer type \'hillshade\'.')); } } } errors = errors.concat(validateObject({ key: key, value: layer, valueSpec: styleSpec.layer, style: options.style, styleSpec: options.styleSpec, objectElementValidators: { '*': function() { return []; }, // We don't want to enforce the spec's `"requires": true` for backward compatibility with refs; // the actual requirement is validated above. See https://github.com/mapbox/mapbox-gl-js/issues/5772. type: function() { return validateSpec({ key: (key + ".type"), value: layer.type, valueSpec: styleSpec.layer.type, style: options.style, styleSpec: options.styleSpec, object: layer, objectKey: 'type' }); }, filter: validateFilter, layout: function(options) { return validateObject({ layer: layer, key: options.key, value: options.value, style: options.style, styleSpec: options.styleSpec, objectElementValidators: { '*': function(options) { return validateLayoutProperty(extend({layerType: type}, options)); } } }); }, paint: function(options) { return validateObject({ layer: layer, key: options.key, value: options.value, style: options.style, styleSpec: options.styleSpec, objectElementValidators: { '*': function(options) { return validatePaintProperty(extend({layerType: type}, options)); } } }); } } })); return errors; }; },{"../error/validation_error":127,"../util/extend":161,"../util/unbundle_jsonlint":166,"./validate":167,"./validate_filter":174,"./validate_layout_property":178,"./validate_object":181,"./validate_paint_property":182}],178:[function(require,module,exports){ 'use strict'; var validateProperty = require('./validate_property'); module.exports = function validateLayoutProperty(options) { return validateProperty(options, 'layout'); }; },{"./validate_property":183}],179:[function(require,module,exports){ 'use strict'; var ValidationError = require('../error/validation_error'); var getType = require('../util/get_type'); var validate = require('./validate'); module.exports = function validateLight(options) { var light = options.value; var styleSpec = options.styleSpec; var lightSpec = styleSpec.light; var style = options.style; var errors = []; var rootType = getType(light); if (light === undefined) { return errors; } else if (rootType !== 'object') { errors = errors.concat([new ValidationError('light', light, ("object expected, " + rootType + " found"))]); return errors; } for (var key in light) { var transitionMatch = key.match(/^(.*)-transition$/); if (transitionMatch && lightSpec[transitionMatch[1]] && lightSpec[transitionMatch[1]].transition) { errors = errors.concat(validate({ key: key, value: light[key], valueSpec: styleSpec.transition, style: style, styleSpec: styleSpec })); } else if (lightSpec[key]) { errors = errors.concat(validate({ key: key, value: light[key], valueSpec: lightSpec[key], style: style, styleSpec: styleSpec })); } else { errors = errors.concat([new ValidationError(key, light[key], ("unknown property \"" + key + "\""))]); } } return errors; }; },{"../error/validation_error":127,"../util/get_type":162,"./validate":167}],180:[function(require,module,exports){ 'use strict'; var getType = require('../util/get_type'); var ValidationError = require('../error/validation_error'); module.exports = function validateNumber(options) { var key = options.key; var value = options.value; var valueSpec = options.valueSpec; var type = getType(value); if (type !== 'number') { return [new ValidationError(key, value, ("number expected, " + type + " found"))]; } if ('minimum' in valueSpec && value < valueSpec.minimum) { return [new ValidationError(key, value, (value + " is less than the minimum value " + (valueSpec.minimum)))]; } if ('maximum' in valueSpec && value > valueSpec.maximum) { return [new ValidationError(key, value, (value + " is greater than the maximum value " + (valueSpec.maximum)))]; } return []; }; },{"../error/validation_error":127,"../util/get_type":162}],181:[function(require,module,exports){ 'use strict'; var ValidationError = require('../error/validation_error'); var getType = require('../util/get_type'); var validateSpec = require('./validate'); module.exports = function validateObject(options) { var key = options.key; var object = options.value; var elementSpecs = options.valueSpec || {}; var elementValidators = options.objectElementValidators || {}; var style = options.style; var styleSpec = options.styleSpec; var errors = []; var type = getType(object); if (type !== 'object') { return [new ValidationError(key, object, ("object expected, " + type + " found"))]; } for (var objectKey in object) { var elementSpecKey = objectKey.split('.')[0]; // treat 'paint.*' as 'paint' var elementSpec = elementSpecs[elementSpecKey] || elementSpecs['*']; var validateElement = (void 0); if (elementValidators[elementSpecKey]) { validateElement = elementValidators[elementSpecKey]; } else if (elementSpecs[elementSpecKey]) { validateElement = validateSpec; } else if (elementValidators['*']) { validateElement = elementValidators['*']; } else if (elementSpecs['*']) { validateElement = validateSpec; } else { errors.push(new ValidationError(key, object[objectKey], ("unknown property \"" + objectKey + "\""))); continue; } errors = errors.concat(validateElement({ key: (key ? (key + ".") : key) + objectKey, value: object[objectKey], valueSpec: elementSpec, style: style, styleSpec: styleSpec, object: object, objectKey: objectKey }, object)); } for (var elementSpecKey$1 in elementSpecs) { // Don't check `required` when there's a custom validator for that property. if (elementValidators[elementSpecKey$1]) { continue; } if (elementSpecs[elementSpecKey$1].required && elementSpecs[elementSpecKey$1]['default'] === undefined && object[elementSpecKey$1] === undefined) { errors.push(new ValidationError(key, object, ("missing required property \"" + elementSpecKey$1 + "\""))); } } return errors; }; },{"../error/validation_error":127,"../util/get_type":162,"./validate":167}],182:[function(require,module,exports){ 'use strict'; var validateProperty = require('./validate_property'); module.exports = function validatePaintProperty(options) { return validateProperty(options, 'paint'); }; },{"./validate_property":183}],183:[function(require,module,exports){ 'use strict'; var validate = require('./validate'); var ValidationError = require('../error/validation_error'); var getType = require('../util/get_type'); var ref = require('../function'); var isFunction = ref.isFunction; var unbundle = require('../util/unbundle_jsonlint'); module.exports = function validateProperty(options, propertyType) { var key = options.key; var style = options.style; var styleSpec = options.styleSpec; var value = options.value; var propertyKey = options.objectKey; var layerSpec = styleSpec[(propertyType + "_" + (options.layerType))]; if (!layerSpec) { return []; } var transitionMatch = propertyKey.match(/^(.*)-transition$/); if (propertyType === 'paint' && transitionMatch && layerSpec[transitionMatch[1]] && layerSpec[transitionMatch[1]].transition) { return validate({ key: key, value: value, valueSpec: styleSpec.transition, style: style, styleSpec: styleSpec }); } var valueSpec = options.valueSpec || layerSpec[propertyKey]; if (!valueSpec) { return [new ValidationError(key, value, ("unknown property \"" + propertyKey + "\""))]; } var tokenMatch; if (getType(value) === 'string' && valueSpec['property-function'] && !valueSpec.tokens && (tokenMatch = /^{([^}]+)}$/.exec(value))) { return [new ValidationError( key, value, "\"" + propertyKey + "\" does not support interpolation syntax\n" + "Use an identity property function instead: `{ \"type\": \"identity\", \"property\": " + (JSON.stringify(tokenMatch[1])) + " }`.")]; } var errors = []; if (options.layerType === 'symbol') { if (propertyKey === 'text-field' && style && !style.glyphs) { errors.push(new ValidationError(key, value, 'use of "text-field" requires a style "glyphs" property')); } if (propertyKey === 'text-font' && isFunction(unbundle.deep(value)) && unbundle(value.type) === 'identity') { errors.push(new ValidationError(key, value, '"text-font" does not support identity functions')); } } return errors.concat(validate({ key: options.key, value: value, valueSpec: valueSpec, style: style, styleSpec: styleSpec, expressionContext: 'property', propertyKey: propertyKey })); }; },{"../error/validation_error":127,"../function":154,"../util/get_type":162,"../util/unbundle_jsonlint":166,"./validate":167}],184:[function(require,module,exports){ 'use strict'; var ValidationError = require('../error/validation_error'); var unbundle = require('../util/unbundle_jsonlint'); var validateObject = require('./validate_object'); var validateEnum = require('./validate_enum'); module.exports = function validateSource(options) { var value = options.value; var key = options.key; var styleSpec = options.styleSpec; var style = options.style; if (!value.type) { return [new ValidationError(key, value, '"type" is required')]; } var type = unbundle(value.type); var errors = []; switch (type) { case 'vector': case 'raster': case 'raster-dem': errors = errors.concat(validateObject({ key: key, value: value, valueSpec: styleSpec[("source_" + (type.replace('-', '_')))], style: options.style, styleSpec: styleSpec })); if ('url' in value) { for (var prop in value) { if (['type', 'url', 'tileSize'].indexOf(prop) < 0) { errors.push(new ValidationError((key + "." + prop), value[prop], ("a source with a \"url\" property may not include a \"" + prop + "\" property"))); } } } return errors; case 'geojson': return validateObject({ key: key, value: value, valueSpec: styleSpec.source_geojson, style: style, styleSpec: styleSpec }); case 'video': return validateObject({ key: key, value: value, valueSpec: styleSpec.source_video, style: style, styleSpec: styleSpec }); case 'image': return validateObject({ key: key, value: value, valueSpec: styleSpec.source_image, style: style, styleSpec: styleSpec }); case 'canvas': return validateObject({ key: key, value: value, valueSpec: styleSpec.source_canvas, style: style, styleSpec: styleSpec }); default: return validateEnum({ key: (key + ".type"), value: value.type, valueSpec: {values: ['vector', 'raster', 'raster-dem', 'geojson', 'video', 'image', 'canvas']}, style: style, styleSpec: styleSpec }); } }; },{"../error/validation_error":127,"../util/unbundle_jsonlint":166,"./validate_enum":172,"./validate_object":181}],185:[function(require,module,exports){ 'use strict'; var getType = require('../util/get_type'); var ValidationError = require('../error/validation_error'); module.exports = function validateString(options) { var value = options.value; var key = options.key; var type = getType(value); if (type !== 'string') { return [new ValidationError(key, value, ("string expected, " + type + " found"))]; } return []; }; },{"../error/validation_error":127,"../util/get_type":162}],186:[function(require,module,exports){ 'use strict'; var validateConstants = require('./validate/validate_constants'); var validate = require('./validate/validate'); var latestStyleSpec = require('./reference/latest'); var validateGlyphsURL = require('./validate/validate_glyphs_url'); /** * Validate a Mapbox GL style against the style specification. This entrypoint, * `mapbox-gl-style-spec/lib/validate_style.min`, is designed to produce as * small a browserify bundle as possible by omitting unnecessary functionality * and legacy style specifications. * * @private * @param {Object} style The style to be validated. * @param {Object} [styleSpec] The style specification to validate against. * If omitted, the latest style spec is used. * @returns {Array} * @example * var validate = require('mapbox-gl-style-spec/lib/validate_style.min'); * var errors = validate(style); */ function validateStyleMin(style, styleSpec) { styleSpec = styleSpec || latestStyleSpec; var errors = []; errors = errors.concat(validate({ key: '', value: style, valueSpec: styleSpec.$root, styleSpec: styleSpec, style: style, objectElementValidators: { glyphs: validateGlyphsURL, '*': function() { return []; } } })); if (style.constants) { errors = errors.concat(validateConstants({ key: 'constants', value: style.constants, style: style, styleSpec: styleSpec })); } return sortErrors(errors); } validateStyleMin.source = wrapCleanErrors(require('./validate/validate_source')); validateStyleMin.light = wrapCleanErrors(require('./validate/validate_light')); validateStyleMin.layer = wrapCleanErrors(require('./validate/validate_layer')); validateStyleMin.filter = wrapCleanErrors(require('./validate/validate_filter')); validateStyleMin.paintProperty = wrapCleanErrors(require('./validate/validate_paint_property')); validateStyleMin.layoutProperty = wrapCleanErrors(require('./validate/validate_layout_property')); function sortErrors(errors) { return [].concat(errors).sort(function (a, b) { return a.line - b.line; }); } function wrapCleanErrors(inner) { return function() { return sortErrors(inner.apply(this, arguments)); }; } module.exports = validateStyleMin; },{"./reference/latest":156,"./validate/validate":167,"./validate/validate_constants":171,"./validate/validate_filter":174,"./validate/validate_glyphs_url":176,"./validate/validate_layer":177,"./validate/validate_layout_property":178,"./validate/validate_light":179,"./validate/validate_paint_property":182,"./validate/validate_source":184}],187:[function(require,module,exports){ 'use strict';// var ZoomHistory = require('./zoom_history'); var EvaluationParameters = function EvaluationParameters(zoom , options) { this.zoom = zoom; if (options) { this.now = options.now; this.fadeDuration = options.fadeDuration; this.zoomHistory = options.zoomHistory; this.transition = options.transition; } else { this.now = 0; this.fadeDuration = 0; this.zoomHistory = new ZoomHistory(); this.transition = {}; } }; EvaluationParameters.prototype.crossFadingFactor = function crossFadingFactor () { if (this.fadeDuration === 0) { return 1; } else { return Math.min((this.now - this.zoomHistory.lastIntegerZoomTime) / this.fadeDuration, 1); } }; module.exports = EvaluationParameters; },{"./zoom_history":217}],188:[function(require,module,exports){ 'use strict';// var styleSpec = require('../style-spec/reference/latest'); var util = require('../util/util'); var Evented = require('../util/evented'); var validateStyle = require('./validate_style'); var ref = require('../util/util'); var sphericalToCartesian = ref.sphericalToCartesian; var Color = require('../style-spec/util/color'); var interpolate = require('../style-spec/util/interpolate'); var ref$1 = require('./properties'); var Properties = ref$1.Properties; var Transitionable = ref$1.Transitionable; var Transitioning = ref$1.Transitioning; var PossiblyEvaluated = ref$1.PossiblyEvaluated; var DataConstantProperty = ref$1.DataConstantProperty; var LightPositionProperty = function LightPositionProperty() { this.specification = styleSpec.light.position; }; LightPositionProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters ) { return sphericalToCartesian(value.expression.evaluate(parameters)); }; LightPositionProperty.prototype.interpolate = function interpolate$1 (a , b , t ) { return { x: interpolate.number(a.x, b.x, t), y: interpolate.number(a.y, b.y, t), z: interpolate.number(a.z, b.z, t), }; }; var properties = new Properties({ "anchor": new DataConstantProperty(styleSpec.light.anchor), "position": new LightPositionProperty(), "color": new DataConstantProperty(styleSpec.light.color), "intensity": new DataConstantProperty(styleSpec.light.intensity), }); var TRANSITION_SUFFIX = '-transition'; /* * Represents the light used to light extruded features. */ var Light = (function (Evented) { function Light(lightOptions ) { Evented.call(this); this._transitionable = new Transitionable(properties); this.setLight(lightOptions); this._transitioning = this._transitionable.untransitioned(); } if ( Evented ) Light.__proto__ = Evented; Light.prototype = Object.create( Evented && Evented.prototype ); Light.prototype.constructor = Light; Light.prototype.getLight = function getLight () { return this._transitionable.serialize(); }; Light.prototype.setLight = function setLight (options ) { var this$1 = this; if (this._validate(validateStyle.light, options)) { return; } for (var name in options) { var value = options[name]; if (util.endsWith(name, TRANSITION_SUFFIX)) { this$1._transitionable.setTransition(name.slice(0, -TRANSITION_SUFFIX.length), value); } else { this$1._transitionable.setValue(name, value); } } }; Light.prototype.updateTransitions = function updateTransitions (parameters ) { this._transitioning = this._transitionable.transitioned(parameters, this._transitioning); }; Light.prototype.hasTransition = function hasTransition () { return this._transitioning.hasTransition(); }; Light.prototype.recalculate = function recalculate (parameters ) { this.properties = this._transitioning.possiblyEvaluate(parameters); }; Light.prototype._validate = function _validate (validate, value ) { return validateStyle.emitErrors(this, validate.call(validateStyle, util.extend({ value: value, // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407 style: {glyphs: true, sprite: true}, styleSpec: styleSpec }))); }; return Light; }(Evented)); module.exports = Light; },{"../style-spec/reference/latest":156,"../style-spec/util/color":158,"../style-spec/util/interpolate":163,"../util/evented":265,"../util/util":280,"./properties":193,"./validate_style":216}],189:[function(require,module,exports){ 'use strict';// var ref = require('../util/mapbox'); var normalizeGlyphsURL = ref.normalizeGlyphsURL; var ajax = require('../util/ajax'); var parseGlyphPBF = require('./parse_glyph_pbf'); module.exports = function (fontstack , range , urlTemplate , requestTransform , callback ) { var begin = range * 256; var end = begin + 255; var request = requestTransform( normalizeGlyphsURL(urlTemplate) .replace('{fontstack}', fontstack) .replace('{range}', (begin + "-" + end)), ajax.ResourceType.Glyphs); ajax.getArrayBuffer(request, function (err, response) { if (err) { callback(err); } else if (response) { var glyphs = {}; for (var i = 0, list = parseGlyphPBF(response.data); i < list.length; i += 1) { var glyph = list[i]; glyphs[glyph.id] = glyph; } callback(null, glyphs); } }); }; },{"../util/ajax":256,"../util/mapbox":272,"./parse_glyph_pbf":191}],190:[function(require,module,exports){ 'use strict';// var ajax = require('../util/ajax'); var browser = require('../util/browser'); var ref = require('../util/mapbox'); var normalizeSpriteURL = ref.normalizeSpriteURL; var ref$1 = require('../util/image'); var RGBAImage = ref$1.RGBAImage; module.exports = function(baseURL , transformRequestCallback , callback ) { var json , image, error; var format = browser.devicePixelRatio > 1 ? '@2x' : ''; ajax.getJSON(transformRequestCallback(normalizeSpriteURL(baseURL, format, '.json'), ajax.ResourceType.SpriteJSON), function (err, data) { if (!error) { error = err; json = data; maybeComplete(); } }); ajax.getImage(transformRequestCallback(normalizeSpriteURL(baseURL, format, '.png'), ajax.ResourceType.SpriteImage), function (err, img) { if (!error) { error = err; image = img; maybeComplete(); } }); function maybeComplete() { if (error) { callback(error); } else if (json && image) { var imageData = browser.getImageData(image); var result = {}; for (var id in json) { var ref = json[id]; var width = ref.width; var height = ref.height; var x = ref.x; var y = ref.y; var sdf = ref.sdf; var pixelRatio = ref.pixelRatio; var data = new RGBAImage({width: width, height: height}); RGBAImage.copy(imageData, data, {x: x, y: y}, {x: 0, y: 0}, {width: width, height: height}); result[id] = {data: data, pixelRatio: pixelRatio, sdf: sdf}; } callback(null, result); } } }; },{"../util/ajax":256,"../util/browser":257,"../util/image":268,"../util/mapbox":272}],191:[function(require,module,exports){ 'use strict';// var ref = require('../util/image'); var AlphaImage = ref.AlphaImage; var Protobuf = require('pbf'); var border = 3; function readFontstacks(tag , glyphs , pbf ) { if (tag === 1) { pbf.readMessage(readFontstack, glyphs); } } function readFontstack(tag , glyphs , pbf ) { if (tag === 3) { var ref = pbf.readMessage(readGlyph, {}); var id = ref.id; var bitmap = ref.bitmap; var width = ref.width; var height = ref.height; var left = ref.left; var top = ref.top; var advance = ref.advance; glyphs.push({ id: id, bitmap: new AlphaImage({ width: width + 2 * border, height: height + 2 * border }, bitmap), metrics: {width: width, height: height, left: left, top: top, advance: advance} }); } } function readGlyph(tag , glyph , pbf ) { if (tag === 1) { glyph.id = pbf.readVarint(); } else if (tag === 2) { glyph.bitmap = pbf.readBytes(); } else if (tag === 3) { glyph.width = pbf.readVarint(); } else if (tag === 4) { glyph.height = pbf.readVarint(); } else if (tag === 5) { glyph.left = pbf.readSVarint(); } else if (tag === 6) { glyph.top = pbf.readSVarint(); } else if (tag === 7) { glyph.advance = pbf.readVarint(); } } module.exports = function (data ) { return new Protobuf(data).readFields(readFontstacks, []); }; module.exports.GLYPH_PBF_BORDER = border; },{"../util/image":268,"pbf":31}],192:[function(require,module,exports){ 'use strict';// var browser = require('../util/browser'); var Placement = require('../symbol/placement'); var LayerPlacement = function LayerPlacement() { this._currentTileIndex = 0; this._seenCrossTileIDs = {}; }; LayerPlacement.prototype.continuePlacement = function continuePlacement (tiles , placement , showCollisionBoxes , styleLayer , shouldPausePlacement) { var this$1 = this; while (this._currentTileIndex < tiles.length) { var tile = tiles[this$1._currentTileIndex]; placement.placeLayerTile(styleLayer, tile, showCollisionBoxes, this$1._seenCrossTileIDs); this$1._currentTileIndex++; if (shouldPausePlacement()) { return true; } } }; var PauseablePlacement = function PauseablePlacement(transform , order , forceFullPlacement , showCollisionBoxes , fadeDuration ) { this.placement = new Placement(transform, fadeDuration); this._currentPlacementIndex = order.length - 1; this._forceFullPlacement = forceFullPlacement; this._showCollisionBoxes = showCollisionBoxes; this._done = false; }; PauseablePlacement.prototype.isDone = function isDone () { return this._done; }; PauseablePlacement.prototype.continuePlacement = function continuePlacement (order , layers , layerTiles ) { var this$1 = this; var startTime = browser.now(); var shouldPausePlacement = function () { var elapsedTime = browser.now() - startTime; return this$1._forceFullPlacement ? false : elapsedTime > 2; }; while (this._currentPlacementIndex >= 0) { var layerId = order[this$1._currentPlacementIndex]; var layer = layers[layerId]; var placementZoom = this$1.placement.collisionIndex.transform.zoom; if (layer.type === 'symbol' && (!layer.minzoom || layer.minzoom <= placementZoom) && (!layer.maxzoom || layer.maxzoom > placementZoom)) { if (!this$1._inProgressLayer) { this$1._inProgressLayer = new LayerPlacement(); } var pausePlacement = this$1._inProgressLayer.continuePlacement(layerTiles[layer.source], this$1.placement, this$1._showCollisionBoxes, layer, shouldPausePlacement); if (pausePlacement) { // We didn't finish placing all layers within 2ms, // but we can keep rendering with a partial placement // We'll resume here on the next frame return; } delete this$1._inProgressLayer; } this$1._currentPlacementIndex--; } this._done = true; }; PauseablePlacement.prototype.commit = function commit (previousPlacement , now ) { this.placement.commit(previousPlacement, now); return this.placement; }; module.exports = PauseablePlacement; },{"../symbol/placement":228,"../util/browser":257}],193:[function(require,module,exports){ 'use strict';// var assert = require('assert'); var ref = require('../util/util'); var clone = ref.clone; var extend = ref.extend; var easeCubicInOut = ref.easeCubicInOut; var interpolate = require('../style-spec/util/interpolate'); var ref$1 = require('../style-spec/expression'); var normalizePropertyExpression = ref$1.normalizePropertyExpression; var Color = require('../style-spec/util/color'); var ref$2 = require('../util/web_worker_transfer'); var register = ref$2.register; /** * Implements a number of classes that define state and behavior for paint and layout properties, most * importantly their respective evaluation chains: * * Transitionable paint property value * → Transitioning paint property value * → Possibly evaluated paint property value * → Fully evaluated paint property value * * Layout property value * → Possibly evaluated layout property value * → Fully evaluated layout property value * * @module * @private */ /** * Implementations of the `Property` interface: * * * Hold metadata about a property that's independent of any specific value: stuff like the type of the value, * the default value, etc. This comes from the style specification JSON. * * Define behavior that needs to be polymorphic across different properties: "possibly evaluating" * an input value (see below), and interpolating between two possibly-evaluted values. * * The type `T` is the fully-evaluated value type (e.g. `number`, `string`, `Color`). * The type `R` is the intermediate "possibly evaluated" value type. See below. * * There are two main implementations of the interface -- one for properties that allow data-driven values, * and one for properties that don't. There are a few "special case" implementations as well: one for properties * which cross-fade between two values rather than interpolating, one for `heatmap-color`, and one for * `light-position`. * * @private */ /** * `PropertyValue` represents the value part of a property key-value unit. It's used to represent both * paint and layout property values, and regardless of whether or not their property supports data-driven * expressions. * * `PropertyValue` stores the raw input value as seen in a style or a runtime styling API call, i.e. one of the * following: * * * A constant value of the type appropriate for the property * * A function which produces a value of that type (but functions are quasi-deprecated in favor of expressions) * * An expression which produces a value of that type * * "undefined"/"not present", in which case the property is assumed to take on its default value. * * In addition to storing the original input value, `PropertyValue` also stores a normalized representation, * effectively treating functions as if they are expressions, and constant or default values as if they are * (constant) expressions. * * @private */ var PropertyValue = function PropertyValue(property , value ) { this.property = property; this.value = value; this.expression = normalizePropertyExpression(value === undefined ? property.specification.default : value, property.specification); }; PropertyValue.prototype.isDataDriven = function isDataDriven () { return this.expression.kind === 'source' || this.expression.kind === 'composite'; }; PropertyValue.prototype.possiblyEvaluate = function possiblyEvaluate (parameters ) { return this.property.possiblyEvaluate(this, parameters); }; // ------- Transitionable ------- /** * Paint properties are _transitionable_: they can change in a fluid manner, interpolating or cross-fading between * old and new value. The duration of the transition, and the delay before it begins, is configurable. * * `TransitionablePropertyValue` is a compositional class that stores both the property value and that transition * configuration. * * A `TransitionablePropertyValue` can calculate the next step in the evaluation chain for paint property values: * `TransitioningPropertyValue`. * * @private */ var TransitionablePropertyValue = function TransitionablePropertyValue(property ) { this.property = property; this.value = new PropertyValue(property, undefined); }; TransitionablePropertyValue.prototype.transitioned = function transitioned (parameters , prior ) { return new TransitioningPropertyValue(this.property, this.value, prior, // eslint-disable-line no-use-before-define extend({}, parameters.transition, this.transition), parameters.now); }; TransitionablePropertyValue.prototype.untransitioned = function untransitioned () { return new TransitioningPropertyValue(this.property, this.value, null, {}, 0); // eslint-disable-line no-use-before-define }; /** * A helper type: given an object type `Properties` whose values are each of type `Property`, it calculates * an object type with the same keys and values of type `TransitionablePropertyValue`. * * @private */ /** * `Transitionable` stores a map of all (property name, `TransitionablePropertyValue`) pairs for paint properties of a * given layer type. It can calculate the `TransitioningPropertyValue`s for all of them at once, producing a * `Transitioning` instance for the same set of properties. * * @private */ var Transitionable = function Transitionable(properties ) { this._properties = properties; this._values = (Object.create(properties.defaultTransitionablePropertyValues) ); }; Transitionable.prototype.getValue = function getValue (name ) { return clone(this._values[name].value.value); }; Transitionable.prototype.setValue = function setValue (name , value ) { if (!this._values.hasOwnProperty(name)) { this._values[name] = new TransitionablePropertyValue(this._values[name].property); } // Note that we do not _remove_ an own property in the case where a value is being reset // to the default: the transition might still be non-default. this._values[name].value = new PropertyValue(this._values[name].property, value === null ? undefined : clone(value)); }; Transitionable.prototype.getTransition = function getTransition (name ) { return clone(this._values[name].transition); }; Transitionable.prototype.setTransition = function setTransition (name , value ) { if (!this._values.hasOwnProperty(name)) { this._values[name] = new TransitionablePropertyValue(this._values[name].property); } this._values[name].transition = clone(value) || undefined; }; Transitionable.prototype.serialize = function serialize () { var this$1 = this; var result = {}; for (var i = 0, list = Object.keys(this$1._values); i < list.length; i += 1) { var property = list[i]; var value = this$1.getValue(property); if (value !== undefined) { result[property] = value; } var transition = this$1.getTransition(property); if (transition !== undefined) { result[(property + "-transition")] = transition; } } return result; }; Transitionable.prototype.transitioned = function transitioned (parameters , prior ) { var this$1 = this; var result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define for (var i = 0, list = Object.keys(this$1._values); i < list.length; i += 1) { var property = list[i]; result._values[property] = this$1._values[property].transitioned(parameters, prior._values[property]); } return result; }; Transitionable.prototype.untransitioned = function untransitioned () { var this$1 = this; var result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define for (var i = 0, list = Object.keys(this$1._values); i < list.length; i += 1) { var property = list[i]; result._values[property] = this$1._values[property].untransitioned(); } return result; }; // ------- Transitioning ------- /** * `TransitioningPropertyValue` implements the first of two intermediate steps in the evaluation chain of a paint * property value. In this step, transitions between old and new values are handled: as long as the transition is in * progress, `TransitioningPropertyValue` maintains a reference to the prior value, and interpolates between it and * the new value based on the current time and the configured transition duration and delay. The product is the next * step in the evaluation chain: the "possibly evaluated" result type `R`. See below for more on this concept. * * @private */ var TransitioningPropertyValue = function TransitioningPropertyValue(property , value , prior , transition , now ) { this.property = property; this.value = value; this.begin = now + transition.delay || 0; this.end = this.begin + transition.duration || 0; if (property.specification.transition && (transition.delay || transition.duration)) { this.prior = prior; } }; TransitioningPropertyValue.prototype.possiblyEvaluate = function possiblyEvaluate (parameters ) { var now = parameters.now || 0; var finalValue = this.value.possiblyEvaluate(parameters); var prior = this.prior; if (!prior) { // No prior value. return finalValue; } else if (now > this.end) { // Transition from prior value is now complete. this.prior = null; return finalValue; } else if (this.value.isDataDriven()) { // Transitions to data-driven properties are not supported. // We snap immediately to the data-driven value so that, when we perform layout, // we see the data-driven function and can use it to populate vertex buffers. this.prior = null; return finalValue; } else if (now < this.begin) { // Transition hasn't started yet. return prior.possiblyEvaluate(parameters); } else { // Interpolate between recursively-calculated prior value and final. var t = (now - this.begin) / (this.end - this.begin); return this.property.interpolate(prior.possiblyEvaluate(parameters), finalValue, easeCubicInOut(t)); } }; /** * A helper type: given an object type `Properties` whose values are each of type `Property`, it calculates * an object type with the same keys and values of type `TransitioningPropertyValue`. * * @private */ /** * `Transitioning` stores a map of all (property name, `TransitioningPropertyValue`) pairs for paint properties of a * given layer type. It can calculate the possibly-evaluated values for all of them at once, producing a * `PossiblyEvaluated` instance for the same set of properties. * * @private */ var Transitioning = function Transitioning(properties ) { this._properties = properties; this._values = (Object.create(properties.defaultTransitioningPropertyValues) ); }; Transitioning.prototype.possiblyEvaluate = function possiblyEvaluate (parameters ) { var this$1 = this; var result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define for (var i = 0, list = Object.keys(this$1._values); i < list.length; i += 1) { var property = list[i]; result._values[property] = this$1._values[property].possiblyEvaluate(parameters); } return result; }; Transitioning.prototype.hasTransition = function hasTransition () { var this$1 = this; for (var i = 0, list = Object.keys(this$1._values); i < list.length; i += 1) { var property = list[i]; if (this$1._values[property].prior) { return true; } } return false; }; // ------- Layout ------- /** * A helper type: given an object type `Properties` whose values are each of type `Property`, it calculates * an object type with the same keys and values of type `PropertyValue`. * * @private */ /** * Because layout properties are not transitionable, they have a simpler representation and evaluation chain than * paint properties: `PropertyValue`s are possibly evaluated, producing possibly evaluated values, which are then * fully evaluated. * * `Layout` stores a map of all (property name, `PropertyValue`) pairs for layout properties of a * given layer type. It can calculate the possibly-evaluated values for all of them at once, producing a * `PossiblyEvaluated` instance for the same set of properties. * * @private */ var Layout = function Layout(properties ) { this._properties = properties; this._values = (Object.create(properties.defaultPropertyValues) ); }; Layout.prototype.getValue = function getValue (name ) { return clone(this._values[name].value); }; Layout.prototype.setValue = function setValue (name , value ) { this._values[name] = new PropertyValue(this._values[name].property, value === null ? undefined : clone(value)); }; Layout.prototype.serialize = function serialize () { var this$1 = this; var result = {}; for (var i = 0, list = Object.keys(this$1._values); i < list.length; i += 1) { var property = list[i]; var value = this$1.getValue(property); if (value !== undefined) { result[property] = value; } } return result; }; Layout.prototype.possiblyEvaluate = function possiblyEvaluate (parameters ) { var this$1 = this; var result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define for (var i = 0, list = Object.keys(this$1._values); i < list.length; i += 1) { var property = list[i]; result._values[property] = this$1._values[property].possiblyEvaluate(parameters); } return result; }; // ------- PossiblyEvaluated ------- /** * "Possibly evaluated value" is an intermediate stage in the evaluation chain for both paint and layout property * values. The purpose of this stage is to optimize away unnecessary recalculations for data-driven properties. Code * which uses data-driven property values must assume that the value is dependent on feature data, and request that it * be evaluated for each feature. But when that property value is in fact a constant or camera function, the calculation * will not actually depend on the feature, and we can benefit from returning the prior result of having done the * evaluation once, ahead of time, in an intermediate step whose inputs are just the value and "global" parameters * such as current zoom level. * * `PossiblyEvaluatedValue` represents the three possible outcomes of this step: if the input value was a constant or * camera expression, then the "possibly evaluated" result is a constant value. Otherwise, the input value was either * a source or composite expression, and we must defer final evaluation until supplied a feature. We separate * the source and composite cases because they are handled differently when generating GL attributes, buffers, and * uniforms. * * Note that `PossiblyEvaluatedValue` (and `PossiblyEvaluatedPropertyValue`, below) are _not_ used for properties that * do not allow data-driven values. For such properties, we know that the "possibly evaluated" result is always a constant * scalar value. See below. * * @private */ /** * `PossiblyEvaluatedPropertyValue` is used for data-driven paint and layout property values. It holds a * `PossiblyEvaluatedValue` and the `GlobalProperties` that were used to generate it. You're not allowed to supply * a different set of `GlobalProperties` when performing the final evaluation because they would be ignored in the * case where the input value was a constant or camera function. * * @private */ var PossiblyEvaluatedPropertyValue = function PossiblyEvaluatedPropertyValue(property , value , globals ) { this.property = property; this.value = value; this.globals = globals; }; PossiblyEvaluatedPropertyValue.prototype.isConstant = function isConstant () { return this.value.kind === 'constant'; }; PossiblyEvaluatedPropertyValue.prototype.constantOr = function constantOr (value ) { if (this.value.kind === 'constant') { return this.value.value; } else { return value; } }; PossiblyEvaluatedPropertyValue.prototype.evaluate = function evaluate (feature ) { return this.property.evaluate(this.value, this.globals, feature); }; /** * A helper type: given an object type `Properties` whose values are each of type `Property`, it calculates * an object type with the same keys, and values of type `R`. * * For properties that don't allow data-driven values, `R` is a scalar type such as `number`, `string`, or `Color`. * For data-driven properties, it is `PossiblyEvaluatedPropertyValue`. Critically, the type definitions are set up * in a way that allows flow to know which of these two cases applies for any given property name, and if you attempt * to use a `PossiblyEvaluatedPropertyValue` as if it was a scalar, or vice versa, you will get a type error. (However, * there's at least one case in which flow fails to produce a type error that you should be aware of: in a context such * as `layer.paint.get('foo-opacity') === 0`, if `foo-opacity` is data-driven, than the left-hand side is of type * `PossiblyEvaluatedPropertyValue`, but flow will not complain about comparing this to a number using `===`. * See https://github.com/facebook/flow/issues/2359.) * * There's also a third, special case possiblity for `R`: for cross-faded properties, it's `?CrossFaded`. * * @private */ /** * `PossiblyEvaluated` stores a map of all (property name, `R`) pairs for paint or layout properties of a * given layer type. * @private */ var PossiblyEvaluated = function PossiblyEvaluated(properties ) { this._properties = properties; this._values = (Object.create(properties.defaultPossiblyEvaluatedValues) ); }; PossiblyEvaluated.prototype.get = function get (name ) { return this._values[name]; }; /** * An implementation of `Property` for properties that do not permit data-driven (source or composite) expressions. * This restriction allows us to declare statically that the result of possibly evaluating this kind of property * is in fact always the scalar type `T`, and can be used without further evaluating the value on a per-feature basis. * * @private */ var DataConstantProperty = function DataConstantProperty(specification ) { this.specification = specification; }; DataConstantProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters ) { assert(!value.isDataDriven()); return value.expression.evaluate(parameters); }; DataConstantProperty.prototype.interpolate = function interpolate$1 (a , b , t ) { var interp = (interpolate )[this.specification.type]; if (interp) { return interp(a, b, t); } else { return a; } }; /** * An implementation of `Property` for properties that permit data-driven (source or composite) expressions. * The result of possibly evaluating this kind of property is `PossiblyEvaluatedPropertyValue`; obtaining * a scalar value `T` requires further evaluation on a per-feature basis. * * @private */ var DataDrivenProperty = function DataDrivenProperty(specification ) { this.specification = specification; }; DataDrivenProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters ) { if (value.expression.kind === 'constant' || value.expression.kind === 'camera') { return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: value.expression.evaluate(parameters)}, parameters); } else { return new PossiblyEvaluatedPropertyValue(this, value.expression, parameters); } }; DataDrivenProperty.prototype.interpolate = function interpolate$2 (a , b , t ) { // If either possibly-evaluated value is non-constant, give up: we aren't able to interpolate data-driven values. if (a.value.kind !== 'constant' || b.value.kind !== 'constant') { return a; } // Special case hack solely for fill-outline-color. if (a.value.value === undefined || b.value.value === undefined) { return (undefined ); } var interp = (interpolate )[this.specification.type]; if (interp) { return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: interp(a.value.value, b.value.value, t)}, a.globals); } else { return a; } }; DataDrivenProperty.prototype.evaluate = function evaluate (value , globals , feature ) { if (value.kind === 'constant') { return value.value; } else { return value.evaluate(globals, feature); } }; /** * An implementation of `Property` for `*-pattern` and `line-dasharray`, which are transitioned by cross-fading * rather than interpolation. * * @private */ var CrossFadedProperty = function CrossFadedProperty(specification ) { this.specification = specification; }; CrossFadedProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters ) { if (value.value === undefined) { return undefined; } else if (value.expression.kind === 'constant') { var constant = value.expression.evaluate(parameters); return this._calculate(constant, constant, constant, parameters); } else { assert(!value.isDataDriven()); return this._calculate( value.expression.evaluate({zoom: parameters.zoom - 1.0}), value.expression.evaluate({zoom: parameters.zoom}), value.expression.evaluate({zoom: parameters.zoom + 1.0}), parameters); } }; CrossFadedProperty.prototype._calculate = function _calculate (min , mid , max , parameters ) { var z = parameters.zoom; var fraction = z - Math.floor(z); var t = parameters.crossFadingFactor(); return z > parameters.zoomHistory.lastIntegerZoom ? { from: min, to: mid, fromScale: 2, toScale: 1, t: fraction + (1 - fraction) * t } : { from: max, to: mid, fromScale: 0.5, toScale: 1, t: 1 - (1 - t) * fraction }; }; CrossFadedProperty.prototype.interpolate = function interpolate (a ) { return a; }; /** * An implementation of `Property` for `heatmap-color`. Evaluation and interpolation are no-ops: the real * evaluation happens in HeatmapStyleLayer. * * @private */ var HeatmapColorProperty = function HeatmapColorProperty(specification ) { this.specification = specification; }; HeatmapColorProperty.prototype.possiblyEvaluate = function possiblyEvaluate () {}; HeatmapColorProperty.prototype.interpolate = function interpolate () {}; /** * `Properties` holds objects containing default values for the layout or paint property set of a given * layer type. These objects are immutable, and they are used as the prototypes for the `_values` members of * `Transitionable`, `Transitioning`, `Layout`, and `PossiblyEvaluated`. This allows these classes to avoid * doing work in the common case where a property has no explicit value set and should be considered to take * on the default value: using `for (const property of Object.keys(this._values))`, they can iterate over * only the _own_ properties of `_values`, skipping repeated calculation of transitions and possible/final * evaluations for defaults, the result of which will always be the same. * * @private */ var Properties = function Properties(properties ) { var this$1 = this; this.properties = properties; this.defaultPropertyValues = ({} ); this.defaultTransitionablePropertyValues = ({} ); this.defaultTransitioningPropertyValues = ({} ); this.defaultPossiblyEvaluatedValues = ({} ); for (var property in properties) { var prop = properties[property]; var defaultPropertyValue = this$1.defaultPropertyValues[property] = new PropertyValue(prop, undefined); var defaultTransitionablePropertyValue = this$1.defaultTransitionablePropertyValues[property] = new TransitionablePropertyValue(prop); this$1.defaultTransitioningPropertyValues[property] = defaultTransitionablePropertyValue.untransitioned(); this$1.defaultPossiblyEvaluatedValues[property] = defaultPropertyValue.possiblyEvaluate(({} )); } }; register('DataDrivenProperty', DataDrivenProperty); register('DataConstantProperty', DataConstantProperty); register('CrossFadedProperty', CrossFadedProperty); register('HeatmapColorProperty', HeatmapColorProperty); module.exports = { PropertyValue: PropertyValue, Transitionable: Transitionable, Transitioning: Transitioning, Layout: Layout, PossiblyEvaluatedPropertyValue: PossiblyEvaluatedPropertyValue, PossiblyEvaluated: PossiblyEvaluated, DataConstantProperty: DataConstantProperty, DataDrivenProperty: DataDrivenProperty, CrossFadedProperty: CrossFadedProperty, HeatmapColorProperty: HeatmapColorProperty, Properties: Properties }; },{"../style-spec/expression":144,"../style-spec/util/color":158,"../style-spec/util/interpolate":163,"../util/util":280,"../util/web_worker_transfer":283,"assert":13}],194:[function(require,module,exports){ 'use strict';// var Point = require('@mapbox/point-geometry'); function getMaximumPaintValue(property , layer , bucket ) { var value = ((layer.paint ).get(property) ).value; if (value.kind === 'constant') { return value.value; } else { var binders = bucket.programConfigurations.get(layer.id).binders; return binders[property].statistics.max; } } function translateDistance(translate ) { return Math.sqrt(translate[0] * translate[0] + translate[1] * translate[1]); } function translate(queryGeometry , translate , translateAnchor , bearing , pixelsToTileUnits ) { if (!translate[0] && !translate[1]) { return queryGeometry; } var pt = Point.convert(translate); if (translateAnchor === "viewport") { pt._rotate(-bearing); } var translated = []; for (var i = 0; i < queryGeometry.length; i++) { var ring = queryGeometry[i]; var translatedRing = []; for (var k = 0; k < ring.length; k++) { translatedRing.push(ring[k].sub(pt._mult(pixelsToTileUnits))); } translated.push(translatedRing); } return translated; } module.exports = { getMaximumPaintValue: getMaximumPaintValue, translateDistance: translateDistance, translate: translate }; },{"@mapbox/point-geometry":4}],195:[function(require,module,exports){ 'use strict';// var assert = require('assert'); var Evented = require('../util/evented'); var StyleLayer = require('./style_layer'); var loadSprite = require('./load_sprite'); var ImageManager = require('../render/image_manager'); var GlyphManager = require('../render/glyph_manager'); var Light = require('./light'); var LineAtlas = require('../render/line_atlas'); var util = require('../util/util'); var ajax = require('../util/ajax'); var mapbox = require('../util/mapbox'); var browser = require('../util/browser'); var Dispatcher = require('../util/dispatcher'); var validateStyle = require('./validate_style'); var getSourceType = require('../source/source').getType; var setSourceType = require('../source/source').setType; var QueryFeatures = require('../source/query_features'); var SourceCache = require('../source/source_cache'); var GeoJSONSource = require('../source/geojson_source'); var styleSpec = require('../style-spec/reference/latest'); var getWorkerPool = require('../util/global_worker_pool'); var deref = require('../style-spec/deref'); var diff = require('../style-spec/diff'); var rtlTextPlugin = require('../source/rtl_text_plugin'); var PauseablePlacement = require('./pauseable_placement'); var ZoomHistory = require('./zoom_history'); var CrossTileSymbolIndex = require('../symbol/cross_tile_symbol_index'); var supportedDiffOperations = util.pick(diff.operations, [ 'addLayer', 'removeLayer', 'setPaintProperty', 'setLayoutProperty', 'setFilter', 'addSource', 'removeSource', 'setLayerZoomRange', 'setLight', 'setTransition', 'setGeoJSONSourceData' ]); var ignoredDiffOperations = util.pick(diff.operations, [ 'setCenter', 'setZoom', 'setBearing', 'setPitch' ]); /** * @private */ var Style = (function (Evented) { function Style(map , options) { var this$1 = this; if ( options === void 0 ) options = {}; Evented.call(this); this.map = map; this.dispatcher = new Dispatcher(getWorkerPool(), this); this.imageManager = new ImageManager(); this.glyphManager = new GlyphManager(map._transformRequest, options.localIdeographFontFamily); this.lineAtlas = new LineAtlas(256, 512); this.crossTileSymbolIndex = new CrossTileSymbolIndex(); this._layers = {}; this._order = []; this.sourceCaches = {}; this.zoomHistory = new ZoomHistory(); this._loaded = false; this._resetUpdates(); var self = this; this._rtlTextPluginCallback = rtlTextPlugin.registerForPluginAvailability(function (args) { self.dispatcher.broadcast('loadRTLTextPlugin', args.pluginBlobURL, args.errorCallback); for (var id in self.sourceCaches) { self.sourceCaches[id].reload(); // Should be a no-op if the plugin loads before any tiles load } }); this.on('data', function (event) { if (event.dataType !== 'source' || event.sourceDataType !== 'metadata') { return; } var sourceCache = this$1.sourceCaches[event.sourceId]; if (!sourceCache) { return; } var source = sourceCache.getSource(); if (!source || !source.vectorLayerIds) { return; } for (var layerId in this$1._layers) { var layer = this$1._layers[layerId]; if (layer.source === source.id) { this$1._validateLayer(layer); } } }); } if ( Evented ) Style.__proto__ = Evented; Style.prototype = Object.create( Evented && Evented.prototype ); Style.prototype.constructor = Style; Style.prototype.loadURL = function loadURL (url , options) { var this$1 = this; if ( options === void 0 ) options = {}; this.fire('dataloading', {dataType: 'style'}); var validate = typeof options.validate === 'boolean' ? options.validate : !mapbox.isMapboxURL(url); url = mapbox.normalizeStyleURL(url, options.accessToken); var request = this.map._transformRequest(url, ajax.ResourceType.Style); ajax.getJSON(request, function (error, json) { if (error) { this$1.fire('error', {error: error}); } else if (json) { this$1._load((json ), validate); } }); }; Style.prototype.loadJSON = function loadJSON (json , options) { var this$1 = this; if ( options === void 0 ) options = {}; this.fire('dataloading', {dataType: 'style'}); browser.frame(function () { this$1._load(json, options.validate !== false); }); }; Style.prototype._load = function _load (json , validate ) { var this$1 = this; if (validate && validateStyle.emitErrors(this, validateStyle(json))) { return; } this._loaded = true; this.stylesheet = json; for (var id in json.sources) { this$1.addSource(id, json.sources[id], {validate: false}); } if (json.sprite) { loadSprite(json.sprite, this.map._transformRequest, function (err, images) { if (err) { this$1.fire('error', err); } else if (images) { for (var id in images) { this$1.imageManager.addImage(id, images[id]); } } this$1.imageManager.setLoaded(true); this$1.fire('data', {dataType: 'style'}); }); } else { this.imageManager.setLoaded(true); } this.glyphManager.setURL(json.glyphs); var layers = deref(this.stylesheet.layers); this._order = layers.map(function (layer) { return layer.id; }); this._layers = {}; for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; layer = StyleLayer.create(layer); layer.setEventedParent(this$1, {layer: {id: layer.id}}); this$1._layers[layer.id] = layer; } this.dispatcher.broadcast('setLayers', this._serializeLayers(this._order)); this.light = new Light(this.stylesheet.light); this.fire('data', {dataType: 'style'}); this.fire('style.load'); }; Style.prototype._validateLayer = function _validateLayer (layer ) { var sourceCache = this.sourceCaches[layer.source]; if (!sourceCache) { return; } var sourceLayer = layer.sourceLayer; if (!sourceLayer) { return; } var source = sourceCache.getSource(); if (source.type === 'geojson' || (source.vectorLayerIds && source.vectorLayerIds.indexOf(sourceLayer) === -1)) { this.fire('error', { error: new Error( "Source layer \"" + sourceLayer + "\" " + "does not exist on source \"" + (source.id) + "\" " + "as specified by style layer \"" + (layer.id) + "\"" ) }); } }; Style.prototype.loaded = function loaded () { var this$1 = this; if (!this._loaded) { return false; } if (Object.keys(this._updatedSources).length) { return false; } for (var id in this$1.sourceCaches) { if (!this$1.sourceCaches[id].loaded()) { return false; } } if (!this.imageManager.isLoaded()) { return false; } return true; }; Style.prototype._serializeLayers = function _serializeLayers (ids ) { var this$1 = this; return ids.map(function (id) { return this$1._layers[id].serialize(); }); }; Style.prototype.hasTransitions = function hasTransitions () { var this$1 = this; if (this.light && this.light.hasTransition()) { return true; } for (var id in this$1.sourceCaches) { if (this$1.sourceCaches[id].hasTransition()) { return true; } } for (var id$1 in this$1._layers) { if (this$1._layers[id$1].hasTransition()) { return true; } } return false; }; Style.prototype._checkLoaded = function _checkLoaded () { if (!this._loaded) { throw new Error('Style is not done loading'); } }; /** * Apply queued style updates in a batch and recalculate zoom-dependent paint properties. */ Style.prototype.update = function update (parameters ) { var this$1 = this; if (!this._loaded) { return; } if (this._changed) { var updatedIds = Object.keys(this._updatedLayers); var removedIds = Object.keys(this._removedLayers); if (updatedIds.length || removedIds.length) { this._updateWorkerLayers(updatedIds, removedIds); } for (var id in this$1._updatedSources) { var action = this$1._updatedSources[id]; assert(action === 'reload' || action === 'clear'); if (action === 'reload') { this$1._reloadSource(id); } else if (action === 'clear') { this$1._clearSource(id); } } for (var id$1 in this$1._updatedPaintProps) { this$1._layers[id$1].updateTransitions(parameters); } this.light.updateTransitions(parameters); this._resetUpdates(); this.fire('data', {dataType: 'style'}); } for (var sourceId in this$1.sourceCaches) { this$1.sourceCaches[sourceId].used = false; } for (var i = 0, list = this$1._order; i < list.length; i += 1) { var layerId = list[i]; var layer = this$1._layers[layerId]; layer.recalculate(parameters); if (!layer.isHidden(parameters.zoom) && layer.source) { this$1.sourceCaches[layer.source].used = true; } } this.light.recalculate(parameters); this.z = parameters.zoom; }; Style.prototype._updateWorkerLayers = function _updateWorkerLayers (updatedIds , removedIds ) { this.dispatcher.broadcast('updateLayers', { layers: this._serializeLayers(updatedIds), removedIds: removedIds }); }; Style.prototype._resetUpdates = function _resetUpdates () { this._changed = false; this._updatedLayers = {}; this._removedLayers = {}; this._updatedSources = {}; this._updatedPaintProps = {}; }; /** * Update this style's state to match the given style JSON, performing only * the necessary mutations. * * May throw an Error ('Unimplemented: METHOD') if the mapbox-gl-style-spec * diff algorithm produces an operation that is not supported. * * @returns {boolean} true if any changes were made; false otherwise * @private */ Style.prototype.setState = function setState (nextState ) { var this$1 = this; this._checkLoaded(); if (validateStyle.emitErrors(this, validateStyle(nextState))) { return false; } nextState = util.clone(nextState); nextState.layers = deref(nextState.layers); var changes = diff(this.serialize(), nextState) .filter(function (op) { return !(op.command in ignoredDiffOperations); }); if (changes.length === 0) { return false; } var unimplementedOps = changes.filter(function (op) { return !(op.command in supportedDiffOperations); }); if (unimplementedOps.length > 0) { throw new Error(("Unimplemented: " + (unimplementedOps.map(function (op) { return op.command; }).join(', ')) + ".")); } changes.forEach(function (op) { if (op.command === 'setTransition') { // `transition` is always read directly off of // `this.stylesheet`, which we update below return; } (this$1 )[op.command].apply(this$1, op.args); }); this.stylesheet = nextState; return true; }; Style.prototype.addImage = function addImage (id , image ) { if (this.getImage(id)) { return this.fire('error', {error: new Error('An image with this name already exists.')}); } this.imageManager.addImage(id, image); this.fire('data', {dataType: 'style'}); }; Style.prototype.getImage = function getImage (id ) { return this.imageManager.getImage(id); }; Style.prototype.removeImage = function removeImage (id ) { if (!this.getImage(id)) { return this.fire('error', {error: new Error('No image with this name exists.')}); } this.imageManager.removeImage(id); this.fire('data', {dataType: 'style'}); }; Style.prototype.addSource = function addSource (id , source , options ) { var this$1 = this; this._checkLoaded(); if (this.sourceCaches[id] !== undefined) { throw new Error('There is already a source with this ID'); } if (!source.type) { throw new Error(("The type property must be defined, but the only the following properties were given: " + (Object.keys(source).join(', ')) + ".")); } var builtIns = ['vector', 'raster', 'geojson', 'video', 'image', 'canvas']; var shouldValidate = builtIns.indexOf(source.type) >= 0; if (shouldValidate && this._validate(validateStyle.source, ("sources." + id), source, null, options)) { return; } if (this.map && this.map._collectResourceTiming) { (source ).collectResourceTiming = true; } var sourceCache = this.sourceCaches[id] = new SourceCache(id, source, this.dispatcher); sourceCache.style = this; sourceCache.setEventedParent(this, function () { return ({ isSourceLoaded: this$1.loaded(), source: sourceCache.serialize(), sourceId: id }); }); sourceCache.onAdd(this.map); this._changed = true; }; /** * Remove a source from this stylesheet, given its id. * @param {string} id id of the source to remove * @throws {Error} if no source is found with the given ID */ Style.prototype.removeSource = function removeSource (id ) { var this$1 = this; this._checkLoaded(); if (this.sourceCaches[id] === undefined) { throw new Error('There is no source with this ID'); } for (var layerId in this$1._layers) { if (this$1._layers[layerId].source === id) { return this$1.fire('error', {error: new Error(("Source \"" + id + "\" cannot be removed while layer \"" + layerId + "\" is using it."))}); } } var sourceCache = this.sourceCaches[id]; delete this.sourceCaches[id]; delete this._updatedSources[id]; sourceCache.fire('data', {sourceDataType: 'metadata', dataType:'source', sourceId: id}); sourceCache.setEventedParent(null); sourceCache.clearTiles(); if (sourceCache.onRemove) { sourceCache.onRemove(this.map); } this._changed = true; }; /** * Set the data of a GeoJSON source, given its id. * @param {string} id id of the source * @param {GeoJSON|string} data GeoJSON source */ Style.prototype.setGeoJSONSourceData = function setGeoJSONSourceData (id , data ) { this._checkLoaded(); assert(this.sourceCaches[id] !== undefined, 'There is no source with this ID'); var geojsonSource = (this.sourceCaches[id].getSource() ); assert(geojsonSource.type === 'geojson'); geojsonSource.setData(data); this._changed = true; }; /** * Get a source by id. * @param {string} id id of the desired source * @returns {Object} source */ Style.prototype.getSource = function getSource (id ) { return this.sourceCaches[id] && this.sourceCaches[id].getSource(); }; /** * Add a layer to the map style. The layer will be inserted before the layer with * ID `before`, or appended if `before` is omitted. * @param {string} [before] ID of an existing layer to insert before */ Style.prototype.addLayer = function addLayer (layerObject , before , options ) { this._checkLoaded(); var id = layerObject.id; if (typeof layerObject.source === 'object') { this.addSource(id, layerObject.source); layerObject = util.clone(layerObject); layerObject = (util.extend(layerObject, {source: id}) ); } // this layer is not in the style.layers array, so we pass an impossible array index if (this._validate(validateStyle.layer, ("layers." + id), layerObject, {arrayIndex: -1}, options)) { return; } var layer = StyleLayer.create(layerObject); this._validateLayer(layer); layer.setEventedParent(this, {layer: {id: id}}); var index = before ? this._order.indexOf(before) : this._order.length; if (before && index === -1) { this.fire('error', { error: new Error(("Layer with id \"" + before + "\" does not exist on this map."))}); return; } this._order.splice(index, 0, id); this._layerOrderChanged = true; this._layers[id] = layer; if (this._removedLayers[id] && layer.source) { // If, in the current batch, we have already removed this layer // and we are now re-adding it with a different `type`, then we // need to clear (rather than just reload) the underyling source's // tiles. Otherwise, tiles marked 'reloading' will have buckets / // buffers that are set up for the _previous_ version of this // layer, causing, e.g.: // https://github.com/mapbox/mapbox-gl-js/issues/3633 var removed = this._removedLayers[id]; delete this._removedLayers[id]; if (removed.type !== layer.type) { this._updatedSources[layer.source] = 'clear'; } else { this._updatedSources[layer.source] = 'reload'; this.sourceCaches[layer.source].pause(); } } this._updateLayer(layer); }; /** * Moves a layer to a different z-position. The layer will be inserted before the layer with * ID `before`, or appended if `before` is omitted. * @param {string} id ID of the layer to move * @param {string} [before] ID of an existing layer to insert before */ Style.prototype.moveLayer = function moveLayer (id , before ) { this._checkLoaded(); this._changed = true; var layer = this._layers[id]; if (!layer) { this.fire('error', { error: new Error( "The layer '" + id + "' does not exist in " + "the map's style and cannot be moved." ) }); return; } var index = this._order.indexOf(id); this._order.splice(index, 1); var newIndex = before ? this._order.indexOf(before) : this._order.length; if (before && newIndex === -1) { this.fire('error', { error: new Error(("Layer with id \"" + before + "\" does not exist on this map."))}); return; } this._order.splice(newIndex, 0, id); this._layerOrderChanged = true; }; /** * Remove the layer with the given id from the style. * * If no such layer exists, an `error` event is fired. * * @param {string} id id of the layer to remove * @fires error */ Style.prototype.removeLayer = function removeLayer (id ) { this._checkLoaded(); var layer = this._layers[id]; if (!layer) { this.fire('error', { error: new Error( "The layer '" + id + "' does not exist in " + "the map's style and cannot be removed." ) }); return; } layer.setEventedParent(null); var index = this._order.indexOf(id); this._order.splice(index, 1); this._layerOrderChanged = true; this._changed = true; this._removedLayers[id] = layer; delete this._layers[id]; delete this._updatedLayers[id]; delete this._updatedPaintProps[id]; }; /** * Return the style layer object with the given `id`. * * @param {string} id - id of the desired layer * @returns {?Object} a layer, if one with the given `id` exists */ Style.prototype.getLayer = function getLayer (id ) { return this._layers[id]; }; Style.prototype.setLayerZoomRange = function setLayerZoomRange (layerId , minzoom , maxzoom ) { this._checkLoaded(); var layer = this.getLayer(layerId); if (!layer) { this.fire('error', { error: new Error( "The layer '" + layerId + "' does not exist in " + "the map's style and cannot have zoom extent." ) }); return; } if (layer.minzoom === minzoom && layer.maxzoom === maxzoom) { return; } if (minzoom != null) { layer.minzoom = minzoom; } if (maxzoom != null) { layer.maxzoom = maxzoom; } this._updateLayer(layer); }; Style.prototype.setFilter = function setFilter (layerId , filter ) { this._checkLoaded(); var layer = this.getLayer(layerId); if (!layer) { this.fire('error', { error: new Error( "The layer '" + layerId + "' does not exist in " + "the map's style and cannot be filtered." ) }); return; } if (util.deepEqual(layer.filter, filter)) { return; } if (filter === null || filter === undefined) { layer.filter = undefined; this._updateLayer(layer); return; } if (this._validate(validateStyle.filter, ("layers." + (layer.id) + ".filter"), filter)) { return; } layer.filter = util.clone(filter); this._updateLayer(layer); }; /** * Get a layer's filter object * @param {string} layer the layer to inspect * @returns {*} the layer's filter, if any */ Style.prototype.getFilter = function getFilter (layer ) { return util.clone(this.getLayer(layer).filter); }; Style.prototype.setLayoutProperty = function setLayoutProperty (layerId , name , value ) { this._checkLoaded(); var layer = this.getLayer(layerId); if (!layer) { this.fire('error', { error: new Error( "The layer '" + layerId + "' does not exist in " + "the map's style and cannot be styled." ) }); return; } if (util.deepEqual(layer.getLayoutProperty(name), value)) { return; } layer.setLayoutProperty(name, value); this._updateLayer(layer); }; /** * Get a layout property's value from a given layer * @param {string} layer the layer to inspect * @param {string} name the name of the layout property * @returns {*} the property value */ Style.prototype.getLayoutProperty = function getLayoutProperty (layer , name ) { return this.getLayer(layer).getLayoutProperty(name); }; Style.prototype.setPaintProperty = function setPaintProperty (layerId , name , value ) { this._checkLoaded(); var layer = this.getLayer(layerId); if (!layer) { this.fire('error', { error: new Error( "The layer '" + layerId + "' does not exist in " + "the map's style and cannot be styled." ) }); return; } if (util.deepEqual(layer.getPaintProperty(name), value)) { return; } var wasDataDriven = layer._transitionablePaint._values[name].value.isDataDriven(); layer.setPaintProperty(name, value); var isDataDriven = layer._transitionablePaint._values[name].value.isDataDriven(); if (isDataDriven || wasDataDriven) { this._updateLayer(layer); } this._changed = true; this._updatedPaintProps[layerId] = true; }; Style.prototype.getPaintProperty = function getPaintProperty (layer , name ) { return this.getLayer(layer).getPaintProperty(name); }; Style.prototype.getTransition = function getTransition () { return util.extend({ duration: 300, delay: 0 }, this.stylesheet && this.stylesheet.transition); }; Style.prototype.serialize = function serialize () { var this$1 = this; return util.filterObject({ version: this.stylesheet.version, name: this.stylesheet.name, metadata: this.stylesheet.metadata, light: this.stylesheet.light, center: this.stylesheet.center, zoom: this.stylesheet.zoom, bearing: this.stylesheet.bearing, pitch: this.stylesheet.pitch, sprite: this.stylesheet.sprite, glyphs: this.stylesheet.glyphs, transition: this.stylesheet.transition, sources: util.mapObject(this.sourceCaches, function (source) { return source.serialize(); }), layers: this._order.map(function (id) { return this$1._layers[id].serialize(); }) }, function (value) { return value !== undefined; }); }; Style.prototype._updateLayer = function _updateLayer (layer ) { this._updatedLayers[layer.id] = true; if (layer.source && !this._updatedSources[layer.source]) { this._updatedSources[layer.source] = 'reload'; this.sourceCaches[layer.source].pause(); } this._changed = true; }; Style.prototype._flattenRenderedFeatures = function _flattenRenderedFeatures (sourceResults ) { var this$1 = this; var features = []; for (var l = this._order.length - 1; l >= 0; l--) { var layerId = this$1._order[l]; for (var i = 0, list = sourceResults; i < list.length; i += 1) { var sourceResult = list[i]; var layerFeatures = sourceResult[layerId]; if (layerFeatures) { for (var i$1 = 0, list$1 = layerFeatures; i$1 < list$1.length; i$1 += 1) { var feature = list$1[i$1]; features.push(feature); } } } } return features; }; Style.prototype.queryRenderedFeatures = function queryRenderedFeatures (queryGeometry , params , zoom , bearing ) { var this$1 = this; if (params && params.filter) { this._validate(validateStyle.filter, 'queryRenderedFeatures.filter', params.filter); } var includedSources = {}; if (params && params.layers) { if (!Array.isArray(params.layers)) { this.fire('error', {error: 'parameters.layers must be an Array.'}); return []; } for (var i = 0, list = params.layers; i < list.length; i += 1) { var layerId = list[i]; var layer = this$1._layers[layerId]; if (!layer) { // this layer is not in the style.layers array this$1.fire('error', {error: "The layer '" + layerId + "' does not exist " + "in the map's style and cannot be queried for features."}); return []; } includedSources[layer.source] = true; } } var sourceResults = []; for (var id in this$1.sourceCaches) { if (params.layers && !includedSources[id]) { continue; } var results = QueryFeatures.rendered(this$1.sourceCaches[id], this$1._layers, queryGeometry, params, zoom, bearing, this$1.placement ? this$1.placement.collisionIndex : null); sourceResults.push(results); } return this._flattenRenderedFeatures(sourceResults); }; Style.prototype.querySourceFeatures = function querySourceFeatures (sourceID , params ) { if (params && params.filter) { this._validate(validateStyle.filter, 'querySourceFeatures.filter', params.filter); } var sourceCache = this.sourceCaches[sourceID]; return sourceCache ? QueryFeatures.source(sourceCache, params) : []; }; Style.prototype.addSourceType = function addSourceType (name , SourceType , callback ) { if (getSourceType(name)) { return callback(new Error(("A source type called \"" + name + "\" already exists."))); } setSourceType(name, SourceType); if (!SourceType.workerSourceURL) { return callback(null, null); } this.dispatcher.broadcast('loadWorkerSource', { name: name, url: SourceType.workerSourceURL }, callback); }; Style.prototype.getLight = function getLight () { return this.light.getLight(); }; Style.prototype.setLight = function setLight (lightOptions ) { this._checkLoaded(); var light = this.light.getLight(); var _update = false; for (var key in lightOptions) { if (!util.deepEqual(lightOptions[key], light[key])) { _update = true; break; } } if (!_update) { return; } var parameters = { now: browser.now(), transition: util.extend({ duration: 300, delay: 0 }, this.stylesheet.transition) }; this.light.setLight(lightOptions); this.light.updateTransitions(parameters); }; Style.prototype._validate = function _validate (validate , key , value , props , options ) { if (options && options.validate === false) { return false; } return validateStyle.emitErrors(this, validate.call(validateStyle, util.extend({ key: key, style: this.serialize(), value: value, styleSpec: styleSpec }, props))); }; Style.prototype._remove = function _remove () { var this$1 = this; rtlTextPlugin.evented.off('pluginAvailable', this._rtlTextPluginCallback); for (var id in this$1.sourceCaches) { this$1.sourceCaches[id].clearTiles(); } this.dispatcher.remove(); }; Style.prototype._clearSource = function _clearSource (id ) { this.sourceCaches[id].clearTiles(); }; Style.prototype._reloadSource = function _reloadSource (id ) { this.sourceCaches[id].resume(); this.sourceCaches[id].reload(); }; Style.prototype._updateSources = function _updateSources (transform ) { var this$1 = this; for (var id in this$1.sourceCaches) { this$1.sourceCaches[id].update(transform); } }; Style.prototype._generateCollisionBoxes = function _generateCollisionBoxes () { var this$1 = this; for (var id in this$1.sourceCaches) { this$1._reloadSource(id); } }; Style.prototype._updatePlacement = function _updatePlacement (transform , showCollisionBoxes , fadeDuration ) { var this$1 = this; var symbolBucketsChanged = false; var placementCommitted = false; var layerTiles = {}; for (var i = 0, list = this$1._order; i < list.length; i += 1) { var layerID = list[i]; var styleLayer = this$1._layers[layerID]; if (styleLayer.type !== 'symbol') { continue; } if (!layerTiles[styleLayer.source]) { var sourceCache = this$1.sourceCaches[styleLayer.source]; layerTiles[styleLayer.source] = sourceCache.getRenderableIds() .map(function (id) { return sourceCache.getTileByID(id); }) .sort(function (a, b) { return (b.tileID.overscaledZ - a.tileID.overscaledZ) || (a.tileID.isLessThan(b.tileID) ? -1 : 1); }); } var layerBucketsChanged = this$1.crossTileSymbolIndex.addLayer(styleLayer, layerTiles[styleLayer.source]); symbolBucketsChanged = symbolBucketsChanged || layerBucketsChanged; } this.crossTileSymbolIndex.pruneUnusedLayers(this._order); // Anything that changes our "in progress" layer and tile indices requires us // to start over. When we start over, we do a full placement instead of incremental // to prevent starvation. // We need to restart placement to keep layer indices in sync. var forceFullPlacement = this._layerOrderChanged; if (forceFullPlacement || !this.pauseablePlacement || (this.pauseablePlacement.isDone() && !this.placement.stillRecent(browser.now()))) { this.pauseablePlacement = new PauseablePlacement(transform, this._order, forceFullPlacement, showCollisionBoxes, fadeDuration); this._layerOrderChanged = false; } if (this.pauseablePlacement.isDone()) { // the last placement finished running, but the next one hasn’t // started yet because of the `stillRecent` check immediately // above, so mark it stale to ensure that we request another // render frame this.placement.setStale(); } else { this.pauseablePlacement.continuePlacement(this._order, this._layers, layerTiles); if (this.pauseablePlacement.isDone()) { this.placement = this.pauseablePlacement.commit(this.placement, browser.now()); placementCommitted = true; } if (symbolBucketsChanged) { // since the placement gets split over multiple frames it is possible // these buckets were processed before they were changed and so the // placement is already stale while it is in progress this.pauseablePlacement.placement.setStale(); } } if (placementCommitted || symbolBucketsChanged) { for (var i$1 = 0, list$1 = this$1._order; i$1 < list$1.length; i$1 += 1) { var layerID$1 = list$1[i$1]; var styleLayer$1 = this$1._layers[layerID$1]; if (styleLayer$1.type !== 'symbol') { continue; } this$1.placement.updateLayerOpacities(styleLayer$1, layerTiles[styleLayer$1.source]); } } // needsRender is false when we have just finished a placement that didn't change the visibility of any symbols var needsRerender = !this.pauseablePlacement.isDone() || this.placement.hasTransitions(browser.now()); return needsRerender; }; // Callbacks from web workers Style.prototype.getImages = function getImages (mapId , params , callback ) { this.imageManager.getImages(params.icons, callback); }; Style.prototype.getGlyphs = function getGlyphs (mapId , params , callback ) { this.glyphManager.getGlyphs(params.stacks, callback); }; return Style; }(Evented)); module.exports = Style; },{"../render/glyph_manager":91,"../render/image_manager":93,"../render/line_atlas":94,"../source/geojson_source":104,"../source/query_features":110,"../source/rtl_text_plugin":114,"../source/source":115,"../source/source_cache":116,"../style-spec/deref":125,"../style-spec/diff":126,"../style-spec/reference/latest":156,"../symbol/cross_tile_symbol_index":223,"../util/ajax":256,"../util/browser":257,"../util/dispatcher":263,"../util/evented":265,"../util/global_worker_pool":267,"../util/mapbox":272,"../util/util":280,"./light":188,"./load_sprite":190,"./pauseable_placement":192,"./style_layer":196,"./validate_style":216,"./zoom_history":217,"assert":13}],196:[function(require,module,exports){ 'use strict';// var util = require('../util/util'); var styleSpec = require('../style-spec/reference/latest'); var validateStyle = require('./validate_style'); var Evented = require('../util/evented'); var ref = require('./properties'); var Layout = ref.Layout; var Transitionable = ref.Transitionable; var Transitioning = ref.Transitioning; var Properties = ref.Properties; var TRANSITION_SUFFIX = '-transition'; var StyleLayer = (function (Evented) { function StyleLayer(layer , properties ) { var this$1 = this; Evented.call(this); this.id = layer.id; this.metadata = layer.metadata; this.type = layer.type; this.minzoom = layer.minzoom; this.maxzoom = layer.maxzoom; this.visibility = 'visible'; if (layer.type !== 'background') { this.source = layer.source; this.sourceLayer = layer['source-layer']; this.filter = layer.filter; } this._featureFilter = function () { return true; }; if (properties.layout) { this._unevaluatedLayout = new Layout(properties.layout); } this._transitionablePaint = new Transitionable(properties.paint); for (var property in layer.paint) { this$1.setPaintProperty(property, layer.paint[property], {validate: false}); } for (var property$1 in layer.layout) { this$1.setLayoutProperty(property$1, layer.layout[property$1], {validate: false}); } this._transitioningPaint = this._transitionablePaint.untransitioned(); } if ( Evented ) StyleLayer.__proto__ = Evented; StyleLayer.prototype = Object.create( Evented && Evented.prototype ); StyleLayer.prototype.constructor = StyleLayer; StyleLayer.prototype.getLayoutProperty = function getLayoutProperty (name ) { if (name === 'visibility') { return this.visibility; } return this._unevaluatedLayout.getValue(name); }; StyleLayer.prototype.setLayoutProperty = function setLayoutProperty (name , value , options ) { if (value !== null && value !== undefined) { var key = "layers." + (this.id) + ".layout." + name; if (this._validate(validateStyle.layoutProperty, key, name, value, options)) { return; } } if (name === 'visibility') { this.visibility = value === 'none' ? value : 'visible'; return; } this._unevaluatedLayout.setValue(name, value); }; StyleLayer.prototype.getPaintProperty = function getPaintProperty (name ) { if (util.endsWith(name, TRANSITION_SUFFIX)) { return this._transitionablePaint.getTransition(name.slice(0, -TRANSITION_SUFFIX.length)); } else { return this._transitionablePaint.getValue(name); } }; StyleLayer.prototype.setPaintProperty = function setPaintProperty (name , value , options ) { if (value !== null && value !== undefined) { var key = "layers." + (this.id) + ".paint." + name; if (this._validate(validateStyle.paintProperty, key, name, value, options)) { return; } } if (util.endsWith(name, TRANSITION_SUFFIX)) { this._transitionablePaint.setTransition(name.slice(0, -TRANSITION_SUFFIX.length), (value ) || undefined); } else { this._transitionablePaint.setValue(name, value); } }; StyleLayer.prototype.isHidden = function isHidden (zoom ) { if (this.minzoom && zoom < this.minzoom) { return true; } if (this.maxzoom && zoom >= this.maxzoom) { return true; } return this.visibility === 'none'; }; StyleLayer.prototype.updateTransitions = function updateTransitions (parameters ) { this._transitioningPaint = this._transitionablePaint.transitioned(parameters, this._transitioningPaint); }; StyleLayer.prototype.hasTransition = function hasTransition () { return this._transitioningPaint.hasTransition(); }; StyleLayer.prototype.recalculate = function recalculate (parameters ) { if (this._unevaluatedLayout) { (this ).layout = this._unevaluatedLayout.possiblyEvaluate(parameters); } (this ).paint = this._transitioningPaint.possiblyEvaluate(parameters); }; StyleLayer.prototype.serialize = function serialize () { var output = { 'id': this.id, 'type': this.type, 'source': this.source, 'source-layer': this.sourceLayer, 'metadata': this.metadata, 'minzoom': this.minzoom, 'maxzoom': this.maxzoom, 'filter': this.filter, 'layout': this._unevaluatedLayout && this._unevaluatedLayout.serialize(), 'paint': this._transitionablePaint && this._transitionablePaint.serialize() }; if (this.visibility === 'none') { output.layout = output.layout || {}; output.layout.visibility = 'none'; } return util.filterObject(output, function (value, key) { return value !== undefined && !(key === 'layout' && !Object.keys(value).length) && !(key === 'paint' && !Object.keys(value).length); }); }; StyleLayer.prototype._validate = function _validate (validate , key , name , value , options ) { if (options && options.validate === false) { return false; } return validateStyle.emitErrors(this, validate.call(validateStyle, { key: key, layerType: this.type, objectKey: name, value: value, styleSpec: styleSpec, // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407 style: {glyphs: true, sprite: true} })); }; StyleLayer.prototype.hasOffscreenPass = function hasOffscreenPass () { return false; }; StyleLayer.prototype.resize = function resize () { // noop }; return StyleLayer; }(Evented)); module.exports = StyleLayer; var subclasses = { 'circle': require('./style_layer/circle_style_layer'), 'heatmap': require('./style_layer/heatmap_style_layer'), 'hillshade': require('./style_layer/hillshade_style_layer'), 'fill': require('./style_layer/fill_style_layer'), 'fill-extrusion': require('./style_layer/fill_extrusion_style_layer'), 'line': require('./style_layer/line_style_layer'), 'symbol': require('./style_layer/symbol_style_layer'), 'background': require('./style_layer/background_style_layer'), 'raster': require('./style_layer/raster_style_layer') }; StyleLayer.create = function(layer ) { return new subclasses[layer.type](layer); }; },{"../style-spec/reference/latest":156,"../util/evented":265,"../util/util":280,"./properties":193,"./style_layer/background_style_layer":197,"./style_layer/circle_style_layer":199,"./style_layer/fill_extrusion_style_layer":201,"./style_layer/fill_style_layer":203,"./style_layer/heatmap_style_layer":205,"./style_layer/hillshade_style_layer":207,"./style_layer/line_style_layer":209,"./style_layer/raster_style_layer":211,"./style_layer/symbol_style_layer":213,"./validate_style":216}],197:[function(require,module,exports){ 'use strict';// var StyleLayer = require('../style_layer'); var properties = require('./background_style_layer_properties'); var ref = require('../properties'); var Transitionable = ref.Transitionable; var Transitioning = ref.Transitioning; var PossiblyEvaluated = ref.PossiblyEvaluated; var BackgroundStyleLayer = (function (StyleLayer) { function BackgroundStyleLayer(layer ) { StyleLayer.call(this, layer, properties); } if ( StyleLayer ) BackgroundStyleLayer.__proto__ = StyleLayer; BackgroundStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); BackgroundStyleLayer.prototype.constructor = BackgroundStyleLayer; return BackgroundStyleLayer; }(StyleLayer)); module.exports = BackgroundStyleLayer; },{"../properties":193,"../style_layer":196,"./background_style_layer_properties":198}],198:[function(require,module,exports){ 'use strict';// This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. // /* eslint-disable */ var styleSpec = require('../../style-spec/reference/latest'); var ref = require('../properties'); var Properties = ref.Properties; var DataConstantProperty = ref.DataConstantProperty; var DataDrivenProperty = ref.DataDrivenProperty; var CrossFadedProperty = ref.CrossFadedProperty; var HeatmapColorProperty = ref.HeatmapColorProperty; var paint = new Properties({ "background-color": new DataConstantProperty(styleSpec["paint_background"]["background-color"]), "background-pattern": new CrossFadedProperty(styleSpec["paint_background"]["background-pattern"]), "background-opacity": new DataConstantProperty(styleSpec["paint_background"]["background-opacity"]), }); module.exports = { paint: paint }; },{"../../style-spec/reference/latest":156,"../properties":193}],199:[function(require,module,exports){ 'use strict';// var StyleLayer = require('../style_layer'); var CircleBucket = require('../../data/bucket/circle_bucket'); var ref = require('../../util/intersection_tests'); var multiPolygonIntersectsBufferedMultiPoint = ref.multiPolygonIntersectsBufferedMultiPoint; var ref$1 = require('../query_utils'); var getMaximumPaintValue = ref$1.getMaximumPaintValue; var translateDistance = ref$1.translateDistance; var translate = ref$1.translate; var properties = require('./circle_style_layer_properties'); var ref$2 = require('../properties'); var Transitionable = ref$2.Transitionable; var Transitioning = ref$2.Transitioning; var PossiblyEvaluated = ref$2.PossiblyEvaluated; var CircleStyleLayer = (function (StyleLayer) { function CircleStyleLayer(layer ) { StyleLayer.call(this, layer, properties); } if ( StyleLayer ) CircleStyleLayer.__proto__ = StyleLayer; CircleStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); CircleStyleLayer.prototype.constructor = CircleStyleLayer; CircleStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new CircleBucket(parameters); }; CircleStyleLayer.prototype.queryRadius = function queryRadius (bucket ) { var circleBucket = (bucket ); return getMaximumPaintValue('circle-radius', this, circleBucket) + getMaximumPaintValue('circle-stroke-width', this, circleBucket) + translateDistance(this.paint.get('circle-translate')); }; CircleStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature (queryGeometry , feature , geometry , zoom , bearing , pixelsToTileUnits ) { var translatedPolygon = translate(queryGeometry, this.paint.get('circle-translate'), this.paint.get('circle-translate-anchor'), bearing, pixelsToTileUnits); var radius = this.paint.get('circle-radius').evaluate(feature) * pixelsToTileUnits; var stroke = this.paint.get('circle-stroke-width').evaluate(feature) * pixelsToTileUnits; return multiPolygonIntersectsBufferedMultiPoint(translatedPolygon, geometry, radius + stroke); }; return CircleStyleLayer; }(StyleLayer)); module.exports = CircleStyleLayer; },{"../../data/bucket/circle_bucket":47,"../../util/intersection_tests":269,"../properties":193,"../query_utils":194,"../style_layer":196,"./circle_style_layer_properties":200}],200:[function(require,module,exports){ 'use strict';// This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. // /* eslint-disable */ var styleSpec = require('../../style-spec/reference/latest'); var ref = require('../properties'); var Properties = ref.Properties; var DataConstantProperty = ref.DataConstantProperty; var DataDrivenProperty = ref.DataDrivenProperty; var CrossFadedProperty = ref.CrossFadedProperty; var HeatmapColorProperty = ref.HeatmapColorProperty; var paint = new Properties({ "circle-radius": new DataDrivenProperty(styleSpec["paint_circle"]["circle-radius"]), "circle-color": new DataDrivenProperty(styleSpec["paint_circle"]["circle-color"]), "circle-blur": new DataDrivenProperty(styleSpec["paint_circle"]["circle-blur"]), "circle-opacity": new DataDrivenProperty(styleSpec["paint_circle"]["circle-opacity"]), "circle-translate": new DataConstantProperty(styleSpec["paint_circle"]["circle-translate"]), "circle-translate-anchor": new DataConstantProperty(styleSpec["paint_circle"]["circle-translate-anchor"]), "circle-pitch-scale": new DataConstantProperty(styleSpec["paint_circle"]["circle-pitch-scale"]), "circle-pitch-alignment": new DataConstantProperty(styleSpec["paint_circle"]["circle-pitch-alignment"]), "circle-stroke-width": new DataDrivenProperty(styleSpec["paint_circle"]["circle-stroke-width"]), "circle-stroke-color": new DataDrivenProperty(styleSpec["paint_circle"]["circle-stroke-color"]), "circle-stroke-opacity": new DataDrivenProperty(styleSpec["paint_circle"]["circle-stroke-opacity"]), }); module.exports = { paint: paint }; },{"../../style-spec/reference/latest":156,"../properties":193}],201:[function(require,module,exports){ 'use strict';// var StyleLayer = require('../style_layer'); var FillExtrusionBucket = require('../../data/bucket/fill_extrusion_bucket'); var ref = require('../../util/intersection_tests'); var multiPolygonIntersectsMultiPolygon = ref.multiPolygonIntersectsMultiPolygon; var ref$1 = require('../query_utils'); var translateDistance = ref$1.translateDistance; var translate = ref$1.translate; var properties = require('./fill_extrusion_style_layer_properties'); var ref$2 = require('../properties'); var Transitionable = ref$2.Transitionable; var Transitioning = ref$2.Transitioning; var PossiblyEvaluated = ref$2.PossiblyEvaluated; var FillExtrusionStyleLayer = (function (StyleLayer) { function FillExtrusionStyleLayer(layer ) { StyleLayer.call(this, layer, properties); } if ( StyleLayer ) FillExtrusionStyleLayer.__proto__ = StyleLayer; FillExtrusionStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); FillExtrusionStyleLayer.prototype.constructor = FillExtrusionStyleLayer; FillExtrusionStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new FillExtrusionBucket(parameters); }; FillExtrusionStyleLayer.prototype.queryRadius = function queryRadius () { return translateDistance(this.paint.get('fill-extrusion-translate')); }; FillExtrusionStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature (queryGeometry , feature , geometry , zoom , bearing , pixelsToTileUnits ) { var translatedPolygon = translate(queryGeometry, this.paint.get('fill-extrusion-translate'), this.paint.get('fill-extrusion-translate-anchor'), bearing, pixelsToTileUnits); return multiPolygonIntersectsMultiPolygon(translatedPolygon, geometry); }; FillExtrusionStyleLayer.prototype.hasOffscreenPass = function hasOffscreenPass () { return this.paint.get('fill-extrusion-opacity') !== 0 && this.visibility !== 'none'; }; FillExtrusionStyleLayer.prototype.resize = function resize () { if (this.viewportFrame) { this.viewportFrame.destroy(); this.viewportFrame = null; } }; return FillExtrusionStyleLayer; }(StyleLayer)); module.exports = FillExtrusionStyleLayer; },{"../../data/bucket/fill_extrusion_bucket":51,"../../util/intersection_tests":269,"../properties":193,"../query_utils":194,"../style_layer":196,"./fill_extrusion_style_layer_properties":202}],202:[function(require,module,exports){ 'use strict';// This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. // /* eslint-disable */ var styleSpec = require('../../style-spec/reference/latest'); var ref = require('../properties'); var Properties = ref.Properties; var DataConstantProperty = ref.DataConstantProperty; var DataDrivenProperty = ref.DataDrivenProperty; var CrossFadedProperty = ref.CrossFadedProperty; var HeatmapColorProperty = ref.HeatmapColorProperty; var paint = new Properties({ "fill-extrusion-opacity": new DataConstantProperty(styleSpec["paint_fill-extrusion"]["fill-extrusion-opacity"]), "fill-extrusion-color": new DataDrivenProperty(styleSpec["paint_fill-extrusion"]["fill-extrusion-color"]), "fill-extrusion-translate": new DataConstantProperty(styleSpec["paint_fill-extrusion"]["fill-extrusion-translate"]), "fill-extrusion-translate-anchor": new DataConstantProperty(styleSpec["paint_fill-extrusion"]["fill-extrusion-translate-anchor"]), "fill-extrusion-pattern": new CrossFadedProperty(styleSpec["paint_fill-extrusion"]["fill-extrusion-pattern"]), "fill-extrusion-height": new DataDrivenProperty(styleSpec["paint_fill-extrusion"]["fill-extrusion-height"]), "fill-extrusion-base": new DataDrivenProperty(styleSpec["paint_fill-extrusion"]["fill-extrusion-base"]), }); module.exports = { paint: paint }; },{"../../style-spec/reference/latest":156,"../properties":193}],203:[function(require,module,exports){ 'use strict';// var StyleLayer = require('../style_layer'); var FillBucket = require('../../data/bucket/fill_bucket'); var ref = require('../../util/intersection_tests'); var multiPolygonIntersectsMultiPolygon = ref.multiPolygonIntersectsMultiPolygon; var ref$1 = require('../query_utils'); var translateDistance = ref$1.translateDistance; var translate = ref$1.translate; var properties = require('./fill_style_layer_properties'); var ref$2 = require('../properties'); var Transitionable = ref$2.Transitionable; var Transitioning = ref$2.Transitioning; var PossiblyEvaluated = ref$2.PossiblyEvaluated; var FillStyleLayer = (function (StyleLayer) { function FillStyleLayer(layer ) { StyleLayer.call(this, layer, properties); } if ( StyleLayer ) FillStyleLayer.__proto__ = StyleLayer; FillStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); FillStyleLayer.prototype.constructor = FillStyleLayer; FillStyleLayer.prototype.recalculate = function recalculate (parameters ) { this.paint = this._transitioningPaint.possiblyEvaluate(parameters); if (this._transitionablePaint.getValue('fill-outline-color') === undefined) { this.paint._values['fill-outline-color'] = this.paint._values['fill-color']; } }; FillStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new FillBucket(parameters); }; FillStyleLayer.prototype.queryRadius = function queryRadius () { return translateDistance(this.paint.get('fill-translate')); }; FillStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature (queryGeometry , feature , geometry , zoom , bearing , pixelsToTileUnits ) { var translatedPolygon = translate(queryGeometry, this.paint.get('fill-translate'), this.paint.get('fill-translate-anchor'), bearing, pixelsToTileUnits); return multiPolygonIntersectsMultiPolygon(translatedPolygon, geometry); }; return FillStyleLayer; }(StyleLayer)); module.exports = FillStyleLayer; },{"../../data/bucket/fill_bucket":49,"../../util/intersection_tests":269,"../properties":193,"../query_utils":194,"../style_layer":196,"./fill_style_layer_properties":204}],204:[function(require,module,exports){ 'use strict';// This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. // /* eslint-disable */ var styleSpec = require('../../style-spec/reference/latest'); var ref = require('../properties'); var Properties = ref.Properties; var DataConstantProperty = ref.DataConstantProperty; var DataDrivenProperty = ref.DataDrivenProperty; var CrossFadedProperty = ref.CrossFadedProperty; var HeatmapColorProperty = ref.HeatmapColorProperty; var paint = new Properties({ "fill-antialias": new DataConstantProperty(styleSpec["paint_fill"]["fill-antialias"]), "fill-opacity": new DataDrivenProperty(styleSpec["paint_fill"]["fill-opacity"]), "fill-color": new DataDrivenProperty(styleSpec["paint_fill"]["fill-color"]), "fill-outline-color": new DataDrivenProperty(styleSpec["paint_fill"]["fill-outline-color"]), "fill-translate": new DataConstantProperty(styleSpec["paint_fill"]["fill-translate"]), "fill-translate-anchor": new DataConstantProperty(styleSpec["paint_fill"]["fill-translate-anchor"]), "fill-pattern": new CrossFadedProperty(styleSpec["paint_fill"]["fill-pattern"]), }); module.exports = { paint: paint }; },{"../../style-spec/reference/latest":156,"../properties":193}],205:[function(require,module,exports){ 'use strict';// var StyleLayer = require('../style_layer'); var HeatmapBucket = require('../../data/bucket/heatmap_bucket'); var RGBAImage = require('../../util/image').RGBAImage; var properties = require('./heatmap_style_layer_properties'); var ref = require('../properties'); var Transitionable = ref.Transitionable; var Transitioning = ref.Transitioning; var PossiblyEvaluated = ref.PossiblyEvaluated; var HeatmapStyleLayer = (function (StyleLayer) { function HeatmapStyleLayer(layer ) { StyleLayer.call(this, layer, properties); // make sure color ramp texture is generated for default heatmap color too this._updateColorRamp(); } if ( StyleLayer ) HeatmapStyleLayer.__proto__ = StyleLayer; HeatmapStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); HeatmapStyleLayer.prototype.constructor = HeatmapStyleLayer; HeatmapStyleLayer.prototype.createBucket = function createBucket (options ) { return new HeatmapBucket(options); }; HeatmapStyleLayer.prototype.setPaintProperty = function setPaintProperty (name , value , options ) { StyleLayer.prototype.setPaintProperty.call(this, name, value, options); if (name === 'heatmap-color') { this._updateColorRamp(); } }; HeatmapStyleLayer.prototype._updateColorRamp = function _updateColorRamp () { var expression = this._transitionablePaint._values['heatmap-color'].value.expression; var colorRampData = new Uint8Array(256 * 4); var len = colorRampData.length; for (var i = 4; i < len; i += 4) { var pxColor = expression.evaluate(({heatmapDensity: i / len} )); // the colors are being unpremultiplied because Color uses // premultiplied values, and the Texture class expects unpremultiplied ones colorRampData[i + 0] = Math.floor(pxColor.r * 255 / pxColor.a); colorRampData[i + 1] = Math.floor(pxColor.g * 255 / pxColor.a); colorRampData[i + 2] = Math.floor(pxColor.b * 255 / pxColor.a); colorRampData[i + 3] = Math.floor(pxColor.a * 255); } this.colorRamp = new RGBAImage({width: 256, height: 1}, colorRampData); this.colorRampTexture = null; }; HeatmapStyleLayer.prototype.resize = function resize () { if (this.heatmapFbo) { this.heatmapFbo.destroy(); this.heatmapFbo = null; } }; HeatmapStyleLayer.prototype.queryRadius = function queryRadius () { return 0; }; HeatmapStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature () { return false; }; HeatmapStyleLayer.prototype.hasOffscreenPass = function hasOffscreenPass () { return this.paint.get('heatmap-opacity') !== 0 && this.visibility !== 'none'; }; return HeatmapStyleLayer; }(StyleLayer)); module.exports = HeatmapStyleLayer; },{"../../data/bucket/heatmap_bucket":52,"../../util/image":268,"../properties":193,"../style_layer":196,"./heatmap_style_layer_properties":206}],206:[function(require,module,exports){ 'use strict';// This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. // /* eslint-disable */ var styleSpec = require('../../style-spec/reference/latest'); var ref = require('../properties'); var Properties = ref.Properties; var DataConstantProperty = ref.DataConstantProperty; var DataDrivenProperty = ref.DataDrivenProperty; var CrossFadedProperty = ref.CrossFadedProperty; var HeatmapColorProperty = ref.HeatmapColorProperty; var paint = new Properties({ "heatmap-radius": new DataDrivenProperty(styleSpec["paint_heatmap"]["heatmap-radius"]), "heatmap-weight": new DataDrivenProperty(styleSpec["paint_heatmap"]["heatmap-weight"]), "heatmap-intensity": new DataConstantProperty(styleSpec["paint_heatmap"]["heatmap-intensity"]), "heatmap-color": new HeatmapColorProperty(styleSpec["paint_heatmap"]["heatmap-color"]), "heatmap-opacity": new DataConstantProperty(styleSpec["paint_heatmap"]["heatmap-opacity"]), }); module.exports = { paint: paint }; },{"../../style-spec/reference/latest":156,"../properties":193}],207:[function(require,module,exports){ 'use strict';// var StyleLayer = require('../style_layer'); var properties = require('./hillshade_style_layer_properties'); var ref = require('../properties'); var Transitionable = ref.Transitionable; var Transitioning = ref.Transitioning; var PossiblyEvaluated = ref.PossiblyEvaluated; var HillshadeStyleLayer = (function (StyleLayer) { function HillshadeStyleLayer(layer ) { StyleLayer.call(this, layer, properties); } if ( StyleLayer ) HillshadeStyleLayer.__proto__ = StyleLayer; HillshadeStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); HillshadeStyleLayer.prototype.constructor = HillshadeStyleLayer; HillshadeStyleLayer.prototype.hasOffscreenPass = function hasOffscreenPass () { return this.paint.get('hillshade-exaggeration') !== 0 && this.visibility !== 'none'; }; return HillshadeStyleLayer; }(StyleLayer)); module.exports = HillshadeStyleLayer; },{"../properties":193,"../style_layer":196,"./hillshade_style_layer_properties":208}],208:[function(require,module,exports){ 'use strict';// This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. // /* eslint-disable */ var styleSpec = require('../../style-spec/reference/latest'); var ref = require('../properties'); var Properties = ref.Properties; var DataConstantProperty = ref.DataConstantProperty; var DataDrivenProperty = ref.DataDrivenProperty; var CrossFadedProperty = ref.CrossFadedProperty; var HeatmapColorProperty = ref.HeatmapColorProperty; var paint = new Properties({ "hillshade-illumination-direction": new DataConstantProperty(styleSpec["paint_hillshade"]["hillshade-illumination-direction"]), "hillshade-illumination-anchor": new DataConstantProperty(styleSpec["paint_hillshade"]["hillshade-illumination-anchor"]), "hillshade-exaggeration": new DataConstantProperty(styleSpec["paint_hillshade"]["hillshade-exaggeration"]), "hillshade-shadow-color": new DataConstantProperty(styleSpec["paint_hillshade"]["hillshade-shadow-color"]), "hillshade-highlight-color": new DataConstantProperty(styleSpec["paint_hillshade"]["hillshade-highlight-color"]), "hillshade-accent-color": new DataConstantProperty(styleSpec["paint_hillshade"]["hillshade-accent-color"]), }); module.exports = { paint: paint }; },{"../../style-spec/reference/latest":156,"../properties":193}],209:[function(require,module,exports){ 'use strict';// var Point = require('@mapbox/point-geometry'); var StyleLayer = require('../style_layer'); var LineBucket = require('../../data/bucket/line_bucket'); var ref = require('../../util/intersection_tests'); var multiPolygonIntersectsBufferedMultiLine = ref.multiPolygonIntersectsBufferedMultiLine; var ref$1 = require('../query_utils'); var getMaximumPaintValue = ref$1.getMaximumPaintValue; var translateDistance = ref$1.translateDistance; var translate = ref$1.translate; var properties = require('./line_style_layer_properties'); var ref$2 = require('../../util/util'); var extend = ref$2.extend; var EvaluationParameters = require('../evaluation_parameters'); var ref$3 = require('../properties'); var Transitionable = ref$3.Transitionable; var Transitioning = ref$3.Transitioning; var Layout = ref$3.Layout; var PossiblyEvaluated = ref$3.PossiblyEvaluated; var DataDrivenProperty = ref$3.DataDrivenProperty; var LineFloorwidthProperty = (function (DataDrivenProperty) { function LineFloorwidthProperty () { DataDrivenProperty.apply(this, arguments); } if ( DataDrivenProperty ) LineFloorwidthProperty.__proto__ = DataDrivenProperty; LineFloorwidthProperty.prototype = Object.create( DataDrivenProperty && DataDrivenProperty.prototype ); LineFloorwidthProperty.prototype.constructor = LineFloorwidthProperty; LineFloorwidthProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value, parameters) { parameters = new EvaluationParameters(Math.floor(parameters.zoom), { now: parameters.now, fadeDuration: parameters.fadeDuration, zoomHistory: parameters.zoomHistory, transition: parameters.transition }); return DataDrivenProperty.prototype.possiblyEvaluate.call(this, value, parameters); }; LineFloorwidthProperty.prototype.evaluate = function evaluate (value, globals, feature) { globals = extend({}, globals, {zoom: Math.floor(globals.zoom)}); return DataDrivenProperty.prototype.evaluate.call(this, value, globals, feature); }; return LineFloorwidthProperty; }(DataDrivenProperty)); var lineFloorwidthProperty = new LineFloorwidthProperty(properties.paint.properties['line-width'].specification); lineFloorwidthProperty.useIntegerZoom = true; var LineStyleLayer = (function (StyleLayer) { function LineStyleLayer(layer ) { StyleLayer.call(this, layer, properties); } if ( StyleLayer ) LineStyleLayer.__proto__ = StyleLayer; LineStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); LineStyleLayer.prototype.constructor = LineStyleLayer; LineStyleLayer.prototype.recalculate = function recalculate (parameters ) { StyleLayer.prototype.recalculate.call(this, parameters); (this.paint._values )['line-floorwidth'] = lineFloorwidthProperty.possiblyEvaluate(this._transitioningPaint._values['line-width'].value, parameters); }; LineStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new LineBucket(parameters); }; LineStyleLayer.prototype.queryRadius = function queryRadius (bucket ) { var lineBucket = (bucket ); var width = getLineWidth( getMaximumPaintValue('line-width', this, lineBucket), getMaximumPaintValue('line-gap-width', this, lineBucket)); var offset = getMaximumPaintValue('line-offset', this, lineBucket); return width / 2 + Math.abs(offset) + translateDistance(this.paint.get('line-translate')); }; LineStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature (queryGeometry , feature , geometry , zoom , bearing , pixelsToTileUnits ) { var translatedPolygon = translate(queryGeometry, this.paint.get('line-translate'), this.paint.get('line-translate-anchor'), bearing, pixelsToTileUnits); var halfWidth = pixelsToTileUnits / 2 * getLineWidth( this.paint.get('line-width').evaluate(feature), this.paint.get('line-gap-width').evaluate(feature)); var lineOffset = this.paint.get('line-offset').evaluate(feature); if (lineOffset) { geometry = offsetLine(geometry, lineOffset * pixelsToTileUnits); } return multiPolygonIntersectsBufferedMultiLine(translatedPolygon, geometry, halfWidth); }; return LineStyleLayer; }(StyleLayer)); module.exports = LineStyleLayer; function getLineWidth(lineWidth, lineGapWidth) { if (lineGapWidth > 0) { return lineGapWidth + 2 * lineWidth; } else { return lineWidth; } } function offsetLine(rings, offset) { var newRings = []; var zero = new Point(0, 0); for (var k = 0; k < rings.length; k++) { var ring = rings[k]; var newRing = []; for (var i = 0; i < ring.length; i++) { var a = ring[i - 1]; var b = ring[i]; var c = ring[i + 1]; var aToB = i === 0 ? zero : b.sub(a)._unit()._perp(); var bToC = i === ring.length - 1 ? zero : c.sub(b)._unit()._perp(); var extrude = aToB._add(bToC)._unit(); var cosHalfAngle = extrude.x * bToC.x + extrude.y * bToC.y; extrude._mult(1 / cosHalfAngle); newRing.push(extrude._mult(offset)._add(b)); } newRings.push(newRing); } return newRings; } },{"../../data/bucket/line_bucket":54,"../../util/intersection_tests":269,"../../util/util":280,"../evaluation_parameters":187,"../properties":193,"../query_utils":194,"../style_layer":196,"./line_style_layer_properties":210,"@mapbox/point-geometry":4}],210:[function(require,module,exports){ 'use strict';// This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. // /* eslint-disable */ var styleSpec = require('../../style-spec/reference/latest'); var ref = require('../properties'); var Properties = ref.Properties; var DataConstantProperty = ref.DataConstantProperty; var DataDrivenProperty = ref.DataDrivenProperty; var CrossFadedProperty = ref.CrossFadedProperty; var HeatmapColorProperty = ref.HeatmapColorProperty; var layout = new Properties({ "line-cap": new DataConstantProperty(styleSpec["layout_line"]["line-cap"]), "line-join": new DataDrivenProperty(styleSpec["layout_line"]["line-join"]), "line-miter-limit": new DataConstantProperty(styleSpec["layout_line"]["line-miter-limit"]), "line-round-limit": new DataConstantProperty(styleSpec["layout_line"]["line-round-limit"]), }); var paint = new Properties({ "line-opacity": new DataDrivenProperty(styleSpec["paint_line"]["line-opacity"]), "line-color": new DataDrivenProperty(styleSpec["paint_line"]["line-color"]), "line-translate": new DataConstantProperty(styleSpec["paint_line"]["line-translate"]), "line-translate-anchor": new DataConstantProperty(styleSpec["paint_line"]["line-translate-anchor"]), "line-width": new DataDrivenProperty(styleSpec["paint_line"]["line-width"]), "line-gap-width": new DataDrivenProperty(styleSpec["paint_line"]["line-gap-width"]), "line-offset": new DataDrivenProperty(styleSpec["paint_line"]["line-offset"]), "line-blur": new DataDrivenProperty(styleSpec["paint_line"]["line-blur"]), "line-dasharray": new CrossFadedProperty(styleSpec["paint_line"]["line-dasharray"]), "line-pattern": new CrossFadedProperty(styleSpec["paint_line"]["line-pattern"]), }); module.exports = { paint: paint, layout: layout }; },{"../../style-spec/reference/latest":156,"../properties":193}],211:[function(require,module,exports){ 'use strict';// var StyleLayer = require('../style_layer'); var properties = require('./raster_style_layer_properties'); var ref = require('../properties'); var Transitionable = ref.Transitionable; var Transitioning = ref.Transitioning; var PossiblyEvaluated = ref.PossiblyEvaluated; var RasterStyleLayer = (function (StyleLayer) { function RasterStyleLayer(layer ) { StyleLayer.call(this, layer, properties); } if ( StyleLayer ) RasterStyleLayer.__proto__ = StyleLayer; RasterStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); RasterStyleLayer.prototype.constructor = RasterStyleLayer; return RasterStyleLayer; }(StyleLayer)); module.exports = RasterStyleLayer; },{"../properties":193,"../style_layer":196,"./raster_style_layer_properties":212}],212:[function(require,module,exports){ 'use strict';// This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. // /* eslint-disable */ var styleSpec = require('../../style-spec/reference/latest'); var ref = require('../properties'); var Properties = ref.Properties; var DataConstantProperty = ref.DataConstantProperty; var DataDrivenProperty = ref.DataDrivenProperty; var CrossFadedProperty = ref.CrossFadedProperty; var HeatmapColorProperty = ref.HeatmapColorProperty; var paint = new Properties({ "raster-opacity": new DataConstantProperty(styleSpec["paint_raster"]["raster-opacity"]), "raster-hue-rotate": new DataConstantProperty(styleSpec["paint_raster"]["raster-hue-rotate"]), "raster-brightness-min": new DataConstantProperty(styleSpec["paint_raster"]["raster-brightness-min"]), "raster-brightness-max": new DataConstantProperty(styleSpec["paint_raster"]["raster-brightness-max"]), "raster-saturation": new DataConstantProperty(styleSpec["paint_raster"]["raster-saturation"]), "raster-contrast": new DataConstantProperty(styleSpec["paint_raster"]["raster-contrast"]), "raster-fade-duration": new DataConstantProperty(styleSpec["paint_raster"]["raster-fade-duration"]), }); module.exports = { paint: paint }; },{"../../style-spec/reference/latest":156,"../properties":193}],213:[function(require,module,exports){ 'use strict';// var StyleLayer = require('../style_layer'); var SymbolBucket = require('../../data/bucket/symbol_bucket'); var resolveTokens = require('../../util/token'); var ref = require('../../style-spec/expression'); var isExpression = ref.isExpression; var assert = require('assert'); var properties = require('./symbol_style_layer_properties'); var ref$1 = require('../properties'); var Transitionable = ref$1.Transitionable; var Transitioning = ref$1.Transitioning; var Layout = ref$1.Layout; var PossiblyEvaluated = ref$1.PossiblyEvaluated; var SymbolStyleLayer = (function (StyleLayer) { function SymbolStyleLayer(layer ) { StyleLayer.call(this, layer, properties); } if ( StyleLayer ) SymbolStyleLayer.__proto__ = StyleLayer; SymbolStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); SymbolStyleLayer.prototype.constructor = SymbolStyleLayer; SymbolStyleLayer.prototype.recalculate = function recalculate (parameters ) { StyleLayer.prototype.recalculate.call(this, parameters); if (this.layout.get('icon-rotation-alignment') === 'auto') { if (this.layout.get('symbol-placement') === 'line') { this.layout._values['icon-rotation-alignment'] = 'map'; } else { this.layout._values['icon-rotation-alignment'] = 'viewport'; } } if (this.layout.get('text-rotation-alignment') === 'auto') { if (this.layout.get('symbol-placement') === 'line') { this.layout._values['text-rotation-alignment'] = 'map'; } else { this.layout._values['text-rotation-alignment'] = 'viewport'; } } // If unspecified, `*-pitch-alignment` inherits `*-rotation-alignment` if (this.layout.get('text-pitch-alignment') === 'auto') { this.layout._values['text-pitch-alignment'] = this.layout.get('text-rotation-alignment'); } if (this.layout.get('icon-pitch-alignment') === 'auto') { this.layout._values['icon-pitch-alignment'] = this.layout.get('icon-rotation-alignment'); } }; SymbolStyleLayer.prototype.getValueAndResolveTokens = function getValueAndResolveTokens (name , feature ) { var value = this.layout.get(name).evaluate(feature); var unevaluated = this._unevaluatedLayout._values[name]; if (!unevaluated.isDataDriven() && !isExpression(unevaluated.value)) { return resolveTokens(feature.properties, value); } return value; }; SymbolStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new SymbolBucket(parameters); }; SymbolStyleLayer.prototype.queryRadius = function queryRadius () { return 0; }; SymbolStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature () { assert(false); // Should take a different path in FeatureIndex return false; }; return SymbolStyleLayer; }(StyleLayer)); module.exports = SymbolStyleLayer; },{"../../data/bucket/symbol_bucket":56,"../../style-spec/expression":144,"../../util/token":279,"../properties":193,"../style_layer":196,"./symbol_style_layer_properties":214,"assert":13}],214:[function(require,module,exports){ 'use strict';// This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. // /* eslint-disable */ var styleSpec = require('../../style-spec/reference/latest'); var ref = require('../properties'); var Properties = ref.Properties; var DataConstantProperty = ref.DataConstantProperty; var DataDrivenProperty = ref.DataDrivenProperty; var CrossFadedProperty = ref.CrossFadedProperty; var HeatmapColorProperty = ref.HeatmapColorProperty; var layout = new Properties({ "symbol-placement": new DataConstantProperty(styleSpec["layout_symbol"]["symbol-placement"]), "symbol-spacing": new DataConstantProperty(styleSpec["layout_symbol"]["symbol-spacing"]), "symbol-avoid-edges": new DataConstantProperty(styleSpec["layout_symbol"]["symbol-avoid-edges"]), "icon-allow-overlap": new DataConstantProperty(styleSpec["layout_symbol"]["icon-allow-overlap"]), "icon-ignore-placement": new DataConstantProperty(styleSpec["layout_symbol"]["icon-ignore-placement"]), "icon-optional": new DataConstantProperty(styleSpec["layout_symbol"]["icon-optional"]), "icon-rotation-alignment": new DataConstantProperty(styleSpec["layout_symbol"]["icon-rotation-alignment"]), "icon-size": new DataDrivenProperty(styleSpec["layout_symbol"]["icon-size"]), "icon-text-fit": new DataConstantProperty(styleSpec["layout_symbol"]["icon-text-fit"]), "icon-text-fit-padding": new DataConstantProperty(styleSpec["layout_symbol"]["icon-text-fit-padding"]), "icon-image": new DataDrivenProperty(styleSpec["layout_symbol"]["icon-image"]), "icon-rotate": new DataDrivenProperty(styleSpec["layout_symbol"]["icon-rotate"]), "icon-padding": new DataConstantProperty(styleSpec["layout_symbol"]["icon-padding"]), "icon-keep-upright": new DataConstantProperty(styleSpec["layout_symbol"]["icon-keep-upright"]), "icon-offset": new DataDrivenProperty(styleSpec["layout_symbol"]["icon-offset"]), "icon-anchor": new DataDrivenProperty(styleSpec["layout_symbol"]["icon-anchor"]), "icon-pitch-alignment": new DataConstantProperty(styleSpec["layout_symbol"]["icon-pitch-alignment"]), "text-pitch-alignment": new DataConstantProperty(styleSpec["layout_symbol"]["text-pitch-alignment"]), "text-rotation-alignment": new DataConstantProperty(styleSpec["layout_symbol"]["text-rotation-alignment"]), "text-field": new DataDrivenProperty(styleSpec["layout_symbol"]["text-field"]), "text-font": new DataDrivenProperty(styleSpec["layout_symbol"]["text-font"]), "text-size": new DataDrivenProperty(styleSpec["layout_symbol"]["text-size"]), "text-max-width": new DataDrivenProperty(styleSpec["layout_symbol"]["text-max-width"]), "text-line-height": new DataConstantProperty(styleSpec["layout_symbol"]["text-line-height"]), "text-letter-spacing": new DataDrivenProperty(styleSpec["layout_symbol"]["text-letter-spacing"]), "text-justify": new DataDrivenProperty(styleSpec["layout_symbol"]["text-justify"]), "text-anchor": new DataDrivenProperty(styleSpec["layout_symbol"]["text-anchor"]), "text-max-angle": new DataConstantProperty(styleSpec["layout_symbol"]["text-max-angle"]), "text-rotate": new DataDrivenProperty(styleSpec["layout_symbol"]["text-rotate"]), "text-padding": new DataConstantProperty(styleSpec["layout_symbol"]["text-padding"]), "text-keep-upright": new DataConstantProperty(styleSpec["layout_symbol"]["text-keep-upright"]), "text-transform": new DataDrivenProperty(styleSpec["layout_symbol"]["text-transform"]), "text-offset": new DataDrivenProperty(styleSpec["layout_symbol"]["text-offset"]), "text-allow-overlap": new DataConstantProperty(styleSpec["layout_symbol"]["text-allow-overlap"]), "text-ignore-placement": new DataConstantProperty(styleSpec["layout_symbol"]["text-ignore-placement"]), "text-optional": new DataConstantProperty(styleSpec["layout_symbol"]["text-optional"]), }); var paint = new Properties({ "icon-opacity": new DataDrivenProperty(styleSpec["paint_symbol"]["icon-opacity"]), "icon-color": new DataDrivenProperty(styleSpec["paint_symbol"]["icon-color"]), "icon-halo-color": new DataDrivenProperty(styleSpec["paint_symbol"]["icon-halo-color"]), "icon-halo-width": new DataDrivenProperty(styleSpec["paint_symbol"]["icon-halo-width"]), "icon-halo-blur": new DataDrivenProperty(styleSpec["paint_symbol"]["icon-halo-blur"]), "icon-translate": new DataConstantProperty(styleSpec["paint_symbol"]["icon-translate"]), "icon-translate-anchor": new DataConstantProperty(styleSpec["paint_symbol"]["icon-translate-anchor"]), "text-opacity": new DataDrivenProperty(styleSpec["paint_symbol"]["text-opacity"]), "text-color": new DataDrivenProperty(styleSpec["paint_symbol"]["text-color"]), "text-halo-color": new DataDrivenProperty(styleSpec["paint_symbol"]["text-halo-color"]), "text-halo-width": new DataDrivenProperty(styleSpec["paint_symbol"]["text-halo-width"]), "text-halo-blur": new DataDrivenProperty(styleSpec["paint_symbol"]["text-halo-blur"]), "text-translate": new DataConstantProperty(styleSpec["paint_symbol"]["text-translate"]), "text-translate-anchor": new DataConstantProperty(styleSpec["paint_symbol"]["text-translate-anchor"]), }); module.exports = { paint: paint, layout: layout }; },{"../../style-spec/reference/latest":156,"../properties":193}],215:[function(require,module,exports){ 'use strict';// var StyleLayer = require('./style_layer'); var util = require('../util/util'); var featureFilter = require('../style-spec/feature_filter'); var groupByLayout = require('../style-spec/group_by_layout'); var StyleLayerIndex = function StyleLayerIndex(layerConfigs ) { if (layerConfigs) { this.replace(layerConfigs); } }; StyleLayerIndex.prototype.replace = function replace (layerConfigs ) { this._layerConfigs = {}; this._layers = {}; this.update(layerConfigs, []); }; StyleLayerIndex.prototype.update = function update (layerConfigs , removedIds ) { var this$1 = this; for (var i = 0, list = layerConfigs; i < list.length; i += 1) { var layerConfig = list[i]; this$1._layerConfigs[layerConfig.id] = layerConfig; var layer = this$1._layers[layerConfig.id] = StyleLayer.create(layerConfig); layer._featureFilter = featureFilter(layer.filter); } for (var i$1 = 0, list$1 = removedIds; i$1 < list$1.length; i$1 += 1) { var id = list$1[i$1]; delete this$1._layerConfigs[id]; delete this$1._layers[id]; } this.familiesBySource = {}; var groups = groupByLayout(util.values(this._layerConfigs)); for (var i$2 = 0, list$2 = groups; i$2 < list$2.length; i$2 += 1) { var layerConfigs$1 = list$2[i$2]; var layers = layerConfigs$1.map(function (layerConfig) { return this$1._layers[layerConfig.id]; }); var layer$1 = layers[0]; if (layer$1.visibility === 'none') { continue; } var sourceId = layer$1.source || ''; var sourceGroup = this$1.familiesBySource[sourceId]; if (!sourceGroup) { sourceGroup = this$1.familiesBySource[sourceId] = {}; } var sourceLayerId = layer$1.sourceLayer || '_geojsonTileLayer'; var sourceLayerFamilies = sourceGroup[sourceLayerId]; if (!sourceLayerFamilies) { sourceLayerFamilies = sourceGroup[sourceLayerId] = []; } sourceLayerFamilies.push(layers); } }; module.exports = StyleLayerIndex; },{"../style-spec/feature_filter":153,"../style-spec/group_by_layout":155,"../util/util":280,"./style_layer":196}],216:[function(require,module,exports){ 'use strict';// module.exports = require('../style-spec/validate_style.min'); module.exports.emitErrors = function (emitter , errors ) { if (errors && errors.length) { for (var i = 0, list = errors; i < list.length; i += 1) { var ref = list[i]; var message = ref.message; emitter.fire('error', { error: new Error(message) }); } return true; } else { return false; } }; },{"../style-spec/validate_style.min":186}],217:[function(require,module,exports){ 'use strict';// var ZoomHistory = function ZoomHistory() { this.first = true; }; ZoomHistory.prototype.update = function update (z , now ) { var floorZ = Math.floor(z); if (this.first) { this.first = false; this.lastIntegerZoom = floorZ; this.lastIntegerZoomTime = 0; this.lastZoom = z; this.lastFloorZoom = floorZ; return true; } if (this.lastFloorZoom > floorZ) { this.lastIntegerZoom = floorZ + 1; this.lastIntegerZoomTime = now; } else if (this.lastFloorZoom < floorZ) { this.lastIntegerZoom = floorZ; this.lastIntegerZoomTime = now; } if (z !== this.lastZoom) { this.lastZoom = z; this.lastFloorZoom = floorZ; return true; } return false; }; module.exports = ZoomHistory; },{}],218:[function(require,module,exports){ 'use strict';// var Point = require('@mapbox/point-geometry'); var ref = require('../util/web_worker_transfer'); var register = ref.register; var Anchor = (function (Point) { function Anchor(x , y , angle , segment ) { Point.call(this, x, y); this.angle = angle; if (segment !== undefined) { this.segment = segment; } } if ( Point ) Anchor.__proto__ = Point; Anchor.prototype = Object.create( Point && Point.prototype ); Anchor.prototype.constructor = Anchor; Anchor.prototype.clone = function clone () { return new Anchor(this.x, this.y, this.angle, this.segment); }; return Anchor; }(Point)); register('Anchor', Anchor); module.exports = Anchor; },{"../util/web_worker_transfer":283,"@mapbox/point-geometry":4}],219:[function(require,module,exports){ 'use strict';// module.exports = checkMaxAngle; /** * Labels placed around really sharp angles aren't readable. Check if any * part of the potential label has a combined angle that is too big. * * @param line * @param anchor The point on the line around which the label is anchored. * @param labelLength The length of the label in geometry units. * @param windowSize The check fails if the combined angles within a part of the line that is `windowSize` long is too big. * @param maxAngle The maximum combined angle that any window along the label is allowed to have. * * @returns {boolean} whether the label should be placed * @private */ function checkMaxAngle(line , anchor , labelLength , windowSize , maxAngle ) { // horizontal labels always pass if (anchor.segment === undefined) { return true; } var p = anchor; var index = anchor.segment + 1; var anchorDistance = 0; // move backwards along the line to the first segment the label appears on while (anchorDistance > -labelLength / 2) { index--; // there isn't enough room for the label after the beginning of the line if (index < 0) { return false; } anchorDistance -= line[index].dist(p); p = line[index]; } anchorDistance += line[index].dist(line[index + 1]); index++; // store recent corners and their total angle difference var recentCorners = []; var recentAngleDelta = 0; // move forwards by the length of the label and check angles along the way while (anchorDistance < labelLength / 2) { var prev = line[index - 1]; var current = line[index]; var next = line[index + 1]; // there isn't enough room for the label before the end of the line if (!next) { return false; } var angleDelta = prev.angleTo(current) - current.angleTo(next); // restrict angle to -pi..pi range angleDelta = Math.abs(((angleDelta + 3 * Math.PI) % (Math.PI * 2)) - Math.PI); recentCorners.push({ distance: anchorDistance, angleDelta: angleDelta }); recentAngleDelta += angleDelta; // remove corners that are far enough away from the list of recent anchors while (anchorDistance - recentCorners[0].distance > windowSize) { recentAngleDelta -= recentCorners.shift().angleDelta; } // the sum of angles within the window area exceeds the maximum allowed value. check fails. if (recentAngleDelta > maxAngle) { return false; } index++; anchorDistance += current.dist(next); } // no part of the line had an angle greater than the maximum allowed. check passes. return true; } },{}],220:[function(require,module,exports){ 'use strict';// var Point = require('@mapbox/point-geometry'); module.exports = clipLine; /** * Returns the part of a multiline that intersects with the provided rectangular box. * * @param lines * @param x1 the left edge of the box * @param y1 the top edge of the box * @param x2 the right edge of the box * @param y2 the bottom edge of the box * @returns lines * @private */ function clipLine(lines , x1 , y1 , x2 , y2 ) { var clippedLines = []; for (var l = 0; l < lines.length; l++) { var line = lines[l]; var clippedLine = (void 0); for (var i = 0; i < line.length - 1; i++) { var p0 = line[i]; var p1 = line[i + 1]; if (p0.x < x1 && p1.x < x1) { continue; } else if (p0.x < x1) { p0 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round(); } else if (p1.x < x1) { p1 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round(); } if (p0.y < y1 && p1.y < y1) { continue; } else if (p0.y < y1) { p0 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round(); } else if (p1.y < y1) { p1 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round(); } if (p0.x >= x2 && p1.x >= x2) { continue; } else if (p0.x >= x2) { p0 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round(); } else if (p1.x >= x2) { p1 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round(); } if (p0.y >= y2 && p1.y >= y2) { continue; } else if (p0.y >= y2) { p0 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round(); } else if (p1.y >= y2) { p1 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round(); } if (!clippedLine || !p0.equals(clippedLine[clippedLine.length - 1])) { clippedLine = [p0]; clippedLines.push(clippedLine); } clippedLine.push(p1); } } return clippedLines; } },{"@mapbox/point-geometry":4}],221:[function(require,module,exports){ 'use strict';// /** * A CollisionFeature represents the area of the tile covered by a single label. * It is used with CollisionIndex to check if the label overlaps with any * previous labels. A CollisionFeature is mostly just a set of CollisionBox * objects. * * @private */ var CollisionFeature = function CollisionFeature(collisionBoxArray , line , anchor , featureIndex , sourceLayerIndex , bucketIndex , shaped , boxScale , padding , alignLine , overscaling ) { var y1 = shaped.top * boxScale - padding; var y2 = shaped.bottom * boxScale + padding; var x1 = shaped.left * boxScale - padding; var x2 = shaped.right * boxScale + padding; this.boxStartIndex = collisionBoxArray.length; if (alignLine) { var height = y2 - y1; var length = x2 - x1; if (height > 0) { // set minimum box height to avoid very many small labels height = Math.max(10 * boxScale, height); this._addLineCollisionCircles(collisionBoxArray, line, anchor, (anchor.segment ), length, height, featureIndex, sourceLayerIndex, bucketIndex, overscaling); } } else { collisionBoxArray.emplaceBack(anchor.x, anchor.y, x1, y1, x2, y2, featureIndex, sourceLayerIndex, bucketIndex, 0, 0); } this.boxEndIndex = collisionBoxArray.length; }; /** * Create a set of CollisionBox objects for a line. * * @param labelLength The length of the label in geometry units. * @param anchor The point along the line around which the label is anchored. * @param boxSize The size of the collision boxes that will be created. * @private */ CollisionFeature.prototype._addLineCollisionCircles = function _addLineCollisionCircles (collisionBoxArray , line , anchor , segment , labelLength , boxSize , featureIndex , sourceLayerIndex , bucketIndex , overscaling ) { var step = boxSize / 2; var nBoxes = Math.floor(labelLength / step); // We calculate line collision circles out to 300% of what would normally be our // max size, to allow collision detection to work on labels that expand as // they move into the distance // Vertically oriented labels in the distant field can extend past this padding // This is a noticeable problem in overscaled tiles where the pitch 0-based // symbol spacing will put labels very close together in a pitched map. // To reduce the cost of adding extra collision circles, we slowly increase // them for overscaled tiles. var overscalingPaddingFactor = 1 + .4 * Math.log(overscaling) / Math.LN2; var nPitchPaddingBoxes = Math.floor(nBoxes * overscalingPaddingFactor / 2); // offset the center of the first box by half a box so that the edge of the // box is at the edge of the label. var firstBoxOffset = -boxSize / 2; var p = anchor; var index = segment + 1; var anchorDistance = firstBoxOffset; var labelStartDistance = -labelLength / 2; var paddingStartDistance = labelStartDistance - labelLength / 4; // move backwards along the line to the first segment the label appears on do { index--; if (index < 0) { if (anchorDistance > labelStartDistance) { // there isn't enough room for the label after the beginning of the line // checkMaxAngle should have already caught this return; } else { // The line doesn't extend far enough back for all of our padding, // but we got far enough to show the label under most conditions. index = 0; break; } } else { anchorDistance -= line[index].dist(p); p = line[index]; } } while (anchorDistance > paddingStartDistance); var segmentLength = line[index].dist(line[index + 1]); for (var i = -nPitchPaddingBoxes; i < nBoxes + nPitchPaddingBoxes; i++) { // the distance the box will be from the anchor var boxOffset = i * step; var boxDistanceToAnchor = labelStartDistance + boxOffset; // make the distance between pitch padding boxes bigger if (boxOffset < 0) { boxDistanceToAnchor += boxOffset; } if (boxOffset > labelLength) { boxDistanceToAnchor += boxOffset - labelLength; } if (boxDistanceToAnchor < anchorDistance) { // The line doesn't extend far enough back for this box, skip it // (This could allow for line collisions on distant tiles) continue; } // the box is not on the current segment. Move to the next segment. while (anchorDistance + segmentLength < boxDistanceToAnchor) { anchorDistance += segmentLength; index++; // There isn't enough room before the end of the line. if (index + 1 >= line.length) { return; } segmentLength = line[index].dist(line[index + 1]); } // the distance the box will be from the beginning of the segment var segmentBoxDistance = boxDistanceToAnchor - anchorDistance; var p0 = line[index]; var p1 = line[index + 1]; var boxAnchorPoint = p1.sub(p0)._unit()._mult(segmentBoxDistance)._add(p0)._round(); // If the box is within boxSize of the anchor, force the box to be used // (so even 0-width labels use at least one box) // Otherwise, the .8 multiplication gives us a little bit of conservative // padding in choosing which boxes to use (see CollisionIndex#placedCollisionCircles) var paddedAnchorDistance = Math.abs(boxDistanceToAnchor - firstBoxOffset) < step ? 0 : (boxDistanceToAnchor - firstBoxOffset) * 0.8; collisionBoxArray.emplaceBack(boxAnchorPoint.x, boxAnchorPoint.y, -boxSize / 2, -boxSize / 2, boxSize / 2, boxSize / 2, featureIndex, sourceLayerIndex, bucketIndex, boxSize / 2, paddedAnchorDistance); } }; module.exports = CollisionFeature; },{}],222:[function(require,module,exports){ 'use strict';// var Point = require('@mapbox/point-geometry'); var intersectionTests = require('../util/intersection_tests'); var Grid = require('./grid_index'); var glmatrix = require('@mapbox/gl-matrix'); var mat4 = glmatrix.mat4; var projection = require('../symbol/projection'); // When a symbol crosses the edge that causes it to be included in // collision detection, it will cause changes in the symbols around // it. This constant specifies how many pixels to pad the edge of // the viewport for collision detection so that the bulk of the changes // occur offscreen. Making this constant greater increases label // stability, but it's expensive. var viewportPadding = 100; /** * A collision index used to prevent symbols from overlapping. It keep tracks of * where previous symbols have been placed and is used to check if a new * symbol overlaps with any previously added symbols. * * There are two steps to insertion: first placeCollisionBox/Circles checks if * there's room for a symbol, then insertCollisionBox/Circles actually puts the * symbol in the index. The two step process allows paired symbols to be inserted * together even if they overlap. * * @private */ var CollisionIndex = function CollisionIndex( transform , grid, ignoredGrid ) { if ( grid === void 0 ) grid = new Grid(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25); if ( ignoredGrid === void 0 ) ignoredGrid = new Grid(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25); this.transform = transform; this.grid = grid; this.ignoredGrid = ignoredGrid; this.pitchfactor = Math.cos(transform._pitch) * transform.cameraToCenterDistance; this.screenRightBoundary = transform.width + viewportPadding; this.screenBottomBoundary = transform.height + viewportPadding; }; CollisionIndex.prototype.placeCollisionBox = function placeCollisionBox (collisionBox , allowOverlap , textPixelRatio , posMatrix ) { var projectedPoint = this.projectAndGetPerspectiveRatio(posMatrix, collisionBox.anchorPointX, collisionBox.anchorPointY); var tileToViewport = textPixelRatio * projectedPoint.perspectiveRatio; var tlX = collisionBox.x1 * tileToViewport + projectedPoint.point.x; var tlY = collisionBox.y1 * tileToViewport + projectedPoint.point.y; var brX = collisionBox.x2 * tileToViewport + projectedPoint.point.x; var brY = collisionBox.y2 * tileToViewport + projectedPoint.point.y; if (!allowOverlap) { if (this.grid.hitTest(tlX, tlY, brX, brY)) { return { box: [], offscreen: false }; } } return { box: [tlX, tlY, brX, brY], offscreen: this.isOffscreen(tlX, tlY, brX, brY) }; }; CollisionIndex.prototype.approximateTileDistance = function approximateTileDistance (tileDistance , lastSegmentAngle , pixelsToTileUnits , cameraToAnchorDistance , pitchWithMap ) { // This is a quick and dirty solution for chosing which collision circles to use (since collision circles are // laid out in tile units). Ideally, I think we should generate collision circles on the fly in viewport coordinates // at the time we do collision detection. // See https://github.com/mapbox/mapbox-gl-js/issues/5474 // incidenceStretch is the ratio of how much y space a label takes up on a tile while drawn perpendicular to the viewport vs // how much space it would take up if it were drawn flat on the tile // Using law of sines, camera_to_anchor/sin(ground_angle) = camera_to_center/sin(incidence_angle) // Incidence angle 90 -> head on, sin(incidence_angle) = 1, no stretch // Incidence angle 1 -> very oblique, sin(incidence_angle) =~ 0, lots of stretch // ground_angle = u_pitch + PI/2 -> sin(ground_angle) = cos(u_pitch) // incidenceStretch = 1 / sin(incidenceAngle) var incidenceStretch = pitchWithMap ? 1 : cameraToAnchorDistance / this.pitchfactor; var lastSegmentTile = tileDistance.lastSegmentViewportDistance * pixelsToTileUnits; return tileDistance.prevTileDistance + lastSegmentTile + (incidenceStretch - 1) * lastSegmentTile * Math.abs(Math.sin(lastSegmentAngle)); }; CollisionIndex.prototype.placeCollisionCircles = function placeCollisionCircles (collisionCircles , allowOverlap , scale , textPixelRatio , key , symbol , lineVertexArray , glyphOffsetArray , fontSize , posMatrix , labelPlaneMatrix , showCollisionCircles , pitchWithMap ) { var this$1 = this; var placedCollisionCircles = []; var projectedAnchor = this.projectAnchor(posMatrix, symbol.anchorX, symbol.anchorY); var projectionCache = {}; var fontScale = fontSize / 24; var lineOffsetX = symbol.lineOffsetX * fontSize; var lineOffsetY = symbol.lineOffsetY * fontSize; var tileUnitAnchorPoint = new Point(symbol.anchorX, symbol.anchorY); // projection.project generates NDC coordinates, as opposed to the // pixel-based grid coordinates generated by this.projectPoint var labelPlaneAnchorPoint = projection.project(tileUnitAnchorPoint, labelPlaneMatrix).point; var firstAndLastGlyph = projection.placeFirstAndLastGlyph( fontScale, glyphOffsetArray, lineOffsetX, lineOffsetY, /*flip*/ false, labelPlaneAnchorPoint, tileUnitAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache, /*return tile distance*/ true); var collisionDetected = false; var entirelyOffscreen = true; var tileToViewport = projectedAnchor.perspectiveRatio * textPixelRatio; // pixelsToTileUnits is used for translating line geometry to tile units // ... so we care about 'scale' but not 'perspectiveRatio' // equivalent to pixel_to_tile_units var pixelsToTileUnits = 1 / (textPixelRatio * scale); var firstTileDistance = 0, lastTileDistance = 0; if (firstAndLastGlyph) { firstTileDistance = this.approximateTileDistance(firstAndLastGlyph.first.tileDistance, firstAndLastGlyph.first.angle, pixelsToTileUnits, projectedAnchor.cameraDistance, pitchWithMap); lastTileDistance = this.approximateTileDistance(firstAndLastGlyph.last.tileDistance, firstAndLastGlyph.last.angle, pixelsToTileUnits, projectedAnchor.cameraDistance, pitchWithMap); } for (var k = 0; k < collisionCircles.length; k += 5) { var anchorPointX = collisionCircles[k]; var anchorPointY = collisionCircles[k + 1]; var tileUnitRadius = collisionCircles[k + 2]; var boxSignedDistanceFromAnchor = collisionCircles[k + 3]; if (!firstAndLastGlyph || (boxSignedDistanceFromAnchor < -firstTileDistance) || (boxSignedDistanceFromAnchor > lastTileDistance)) { // The label either doesn't fit on its line or we // don't need to use this circle because the label // doesn't extend this far. Either way, mark the circle unused. markCollisionCircleUsed(collisionCircles, k, false); continue; } var projectedPoint = this$1.projectPoint(posMatrix, anchorPointX, anchorPointY); var radius = tileUnitRadius * tileToViewport; var atLeastOneCirclePlaced = placedCollisionCircles.length > 0; if (atLeastOneCirclePlaced) { var dx = projectedPoint.x - placedCollisionCircles[placedCollisionCircles.length - 4]; var dy = projectedPoint.y - placedCollisionCircles[placedCollisionCircles.length - 3]; // The circle edges touch when the distance between their centers is 2x the radius // When the distance is 1x the radius, they're doubled up, and we could remove // every other circle while keeping them all in touch. // We actually start removing circles when the distance is √2x the radius: // thinning the number of circles as much as possible is a major performance win, // and the small gaps introduced don't make a very noticeable difference. var placedTooDensely = radius * radius * 2 > dx * dx + dy * dy; if (placedTooDensely) { var atLeastOneMoreCircle = (k + 8) < collisionCircles.length; if (atLeastOneMoreCircle) { var nextBoxDistanceToAnchor = collisionCircles[k + 8]; if ((nextBoxDistanceToAnchor > -firstTileDistance) && (nextBoxDistanceToAnchor < lastTileDistance)) { // Hide significantly overlapping circles, unless this is the last one we can // use, in which case we want to keep it in place even if it's tightly packed // with the one before it. markCollisionCircleUsed(collisionCircles, k, false); continue; } } } } var collisionBoxArrayIndex = k / 5; placedCollisionCircles.push(projectedPoint.x, projectedPoint.y, radius, collisionBoxArrayIndex); markCollisionCircleUsed(collisionCircles, k, true); entirelyOffscreen = entirelyOffscreen && this$1.isOffscreen(projectedPoint.x - radius, projectedPoint.y - radius, projectedPoint.x + radius, projectedPoint.y + radius); if (!allowOverlap) { if (this$1.grid.hitTestCircle(projectedPoint.x, projectedPoint.y, radius)) { if (!showCollisionCircles) { return { circles: [], offscreen: false }; } else { // Don't early exit if we're showing the debug circles because we still want to calculate // which circles are in use collisionDetected = true; } } } } return { circles: collisionDetected ? [] : placedCollisionCircles, offscreen: entirelyOffscreen }; }; /** * Because the geometries in the CollisionIndex are an approximation of the shape of * symbols on the map, we use the CollisionIndex to look up the symbol part of * `queryRenderedFeatures`. Non-symbol features are looked up tile-by-tile, and * historically collisions were handled per-tile. * * For this reason, `queryRenderedSymbols` still takes tile coordinate inputs and * converts them back to viewport coordinates. The change to a viewport coordinate * CollisionIndex means it's now possible to re-design queryRenderedSymbols to * run entirely in viewport coordinates, saving unnecessary conversions. * See https://github.com/mapbox/mapbox-gl-js/issues/5475 * * @private */ CollisionIndex.prototype.queryRenderedSymbols = function queryRenderedSymbols (queryGeometry , tileCoord , textPixelRatio , collisionBoxArray , sourceID , bucketInstanceIds ) { var this$1 = this; var sourceLayerFeatures = {}; var result = []; if (queryGeometry.length === 0 || (this.grid.keysLength() === 0 && this.ignoredGrid.keysLength() === 0)) { return result; } var posMatrix = this.transform.calculatePosMatrix(tileCoord.toUnwrapped()); var query = []; var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; for (var i = 0; i < queryGeometry.length; i++) { var ring = queryGeometry[i]; for (var k = 0; k < ring.length; k++) { var p = this$1.projectPoint(posMatrix, ring[k].x, ring[k].y); minX = Math.min(minX, p.x); minY = Math.min(minY, p.y); maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y); query.push(p); } } var tileID = tileCoord.key; var thisTileFeatures = []; var features = this.grid.query(minX, minY, maxX, maxY); for (var i$1 = 0; i$1 < features.length; i$1++) { // Only include results from the matching source, tile and version of the bucket that was indexed if (features[i$1].sourceID === sourceID && features[i$1].tileID === tileID && bucketInstanceIds[features[i$1].bucketInstanceId]) { thisTileFeatures.push(features[i$1].boxIndex); } } var ignoredFeatures = this.ignoredGrid.query(minX, minY, maxX, maxY); for (var i$2 = 0; i$2 < ignoredFeatures.length; i$2++) { if (ignoredFeatures[i$2].sourceID === sourceID && ignoredFeatures[i$2].tileID === tileID && bucketInstanceIds[ignoredFeatures[i$2].bucketInstanceId]) { thisTileFeatures.push(ignoredFeatures[i$2].boxIndex); } } for (var i$3 = 0; i$3 < thisTileFeatures.length; i$3++) { var blocking = collisionBoxArray.get(thisTileFeatures[i$3]); var sourceLayer = blocking.sourceLayerIndex; var featureIndex = blocking.featureIndex; var bucketIndex = blocking.bucketIndex; // Skip already seen features. if (sourceLayerFeatures[sourceLayer] === undefined) { sourceLayerFeatures[sourceLayer] = {}; } if (sourceLayerFeatures[sourceLayer][featureIndex] === undefined) { sourceLayerFeatures[sourceLayer][featureIndex] = {}; } if (sourceLayerFeatures[sourceLayer][featureIndex][bucketIndex]) { continue; } // Check if query intersects with the feature box // "Collision Circles" for line labels are treated as boxes here // Since there's no actual collision taking place, the circle vs. square // distinction doesn't matter as much, and box geometry is easier // to work with. var projectedPoint = this$1.projectAndGetPerspectiveRatio(posMatrix, blocking.anchorPointX, blocking.anchorPointY); var tileToViewport = textPixelRatio * projectedPoint.perspectiveRatio; var x1 = blocking.x1 * tileToViewport + projectedPoint.point.x; var y1 = blocking.y1 * tileToViewport + projectedPoint.point.y; var x2 = blocking.x2 * tileToViewport + projectedPoint.point.x; var y2 = blocking.y2 * tileToViewport + projectedPoint.point.y; var bbox = [ new Point(x1, y1), new Point(x2, y1), new Point(x2, y2), new Point(x1, y2) ]; if (!intersectionTests.polygonIntersectsPolygon(query, bbox)) { continue; } sourceLayerFeatures[sourceLayer][featureIndex][bucketIndex] = true; result.push(thisTileFeatures[i$3]); } return result; }; CollisionIndex.prototype.insertCollisionBox = function insertCollisionBox (collisionBox , ignorePlacement , tileID , sourceID , bucketInstanceId , boxStartIndex ) { var grid = ignorePlacement ? this.ignoredGrid : this.grid; var key = { tileID: tileID, sourceID: sourceID, bucketInstanceId: bucketInstanceId, boxIndex: boxStartIndex }; grid.insert(key, collisionBox[0], collisionBox[1], collisionBox[2], collisionBox[3]); }; CollisionIndex.prototype.insertCollisionCircles = function insertCollisionCircles (collisionCircles , ignorePlacement , tileID , sourceID , bucketInstanceId , boxStartIndex ) { var grid = ignorePlacement ? this.ignoredGrid : this.grid; for (var k = 0; k < collisionCircles.length; k += 4) { var key = { tileID: tileID, sourceID: sourceID, bucketInstanceId: bucketInstanceId, boxIndex: boxStartIndex + collisionCircles[k + 3] }; grid.insertCircle(key, collisionCircles[k], collisionCircles[k + 1], collisionCircles[k + 2]); } }; CollisionIndex.prototype.projectAnchor = function projectAnchor (posMatrix , x , y ) { var p = [x, y, 0, 1]; projection.xyTransformMat4(p, p, posMatrix); return { perspectiveRatio: 0.5 + 0.5 * (this.transform.cameraToCenterDistance / p[3]), cameraDistance: p[3] }; }; CollisionIndex.prototype.projectPoint = function projectPoint (posMatrix , x , y ) { var p = [x, y, 0, 1]; projection.xyTransformMat4(p, p, posMatrix); return new Point( (((p[0] / p[3] + 1) / 2) * this.transform.width) + viewportPadding, (((-p[1] / p[3] + 1) / 2) * this.transform.height) + viewportPadding ); }; CollisionIndex.prototype.projectAndGetPerspectiveRatio = function projectAndGetPerspectiveRatio (posMatrix , x , y ) { var p = [x, y, 0, 1]; projection.xyTransformMat4(p, p, posMatrix); var a = new Point( (((p[0] / p[3] + 1) / 2) * this.transform.width) + viewportPadding, (((-p[1] / p[3] + 1) / 2) * this.transform.height) + viewportPadding ); return { point: a, // See perspective ratio comment in symbol_sdf.vertex // We're doing collision detection in viewport space so we need // to scale down boxes in the distance perspectiveRatio: 0.5 + 0.5 * (this.transform.cameraToCenterDistance / p[3]) }; }; CollisionIndex.prototype.isOffscreen = function isOffscreen (x1 , y1 , x2 , y2 ) { return x2 < viewportPadding || x1 >= this.screenRightBoundary || y2 < viewportPadding || y1 > this.screenBottomBoundary; }; function markCollisionCircleUsed(collisionCircles , index , used ) { collisionCircles[index + 4] = used ? 1 : 0; } module.exports = CollisionIndex; },{"../symbol/projection":229,"../util/intersection_tests":269,"./grid_index":225,"@mapbox/gl-matrix":2,"@mapbox/point-geometry":4}],223:[function(require,module,exports){ 'use strict';// var EXTENT = require('../data/extent'); /* The CrossTileSymbolIndex generally works on the assumption that a conceptual "unique symbol" can be identified by the text of the label combined with the anchor point. The goal is to assign these conceptual "unique symbols" a shared crossTileID that can be used by Placement to keep fading opacity states consistent and to deduplicate labels. The CrossTileSymbolIndex indexes all the current symbol instances and their crossTileIDs. When a symbol bucket gets added or updated, the index assigns a crossTileID to each of it's symbol instances by either matching it with an existing id or assigning a new one. */ // Round anchor positions to roughly 4 pixel grid var roundingFactor = 512 / EXTENT / 2; var TileLayerIndex = function TileLayerIndex(tileID , symbolInstances , bucketInstanceId ) { var this$1 = this; this.tileID = tileID; this.indexedSymbolInstances = {}; this.bucketInstanceId = bucketInstanceId; for (var i = 0, list = symbolInstances; i < list.length; i += 1) { var symbolInstance = list[i]; var key = symbolInstance.key; if (!this$1.indexedSymbolInstances[key]) { this$1.indexedSymbolInstances[key] = []; } // This tile may have multiple symbol instances with the same key // Store each one along with its coordinates this$1.indexedSymbolInstances[key].push({ crossTileID: symbolInstance.crossTileID, coord: this$1.getScaledCoordinates(symbolInstance, tileID) }); } }; // Converts the coordinates of the input symbol instance into coordinates that be can compared // against other symbols in this index. Coordinates are: // (1) world-based (so after conversion the source tile is irrelevant) // (2) converted to the z-scale of this TileLayerIndex // (3) down-sampled by "roundingFactor" from tile coordinate precision in order to be // more tolerant of small differences between tiles. TileLayerIndex.prototype.getScaledCoordinates = function getScaledCoordinates (symbolInstance , childTileID ) { var zDifference = childTileID.canonical.z - this.tileID.canonical.z; var scale = roundingFactor / Math.pow(2, zDifference); var anchor = symbolInstance.anchor; return { x: Math.floor((childTileID.canonical.x * EXTENT + anchor.x) * scale), y: Math.floor((childTileID.canonical.y * EXTENT + anchor.y) * scale) }; }; TileLayerIndex.prototype.findMatches = function findMatches (symbolInstances , newTileID , zoomCrossTileIDs ) { var this$1 = this; var tolerance = this.tileID.canonical.z < newTileID.canonical.z ? 1 : Math.pow(2, this.tileID.canonical.z - newTileID.canonical.z); for (var i = 0, list = symbolInstances; i < list.length; i += 1) { var symbolInstance = list[i]; if (symbolInstance.crossTileID) { // already has a match, skip continue; } var indexedInstances = this$1.indexedSymbolInstances[symbolInstance.key]; if (!indexedInstances) { // No symbol with this key in this bucket continue; } var scaledSymbolCoord = this$1.getScaledCoordinates(symbolInstance, newTileID); for (var i$1 = 0, list$1 = indexedInstances; i$1 < list$1.length; i$1 += 1) { // Return any symbol with the same keys whose coordinates are within 1 // grid unit. (with a 4px grid, this covers a 12px by 12px area) var thisTileSymbol = list$1[i$1]; if (Math.abs(thisTileSymbol.coord.x - scaledSymbolCoord.x) <= tolerance && Math.abs(thisTileSymbol.coord.y - scaledSymbolCoord.y) <= tolerance && !zoomCrossTileIDs[thisTileSymbol.crossTileID]) { // Once we've marked ourselves duplicate against this parent symbol, // don't let any other symbols at the same zoom level duplicate against // the same parent (see issue #5993) zoomCrossTileIDs[thisTileSymbol.crossTileID] = true; symbolInstance.crossTileID = thisTileSymbol.crossTileID; break; } } } }; var CrossTileIDs = function CrossTileIDs() { this.maxCrossTileID = 0; }; CrossTileIDs.prototype.generate = function generate () { return ++this.maxCrossTileID; }; var CrossTileSymbolLayerIndex = function CrossTileSymbolLayerIndex() { this.indexes = {}; this.usedCrossTileIDs = {}; }; CrossTileSymbolLayerIndex.prototype.addBucket = function addBucket (tileID , bucket , crossTileIDs ) { var this$1 = this; if (this.indexes[tileID.overscaledZ] && this.indexes[tileID.overscaledZ][tileID.key]) { if (this.indexes[tileID.overscaledZ][tileID.key].bucketInstanceId === bucket.bucketInstanceId) { return false; } else { // We're replacing this bucket with an updated version // Remove the old bucket's "used crossTileIDs" now so that // the new bucket can claim them. // The old index entries themselves stick around until // 'removeStaleBuckets' is called. this.removeBucketCrossTileIDs(tileID.overscaledZ, this.indexes[tileID.overscaledZ][tileID.key]); } } for (var i = 0, list = bucket.symbolInstances; i < list.length; i += 1) { var symbolInstance = list[i]; symbolInstance.crossTileID = 0; } if (!this.usedCrossTileIDs[tileID.overscaledZ]) { this.usedCrossTileIDs[tileID.overscaledZ] = {}; } var zoomCrossTileIDs = this.usedCrossTileIDs[tileID.overscaledZ]; for (var zoom in this$1.indexes) { var zoomIndexes = this$1.indexes[zoom]; if (Number(zoom) > tileID.overscaledZ) { for (var id in zoomIndexes) { var childIndex = zoomIndexes[id]; if (childIndex.tileID.isChildOf(tileID)) { childIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs); } } } else { var parentCoord = tileID.scaledTo(Number(zoom)); var parentIndex = zoomIndexes[parentCoord.key]; if (parentIndex) { parentIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs); } } } for (var i$1 = 0, list$1 = bucket.symbolInstances; i$1 < list$1.length; i$1 += 1) { var symbolInstance$1 = list$1[i$1]; if (!symbolInstance$1.crossTileID) { // symbol did not match any known symbol, assign a new id symbolInstance$1.crossTileID = crossTileIDs.generate(); zoomCrossTileIDs[symbolInstance$1.crossTileID] = true; } } if (this.indexes[tileID.overscaledZ] === undefined) { this.indexes[tileID.overscaledZ] = {}; } this.indexes[tileID.overscaledZ][tileID.key] = new TileLayerIndex(tileID, bucket.symbolInstances, bucket.bucketInstanceId); return true; }; CrossTileSymbolLayerIndex.prototype.removeBucketCrossTileIDs = function removeBucketCrossTileIDs (zoom , removedBucket ) { var this$1 = this; for (var key in removedBucket.indexedSymbolInstances) { for (var i = 0, list = removedBucket.indexedSymbolInstances[key]; i < list.length; i += 1) { var symbolInstance = list[i]; delete this$1.usedCrossTileIDs[zoom][symbolInstance.crossTileID]; } } }; CrossTileSymbolLayerIndex.prototype.removeStaleBuckets = function removeStaleBuckets (currentIDs ) { var this$1 = this; var tilesChanged = false; for (var z in this$1.indexes) { var zoomIndexes = this$1.indexes[z]; for (var tileKey in zoomIndexes) { if (!currentIDs[zoomIndexes[tileKey].bucketInstanceId]) { this$1.removeBucketCrossTileIDs(z, zoomIndexes[tileKey]); delete zoomIndexes[tileKey]; tilesChanged = true; } } } return tilesChanged; }; var CrossTileSymbolIndex = function CrossTileSymbolIndex() { this.layerIndexes = {}; this.crossTileIDs = new CrossTileIDs(); this.maxBucketInstanceId = 0; }; CrossTileSymbolIndex.prototype.addLayer = function addLayer (styleLayer , tiles ) { var this$1 = this; var layerIndex = this.layerIndexes[styleLayer.id]; if (layerIndex === undefined) { layerIndex = this.layerIndexes[styleLayer.id] = new CrossTileSymbolLayerIndex(); } var symbolBucketsChanged = false; var currentBucketIDs = {}; for (var i = 0, list = tiles; i < list.length; i += 1) { var tile = list[i]; var symbolBucket = ((tile.getBucket(styleLayer) ) ); if (!symbolBucket) { continue; } if (!symbolBucket.bucketInstanceId) { symbolBucket.bucketInstanceId = ++this$1.maxBucketInstanceId; } if (layerIndex.addBucket(tile.tileID, symbolBucket, this$1.crossTileIDs)) { symbolBucketsChanged = true; } currentBucketIDs[symbolBucket.bucketInstanceId] = true; } if (layerIndex.removeStaleBuckets(currentBucketIDs)) { symbolBucketsChanged = true; } return symbolBucketsChanged; }; CrossTileSymbolIndex.prototype.pruneUnusedLayers = function pruneUnusedLayers (usedLayers ) { var this$1 = this; var usedLayerMap = {}; usedLayers.forEach(function (usedLayer) { usedLayerMap[usedLayer] = true; }); for (var layerId in this$1.layerIndexes) { if (!usedLayerMap[layerId]) { delete this$1.layerIndexes[layerId]; } } }; module.exports = CrossTileSymbolIndex; },{"../data/extent":58}],224:[function(require,module,exports){ 'use strict';// var interpolate = require('../style-spec/util/interpolate').number; var Anchor = require('../symbol/anchor'); var checkMaxAngle = require('./check_max_angle'); module.exports = getAnchors; function getAnchors(line , spacing , maxAngle , shapedText , shapedIcon , glyphSize , boxScale , overscaling , tileExtent ) { // Resample a line to get anchor points for labels and check that each // potential label passes text-max-angle check and has enough froom to fit // on the line. var angleWindowSize = shapedText ? 3 / 5 * glyphSize * boxScale : 0; var labelLength = Math.max( shapedText ? shapedText.right - shapedText.left : 0, shapedIcon ? shapedIcon.right - shapedIcon.left : 0); // Is the line continued from outside the tile boundary? var isLineContinued = line[0].x === 0 || line[0].x === tileExtent || line[0].y === 0 || line[0].y === tileExtent; // Is the label long, relative to the spacing? // If so, adjust the spacing so there is always a minimum space of `spacing / 4` between label edges. if (spacing - labelLength * boxScale < spacing / 4) { spacing = labelLength * boxScale + spacing / 4; } // Offset the first anchor by: // Either half the label length plus a fixed extra offset if the line is not continued // Or half the spacing if the line is continued. // For non-continued lines, add a bit of fixed extra offset to avoid collisions at T intersections. var fixedExtraOffset = glyphSize * 2; var offset = !isLineContinued ? ((labelLength / 2 + fixedExtraOffset) * boxScale * overscaling) % spacing : (spacing / 2 * overscaling) % spacing; return resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength * boxScale, isLineContinued, false, tileExtent); } function resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, placeAtMiddle, tileExtent) { var halfLabelLength = labelLength / 2; var lineLength = 0; for (var k = 0; k < line.length - 1; k++) { lineLength += line[k].dist(line[k + 1]); } var distance = 0, markedDistance = offset - spacing; var anchors = []; for (var i = 0; i < line.length - 1; i++) { var a = line[i], b = line[i + 1]; var segmentDist = a.dist(b), angle = b.angleTo(a); while (markedDistance + spacing < distance + segmentDist) { markedDistance += spacing; var t = (markedDistance - distance) / segmentDist, x = interpolate(a.x, b.x, t), y = interpolate(a.y, b.y, t); // Check that the point is within the tile boundaries and that // the label would fit before the beginning and end of the line // if placed at this point. if (x >= 0 && x < tileExtent && y >= 0 && y < tileExtent && markedDistance - halfLabelLength >= 0 && markedDistance + halfLabelLength <= lineLength) { var anchor = new Anchor(x, y, angle, i); anchor._round(); if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) { anchors.push(anchor); } } } distance += segmentDist; } if (!placeAtMiddle && !anchors.length && !isLineContinued) { // The first attempt at finding anchors at which labels can be placed failed. // Try again, but this time just try placing one anchor at the middle of the line. // This has the most effect for short lines in overscaled tiles, since the // initial offset used in overscaled tiles is calculated to align labels with positions in // parent tiles instead of placing the label as close to the beginning as possible. anchors = resample(line, distance / 2, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, true, tileExtent); } return anchors; } },{"../style-spec/util/interpolate":163,"../symbol/anchor":218,"./check_max_angle":219}],225:[function(require,module,exports){ 'use strict';// /** * GridIndex is a data structure for testing the intersection of * circles and rectangles in a 2d plane. * It is optimized for rapid insertion and querying. * GridIndex splits the plane into a set of "cells" and keeps track * of which geometries intersect with each cell. At query time, * full geometry comparisons are only done for items that share * at least one cell. As long as the geometries are relatively * uniformly distributed across the plane, this greatly reduces * the number of comparisons necessary. * * @private */ var GridIndex = function GridIndex (width , height , cellSize ) { var boxCells = this.boxCells = []; var circleCells = this.circleCells = []; // More cells -> fewer geometries to check per cell, but items tend // to be split across more cells. // Sweet spot allows most small items to fit in one cell this.xCellCount = Math.ceil(width / cellSize); this.yCellCount = Math.ceil(height / cellSize); for (var i = 0; i < this.xCellCount * this.yCellCount; i++) { boxCells.push([]); circleCells.push([]); } this.circleKeys = []; this.boxKeys = []; this.bboxes = []; this.circles = []; this.width = width; this.height = height; this.xScale = this.xCellCount / width; this.yScale = this.yCellCount / height; this.boxUid = 0; this.circleUid = 0; }; GridIndex.prototype.keysLength = function keysLength () { return this.boxKeys.length + this.circleKeys.length; }; GridIndex.prototype.insert = function insert (key , x1 , y1 , x2 , y2 ) { this._forEachCell(x1, y1, x2, y2, this._insertBoxCell, this.boxUid++); this.boxKeys.push(key); this.bboxes.push(x1); this.bboxes.push(y1); this.bboxes.push(x2); this.bboxes.push(y2); }; GridIndex.prototype.insertCircle = function insertCircle (key , x , y , radius ) { // Insert circle into grid for all cells in the circumscribing square // It's more than necessary (by a factor of 4/PI), but fast to insert this._forEachCell(x - radius, y - radius, x + radius, y + radius, this._insertCircleCell, this.circleUid++); this.circleKeys.push(key); this.circles.push(x); this.circles.push(y); this.circles.push(radius); }; GridIndex.prototype._insertBoxCell = function _insertBoxCell (x1 , y1 , x2 , y2 , cellIndex , uid ) { this.boxCells[cellIndex].push(uid); }; GridIndex.prototype._insertCircleCell = function _insertCircleCell (x1 , y1 , x2 , y2 , cellIndex , uid ) { this.circleCells[cellIndex].push(uid); }; GridIndex.prototype._query = function _query (x1 , y1 , x2 , y2 , hitTest ) { if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) { return hitTest ? false : []; } var result = []; if (x1 <= 0 && y1 <= 0 && this.width <= x2 && this.height <= y2) { // We use `Array#slice` because `this.keys` may be a `Int32Array` and // some browsers (Safari and IE) do not support `TypedArray#slice` // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice#Browser_compatibility result = Array.prototype.slice.call(this.boxKeys).concat(this.circleKeys); } else { var queryArgs = { hitTest: hitTest, seenUids: { box: {}, circle: {} } }; this._forEachCell(x1, y1, x2, y2, this._queryCell, result, queryArgs); } return hitTest ? result.length > 0 : result; }; GridIndex.prototype._queryCircle = function _queryCircle (x , y , radius , hitTest ) { // Insert circle into grid for all cells in the circumscribing square // It's more than necessary (by a factor of 4/PI), but fast to insert var x1 = x - radius; var x2 = x + radius; var y1 = y - radius; var y2 = y + radius; if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) { return hitTest ? false : []; } // Box query early exits if the bounding box is larger than the grid, but we don't do // the equivalent calculation for circle queries because early exit is less likely // and the calculation is more expensive var result = []; var queryArgs = { hitTest: hitTest, circle: { x: x, y: y, radius: radius }, seenUids: { box: {}, circle: {} } }; this._forEachCell(x1, y1, x2, y2, this._queryCellCircle, result, queryArgs); return hitTest ? result.length > 0 : result; }; GridIndex.prototype.query = function query (x1 , y1 , x2 , y2 ) { return (this._query(x1, y1, x2, y2, false) ); }; GridIndex.prototype.hitTest = function hitTest (x1 , y1 , x2 , y2 ) { return (this._query(x1, y1, x2, y2, true) ); }; GridIndex.prototype.hitTestCircle = function hitTestCircle (x , y , radius ) { return (this._queryCircle(x, y, radius, true) ); }; GridIndex.prototype._queryCell = function _queryCell (x1 , y1 , x2 , y2 , cellIndex , result , queryArgs ) { var this$1 = this; var seenUids = queryArgs.seenUids; var boxCell = this.boxCells[cellIndex]; if (boxCell !== null) { var bboxes = this.bboxes; for (var i = 0, list = boxCell; i < list.length; i += 1) { var boxUid = list[i]; if (!seenUids.box[boxUid]) { seenUids.box[boxUid] = true; var offset = boxUid * 4; if ((x1 <= bboxes[offset + 2]) && (y1 <= bboxes[offset + 3]) && (x2 >= bboxes[offset + 0]) && (y2 >= bboxes[offset + 1])) { if (queryArgs.hitTest) { result.push(true); return true; } else { result.push(this$1.boxKeys[boxUid]); } } } } } var circleCell = this.circleCells[cellIndex]; if (circleCell !== null) { var circles = this.circles; for (var i$1 = 0, list$1 = circleCell; i$1 < list$1.length; i$1 += 1) { var circleUid = list$1[i$1]; if (!seenUids.circle[circleUid]) { seenUids.circle[circleUid] = true; var offset$1 = circleUid * 3; if (this$1._circleAndRectCollide( circles[offset$1], circles[offset$1 + 1], circles[offset$1 + 2], x1, y1, x2, y2)) { if (queryArgs.hitTest) { result.push(true); return true; } else { result.push(this$1.circleKeys[circleUid]); } } } } } }; GridIndex.prototype._queryCellCircle = function _queryCellCircle (x1 , y1 , x2 , y2 , cellIndex , result , queryArgs ) { var this$1 = this; var circle = queryArgs.circle; var seenUids = queryArgs.seenUids; var boxCell = this.boxCells[cellIndex]; if (boxCell !== null) { var bboxes = this.bboxes; for (var i = 0, list = boxCell; i < list.length; i += 1) { var boxUid = list[i]; if (!seenUids.box[boxUid]) { seenUids.box[boxUid] = true; var offset = boxUid * 4; if (this$1._circleAndRectCollide( circle.x, circle.y, circle.radius, bboxes[offset + 0], bboxes[offset + 1], bboxes[offset + 2], bboxes[offset + 3])) { result.push(true); return true; } } } } var circleCell = this.circleCells[cellIndex]; if (circleCell !== null) { var circles = this.circles; for (var i$1 = 0, list$1 = circleCell; i$1 < list$1.length; i$1 += 1) { var circleUid = list$1[i$1]; if (!seenUids.circle[circleUid]) { seenUids.circle[circleUid] = true; var offset$1 = circleUid * 3; if (this$1._circlesCollide( circles[offset$1], circles[offset$1 + 1], circles[offset$1 + 2], circle.x, circle.y, circle.radius)) { result.push(true); return true; } } } } }; GridIndex.prototype._forEachCell = function _forEachCell (x1 , y1 , x2 , y2 , fn , arg1 , arg2 ) { var this$1 = this; var cx1 = this._convertToXCellCoord(x1); var cy1 = this._convertToYCellCoord(y1); var cx2 = this._convertToXCellCoord(x2); var cy2 = this._convertToYCellCoord(y2); for (var x = cx1; x <= cx2; x++) { for (var y = cy1; y <= cy2; y++) { var cellIndex = this$1.xCellCount * y + x; if (fn.call(this$1, x1, y1, x2, y2, cellIndex, arg1, arg2)) { return; } } } }; GridIndex.prototype._convertToXCellCoord = function _convertToXCellCoord (x ) { return Math.max(0, Math.min(this.xCellCount - 1, Math.floor(x * this.xScale))); }; GridIndex.prototype._convertToYCellCoord = function _convertToYCellCoord (y ) { return Math.max(0, Math.min(this.yCellCount - 1, Math.floor(y * this.yScale))); }; GridIndex.prototype._circlesCollide = function _circlesCollide (x1 , y1 , r1 , x2 , y2 , r2 ) { var dx = x2 - x1; var dy = y2 - y1; var bothRadii = r1 + r2; return (bothRadii * bothRadii) > (dx * dx + dy * dy); }; GridIndex.prototype._circleAndRectCollide = function _circleAndRectCollide (circleX , circleY , radius , x1 , y1 , x2 , y2 ) { var halfRectWidth = (x2 - x1) / 2; var distX = Math.abs(circleX - (x1 + halfRectWidth)); if (distX > (halfRectWidth + radius)) { return false; } var halfRectHeight = (y2 - y1) / 2; var distY = Math.abs(circleY - (y1 + halfRectHeight)); if (distY > (halfRectHeight + radius)) { return false; } if (distX <= halfRectWidth || distY <= halfRectHeight) { return true; } var dx = distX - halfRectWidth; var dy = distY - halfRectHeight; return (dx * dx + dy * dy <= (radius * radius)); }; module.exports = GridIndex; },{}],226:[function(require,module,exports){ 'use strict';// module.exports = function (features ) { var leftIndex = {}; var rightIndex = {}; var mergedFeatures = []; var mergedIndex = 0; function add(k) { mergedFeatures.push(features[k]); mergedIndex++; } function mergeFromRight(leftKey , rightKey , geom) { var i = rightIndex[leftKey]; delete rightIndex[leftKey]; rightIndex[rightKey] = i; mergedFeatures[i].geometry[0].pop(); mergedFeatures[i].geometry[0] = mergedFeatures[i].geometry[0].concat(geom[0]); return i; } function mergeFromLeft(leftKey , rightKey , geom) { var i = leftIndex[rightKey]; delete leftIndex[rightKey]; leftIndex[leftKey] = i; mergedFeatures[i].geometry[0].shift(); mergedFeatures[i].geometry[0] = geom[0].concat(mergedFeatures[i].geometry[0]); return i; } function getKey(text, geom, onRight) { var point = onRight ? geom[0][geom[0].length - 1] : geom[0][0]; return (text + ":" + (point.x) + ":" + (point.y)); } for (var k = 0; k < features.length; k++) { var feature = features[k]; var geom = feature.geometry; var text = feature.text; if (!text) { add(k); continue; } var leftKey = getKey(text, geom), rightKey = getKey(text, geom, true); if ((leftKey in rightIndex) && (rightKey in leftIndex) && (rightIndex[leftKey] !== leftIndex[rightKey])) { // found lines with the same text adjacent to both ends of the current line, merge all three var j = mergeFromLeft(leftKey, rightKey, geom); var i = mergeFromRight(leftKey, rightKey, mergedFeatures[j].geometry); delete leftIndex[leftKey]; delete rightIndex[rightKey]; rightIndex[getKey(text, mergedFeatures[i].geometry, true)] = i; mergedFeatures[j].geometry = (null ); } else if (leftKey in rightIndex) { // found mergeable line adjacent to the start of the current line, merge mergeFromRight(leftKey, rightKey, geom); } else if (rightKey in leftIndex) { // found mergeable line adjacent to the end of the current line, merge mergeFromLeft(leftKey, rightKey, geom); } else { // no adjacent lines, add as a new item add(k); leftIndex[leftKey] = mergedIndex - 1; rightIndex[rightKey] = mergedIndex - 1; } } return mergedFeatures.filter(function (f) { return f.geometry; }); }; },{}],227:[function(require,module,exports){ 'use strict';// var ref = require('../util/web_worker_transfer'); var register = ref.register; var OpacityState = function OpacityState() { this.opacity = 0; this.targetOpacity = 0; this.time = 0; }; OpacityState.prototype.clone = function clone () { var clone = new OpacityState(); clone.opacity = this.opacity; clone.targetOpacity = this.targetOpacity; clone.time = this.time; return clone; }; register('OpacityState', OpacityState); module.exports = OpacityState; },{"../util/web_worker_transfer":283}],228:[function(require,module,exports){ 'use strict';// var CollisionIndex = require('./collision_index'); var EXTENT = require('../data/extent'); var symbolSize = require('./symbol_size'); var projection = require('./projection'); var symbolLayoutProperties = require('../style/style_layer/symbol_style_layer_properties').layout; var assert = require('assert'); var pixelsToTileUnits = require('../source/pixels_to_tile_units'); var OpacityState = function OpacityState(prevState , increment , placed , skipFade ) { if (prevState) { this.opacity = Math.max(0, Math.min(1, prevState.opacity + (prevState.placed ? increment : -increment))); } else { this.opacity = (skipFade && placed) ? 1 : 0; } this.placed = placed; }; OpacityState.prototype.isHidden = function isHidden () { return this.opacity === 0 && !this.placed; }; var JointOpacityState = function JointOpacityState(prevState , increment , placedText , placedIcon , skipFade ) { this.text = new OpacityState(prevState ? prevState.text : null, increment, placedText, skipFade); this.icon = new OpacityState(prevState ? prevState.icon : null, increment, placedIcon, skipFade); }; JointOpacityState.prototype.isHidden = function isHidden () { return this.text.isHidden() && this.icon.isHidden(); }; var JointPlacement = function JointPlacement(text , icon , skipFade ) { this.text = text; this.icon = icon; this.skipFade = skipFade; }; var Placement = function Placement(transform , fadeDuration ) { this.transform = transform.clone(); this.collisionIndex = new CollisionIndex(this.transform); this.placements = {}; this.opacities = {}; this.stale = false; this.fadeDuration = fadeDuration; }; Placement.prototype.placeLayerTile = function placeLayerTile (styleLayer , tile , showCollisionBoxes , seenCrossTileIDs ) { var symbolBucket = ((tile.getBucket(styleLayer) ) ); if (!symbolBucket) { return; } var layout = symbolBucket.layers[0].layout; var scale = Math.pow(2, this.transform.zoom - tile.tileID.overscaledZ); var textPixelRatio = tile.tileSize / EXTENT; var posMatrix = this.transform.calculatePosMatrix(tile.tileID.toUnwrapped()); var textLabelPlaneMatrix = projection.getLabelPlaneMatrix(posMatrix, layout.get('text-pitch-alignment') === 'map', layout.get('text-rotation-alignment') === 'map', this.transform, pixelsToTileUnits(tile, 1, this.transform.zoom)); var iconLabelPlaneMatrix = projection.getLabelPlaneMatrix(posMatrix, layout.get('icon-pitch-alignment') === 'map', layout.get('icon-rotation-alignment') === 'map', this.transform, pixelsToTileUnits(tile, 1, this.transform.zoom)); this.placeLayerBucket(symbolBucket, posMatrix, textLabelPlaneMatrix, iconLabelPlaneMatrix, scale, textPixelRatio, showCollisionBoxes, seenCrossTileIDs, tile.collisionBoxArray, tile.tileID.key, styleLayer.source); }; Placement.prototype.placeLayerBucket = function placeLayerBucket (bucket , posMatrix , textLabelPlaneMatrix , iconLabelPlaneMatrix , scale , textPixelRatio , showCollisionBoxes , seenCrossTileIDs , collisionBoxArray , tileKey , sourceID ) { var this$1 = this; var layout = bucket.layers[0].layout; var partiallyEvaluatedTextSize = symbolSize.evaluateSizeForZoom(bucket.textSizeData, this.transform.zoom, symbolLayoutProperties.properties['text-size']); var iconWithoutText = !bucket.hasTextData() || layout.get('text-optional'); var textWithoutIcon = !bucket.hasIconData() || layout.get('icon-optional'); for (var i = 0, list = bucket.symbolInstances; i < list.length; i += 1) { var symbolInstance = list[i]; if (!seenCrossTileIDs[symbolInstance.crossTileID]) { var placeText = false; var placeIcon = false; var offscreen = true; var placedGlyphBoxes = null; var placedGlyphCircles = null; var placedIconBoxes = null; if (!symbolInstance.collisionArrays) { symbolInstance.collisionArrays = bucket.deserializeCollisionBoxes( ((collisionBoxArray ) ), symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex); } if (symbolInstance.collisionArrays.textBox) { placedGlyphBoxes = this$1.collisionIndex.placeCollisionBox(symbolInstance.collisionArrays.textBox, layout.get('text-allow-overlap'), textPixelRatio, posMatrix); placeText = placedGlyphBoxes.box.length > 0; offscreen = offscreen && placedGlyphBoxes.offscreen; } var textCircles = symbolInstance.collisionArrays.textCircles; if (textCircles) { var placedSymbol = bucket.text.placedSymbolArray.get(symbolInstance.placedTextSymbolIndices[0]); var fontSize = symbolSize.evaluateSizeForFeature(bucket.textSizeData, partiallyEvaluatedTextSize, placedSymbol); placedGlyphCircles = this$1.collisionIndex.placeCollisionCircles(textCircles, layout.get('text-allow-overlap'), scale, textPixelRatio, symbolInstance.key, placedSymbol, bucket.lineVertexArray, bucket.glyphOffsetArray, fontSize, posMatrix, textLabelPlaneMatrix, showCollisionBoxes, layout.get('text-pitch-alignment') === 'map'); // If text-allow-overlap is set, force "placedCircles" to true // In theory there should always be at least one circle placed // in this case, but for now quirks in text-anchor // and text-offset may prevent that from being true. placeText = layout.get('text-allow-overlap') || placedGlyphCircles.circles.length > 0; offscreen = offscreen && placedGlyphCircles.offscreen; } if (symbolInstance.collisionArrays.iconBox) { placedIconBoxes = this$1.collisionIndex.placeCollisionBox(symbolInstance.collisionArrays.iconBox, layout.get('icon-allow-overlap'), textPixelRatio, posMatrix); placeIcon = placedIconBoxes.box.length > 0; offscreen = offscreen && placedIconBoxes.offscreen; } // Combine the scales for icons and text. if (!iconWithoutText && !textWithoutIcon) { placeIcon = placeText = placeIcon && placeText; } else if (!textWithoutIcon) { placeText = placeIcon && placeText; } else if (!iconWithoutText) { placeIcon = placeIcon && placeText; } if (placeText && placedGlyphBoxes) { this$1.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, layout.get('text-ignore-placement'), tileKey, sourceID, bucket.bucketInstanceId, symbolInstance.textBoxStartIndex); } if (placeIcon && placedIconBoxes) { this$1.collisionIndex.insertCollisionBox(placedIconBoxes.box, layout.get('icon-ignore-placement'), tileKey, sourceID, bucket.bucketInstanceId, symbolInstance.iconBoxStartIndex); } if (placeText && placedGlyphCircles) { this$1.collisionIndex.insertCollisionCircles(placedGlyphCircles.circles, layout.get('text-ignore-placement'), tileKey, sourceID, bucket.bucketInstanceId, symbolInstance.textBoxStartIndex); } assert(symbolInstance.crossTileID !== 0); assert(bucket.bucketInstanceId !== 0); this$1.placements[symbolInstance.crossTileID] = new JointPlacement(placeText, placeIcon, offscreen || bucket.justReloaded); seenCrossTileIDs[symbolInstance.crossTileID] = true; } } bucket.justReloaded = false; }; Placement.prototype.commit = function commit (prevPlacement , now ) { var this$1 = this; this.commitTime = now; var placementChanged = false; var increment = (prevPlacement && this.fadeDuration !== 0) ? (this.commitTime - prevPlacement.commitTime) / this.fadeDuration : 1; var prevOpacities = prevPlacement ? prevPlacement.opacities : {}; // add the opacities from the current placement, and copy their current values from the previous placement for (var crossTileID in this$1.placements) { var jointPlacement = this$1.placements[crossTileID]; var prevOpacity = prevOpacities[crossTileID]; if (prevOpacity) { this$1.opacities[crossTileID] = new JointOpacityState(prevOpacity, increment, jointPlacement.text, jointPlacement.icon); placementChanged = placementChanged || jointPlacement.text !== prevOpacity.text.placed || jointPlacement.icon !== prevOpacity.icon.placed; } else { this$1.opacities[crossTileID] = new JointOpacityState(null, increment, jointPlacement.text, jointPlacement.icon, jointPlacement.skipFade); placementChanged = placementChanged || jointPlacement.text || jointPlacement.icon; } } // copy and update values from the previous placement that aren't in the current placement but haven't finished fading for (var crossTileID$1 in prevOpacities) { var prevOpacity$1 = prevOpacities[crossTileID$1]; if (!this$1.opacities[crossTileID$1]) { var jointOpacity = new JointOpacityState(prevOpacity$1, increment, false, false); if (!jointOpacity.isHidden()) { this$1.opacities[crossTileID$1] = jointOpacity; placementChanged = placementChanged || prevOpacity$1.text.placed || prevOpacity$1.icon.placed; } } } // this.lastPlacementChangeTime is the time of the last commit() that // resulted in a placement change -- in other words, the start time of // the last symbol fade animation assert(!prevPlacement || prevPlacement.lastPlacementChangeTime !== undefined); if (placementChanged) { this.lastPlacementChangeTime = now; } else if (typeof this.lastPlacementChangeTime !== 'number') { this.lastPlacementChangeTime = prevPlacement ? prevPlacement.lastPlacementChangeTime : now; } }; Placement.prototype.updateLayerOpacities = function updateLayerOpacities (styleLayer , tiles ) { var this$1 = this; var seenCrossTileIDs = {}; for (var i = 0, list = tiles; i < list.length; i += 1) { var tile = list[i]; var symbolBucket = ((tile.getBucket(styleLayer) ) ); if (symbolBucket) { this$1.updateBucketOpacities(symbolBucket, seenCrossTileIDs, tile.collisionBoxArray); } } }; Placement.prototype.updateBucketOpacities = function updateBucketOpacities (bucket , seenCrossTileIDs , collisionBoxArray ) { var this$1 = this; if (bucket.hasTextData()) { bucket.text.opacityVertexArray.clear(); } if (bucket.hasIconData()) { bucket.icon.opacityVertexArray.clear(); } if (bucket.hasCollisionBoxData()) { bucket.collisionBox.collisionVertexArray.clear(); } if (bucket.hasCollisionCircleData()) { bucket.collisionCircle.collisionVertexArray.clear(); } var layout = bucket.layers[0].layout; var defaultOpacityState = new JointOpacityState(null, 0, layout.get('text-allow-overlap'), layout.get('icon-allow-overlap'), true); for (var s = 0; s < bucket.symbolInstances.length; s++) { var symbolInstance = bucket.symbolInstances[s]; var isDuplicate = seenCrossTileIDs[symbolInstance.crossTileID]; var opacityState = this$1.opacities[symbolInstance.crossTileID]; if (!opacityState) { opacityState = defaultOpacityState; // store the state so that future placements use it as a starting point this$1.opacities[symbolInstance.crossTileID] = opacityState; } else if (isDuplicate) { opacityState = defaultOpacityState; } seenCrossTileIDs[symbolInstance.crossTileID] = true; var hasText = symbolInstance.numGlyphVertices > 0 || symbolInstance.numVerticalGlyphVertices > 0; var hasIcon = symbolInstance.numIconVertices > 0; if (hasText) { var packedOpacity = packOpacity(opacityState.text); // Vertical text fades in/out on collision the same way as corresponding // horizontal text. Switch between vertical/horizontal should be instantaneous var opacityEntryCount = (symbolInstance.numGlyphVertices + symbolInstance.numVerticalGlyphVertices) / 4; for (var i = 0; i < opacityEntryCount; i++) { bucket.text.opacityVertexArray.emplaceBack(packedOpacity); } for (var i$2 = 0, list = symbolInstance.placedTextSymbolIndices; i$2 < list.length; i$2 += 1) { var placedTextSymbolIndex = list[i$2]; var placedSymbol = bucket.text.placedSymbolArray.get(placedTextSymbolIndex); // If this label is completely faded, mark it so that we don't have to calculate // its position at render time placedSymbol.hidden = (opacityState.text.isHidden() ); } } if (hasIcon) { var packedOpacity$1 = packOpacity(opacityState.icon); for (var i$1 = 0; i$1 < symbolInstance.numIconVertices / 4; i$1++) { bucket.icon.opacityVertexArray.emplaceBack(packedOpacity$1); } var placedSymbol$1 = bucket.icon.placedSymbolArray.get(s); placedSymbol$1.hidden = (opacityState.icon.isHidden() ); } if (!symbolInstance.collisionArrays) { symbolInstance.collisionArrays = bucket.deserializeCollisionBoxes( ((collisionBoxArray ) ), symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex); } var collisionArrays = symbolInstance.collisionArrays; if (collisionArrays) { if (collisionArrays.textBox && bucket.hasCollisionBoxData()) { updateCollisionVertices(bucket.collisionBox.collisionVertexArray, opacityState.text.placed, false); } if (collisionArrays.iconBox && bucket.hasCollisionBoxData()) { updateCollisionVertices(bucket.collisionBox.collisionVertexArray, opacityState.icon.placed, false); } var textCircles = collisionArrays.textCircles; if (textCircles && bucket.hasCollisionCircleData()) { for (var k = 0; k < textCircles.length; k += 5) { var notUsed = isDuplicate || textCircles[k + 4] === 0; updateCollisionVertices(bucket.collisionCircle.collisionVertexArray, opacityState.text.placed, notUsed); } } } } bucket.sortFeatures(this.transform.angle); if (bucket.hasTextData() && bucket.text.opacityVertexBuffer) { bucket.text.opacityVertexBuffer.updateData(bucket.text.opacityVertexArray); } if (bucket.hasIconData() && bucket.icon.opacityVertexBuffer) { bucket.icon.opacityVertexBuffer.updateData(bucket.icon.opacityVertexArray); } if (bucket.hasCollisionBoxData() && bucket.collisionBox.collisionVertexBuffer) { bucket.collisionBox.collisionVertexBuffer.updateData(bucket.collisionBox.collisionVertexArray); } if (bucket.hasCollisionCircleData() && bucket.collisionCircle.collisionVertexBuffer) { bucket.collisionCircle.collisionVertexBuffer.updateData(bucket.collisionCircle.collisionVertexArray); } assert(bucket.text.opacityVertexArray.length === bucket.text.layoutVertexArray.length / 4); assert(bucket.icon.opacityVertexArray.length === bucket.icon.layoutVertexArray.length / 4); }; Placement.prototype.symbolFadeChange = function symbolFadeChange (now ) { return this.fadeDuration === 0 ? 1 : (now - this.commitTime) / this.fadeDuration; }; Placement.prototype.hasTransitions = function hasTransitions (now ) { return this.stale || now - this.lastPlacementChangeTime < this.fadeDuration; }; Placement.prototype.stillRecent = function stillRecent (now ) { return this.commitTime !== 'undefined' && this.commitTime + this.fadeDuration > now; }; Placement.prototype.setStale = function setStale () { this.stale = true; }; function updateCollisionVertices(collisionVertexArray , placed , notUsed ) { collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0); collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0); collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0); collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0); } // All four vertices for a glyph will have the same opacity state // So we pack the opacity into a uint8, and then repeat it four times // to make a single uint32 that we can upload for each glyph in the // label. var shift25 = Math.pow(2, 25); var shift24 = Math.pow(2, 24); var shift17 = Math.pow(2, 17); var shift16 = Math.pow(2, 16); var shift9 = Math.pow(2, 9); var shift8 = Math.pow(2, 8); var shift1 = Math.pow(2, 1); function packOpacity(opacityState ) { if (opacityState.opacity === 0 && !opacityState.placed) { return 0; } else if (opacityState.opacity === 1 && opacityState.placed) { return 4294967295; } var targetBit = opacityState.placed ? 1 : 0; var opacityBits = Math.floor(opacityState.opacity * 127); return opacityBits * shift25 + targetBit * shift24 + opacityBits * shift17 + targetBit * shift16 + opacityBits * shift9 + targetBit * shift8 + opacityBits * shift1 + targetBit; } module.exports = Placement; },{"../data/extent":58,"../source/pixels_to_tile_units":109,"../style/style_layer/symbol_style_layer_properties":214,"./collision_index":222,"./projection":229,"./symbol_size":233,"assert":13}],229:[function(require,module,exports){ 'use strict';// var Point = require('@mapbox/point-geometry'); var ref = require('@mapbox/gl-matrix'); var mat4 = ref.mat4; var vec4 = ref.vec4; var symbolSize = require('./symbol_size'); var ref$1 = require('../data/bucket/symbol_bucket'); var addDynamicAttributes = ref$1.addDynamicAttributes; var symbolLayoutProperties = require('../style/style_layer/symbol_style_layer_properties').layout; var WritingMode = require('../symbol/shaping').WritingMode; module.exports = { updateLineLabels: updateLineLabels, getLabelPlaneMatrix: getLabelPlaneMatrix, getGlCoordMatrix: getGlCoordMatrix, project: project, placeFirstAndLastGlyph: placeFirstAndLastGlyph, xyTransformMat4: xyTransformMat4 }; /* * # Overview of coordinate spaces * * ## Tile coordinate spaces * Each label has an anchor. Some labels have corresponding line geometries. * The points for both anchors and lines are stored in tile units. Each tile has it's own * coordinate space going from (0, 0) at the top left to (EXTENT, EXTENT) at the bottom right. * * ## GL coordinate space * At the end of everything, the vertex shader needs to produce a position in GL coordinate space, * which is (-1, 1) at the top left and (1, -1) in the bottom right. * * ## Map pixel coordinate spaces * Each tile has a pixel coordinate space. It's just the tile units scaled so that one unit is * whatever counts as 1 pixel at the current zoom. * This space is used for pitch-alignment=map, rotation-alignment=map * * ## Rotated map pixel coordinate spaces * Like the above, but rotated so axis of the space are aligned with the viewport instead of the tile. * This space is used for pitch-alignment=map, rotation-alignment=viewport * * ## Viewport pixel coordinate space * (0, 0) is at the top left of the canvas and (pixelWidth, pixelHeight) is at the bottom right corner * of the canvas. This space is used for pitch-alignment=viewport * * * # Vertex projection * It goes roughly like this: * 1. project the anchor and line from tile units into the correct label coordinate space * - map pixel space pitch-alignment=map rotation-alignment=map * - rotated map pixel space pitch-alignment=map rotation-alignment=viewport * - viewport pixel space pitch-alignment=viewport rotation-alignment=* * 2. if the label follows a line, find the point along the line that is the correct distance from the anchor. * 3. add the glyph's corner offset to the point from step 3 * 4. convert from the label coordinate space to gl coordinates * * For horizontal labels we want to do step 1 in the shader for performance reasons (no cpu work). * This is what `u_label_plane_matrix` is used for. * For labels aligned with lines we have to steps 1 and 2 on the cpu since we need access to the line geometry. * This is what `updateLineLabels(...)` does. * Since the conversion is handled on the cpu we just set `u_label_plane_matrix` to an identity matrix. * * Steps 3 and 4 are done in the shaders for all labels. */ /* * Returns a matrix for converting from tile units to the correct label coordinate space. */ function getLabelPlaneMatrix(posMatrix , pitchWithMap , rotateWithMap , transform , pixelsToTileUnits ) { var m = mat4.identity(new Float32Array(16)); if (pitchWithMap) { mat4.identity(m); mat4.scale(m, m, [1 / pixelsToTileUnits, 1 / pixelsToTileUnits, 1]); if (!rotateWithMap) { mat4.rotateZ(m, m, transform.angle); } } else { mat4.scale(m, m, [transform.width / 2, -transform.height / 2, 1]); mat4.translate(m, m, [1, -1, 0]); mat4.multiply(m, m, posMatrix); } return m; } /* * Returns a matrix for converting from the correct label coordinate space to gl coords. */ function getGlCoordMatrix(posMatrix , pitchWithMap , rotateWithMap , transform , pixelsToTileUnits ) { var m = mat4.identity(new Float32Array(16)); if (pitchWithMap) { mat4.multiply(m, m, posMatrix); mat4.scale(m, m, [pixelsToTileUnits, pixelsToTileUnits, 1]); if (!rotateWithMap) { mat4.rotateZ(m, m, -transform.angle); } } else { mat4.scale(m, m, [1, -1, 1]); mat4.translate(m, m, [-1, -1, 0]); mat4.scale(m, m, [2 / transform.width, 2 / transform.height, 1]); } return m; } function project(point , matrix ) { var pos = [point.x, point.y, 0, 1]; xyTransformMat4(pos, pos, matrix); var w = pos[3]; return { point: new Point(pos[0] / w, pos[1] / w), signedDistanceFromCamera: w }; } function isVisible(anchorPos , clippingBuffer ) { var x = anchorPos[0] / anchorPos[3]; var y = anchorPos[1] / anchorPos[3]; var inPaddedViewport = ( x >= -clippingBuffer[0] && x <= clippingBuffer[0] && y >= -clippingBuffer[1] && y <= clippingBuffer[1]); return inPaddedViewport; } /* * Update the `dynamicLayoutVertexBuffer` for the buffer with the correct glyph positions for the current map view. * This is only run on labels that are aligned with lines. Horizontal labels are handled entirely in the shader. */ function updateLineLabels(bucket , posMatrix , painter , isText , labelPlaneMatrix , glCoordMatrix , pitchWithMap , keepUpright ) { var sizeData = isText ? bucket.textSizeData : bucket.iconSizeData; var partiallyEvaluatedSize = symbolSize.evaluateSizeForZoom(sizeData, painter.transform.zoom, symbolLayoutProperties.properties[isText ? 'text-size' : 'icon-size']); var clippingBuffer = [256 / painter.width * 2 + 1, 256 / painter.height * 2 + 1]; var dynamicLayoutVertexArray = isText ? bucket.text.dynamicLayoutVertexArray : bucket.icon.dynamicLayoutVertexArray; dynamicLayoutVertexArray.clear(); var lineVertexArray = bucket.lineVertexArray; var placedSymbols = isText ? bucket.text.placedSymbolArray : bucket.icon.placedSymbolArray; var aspectRatio = painter.transform.width / painter.transform.height; var useVertical = false; for (var s = 0; s < placedSymbols.length; s++) { var symbol = placedSymbols.get(s); // Don't do calculations for vertical glyphs unless the previous symbol was horizontal // and we determined that vertical glyphs were necessary. // Also don't do calculations for symbols that are collided and fully faded out if (symbol.hidden || symbol.writingMode === WritingMode.vertical && !useVertical) { hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); continue; } // Awkward... but we're counting on the paired "vertical" symbol coming immediately after its horizontal counterpart useVertical = false; var anchorPos = [symbol.anchorX, symbol.anchorY, 0, 1]; vec4.transformMat4(anchorPos, anchorPos, posMatrix); // Don't bother calculating the correct point for invisible labels. if (!isVisible(anchorPos, clippingBuffer)) { hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); continue; } var cameraToAnchorDistance = anchorPos[3]; var perspectiveRatio = 0.5 + 0.5 * (cameraToAnchorDistance / painter.transform.cameraToCenterDistance); var fontSize = symbolSize.evaluateSizeForFeature(sizeData, partiallyEvaluatedSize, symbol); var pitchScaledFontSize = pitchWithMap ? fontSize * perspectiveRatio : fontSize / perspectiveRatio; var tileAnchorPoint = new Point(symbol.anchorX, symbol.anchorY); var anchorPoint = project(tileAnchorPoint, labelPlaneMatrix).point; var projectionCache = {}; var placeUnflipped = placeGlyphsAlongLine(symbol, pitchScaledFontSize, false /*unflipped*/, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio); useVertical = placeUnflipped.useVertical; if (placeUnflipped.notEnoughRoom || useVertical || (placeUnflipped.needsFlipping && placeGlyphsAlongLine(symbol, pitchScaledFontSize, true /*flipped*/, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio).notEnoughRoom)) { hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); } } if (isText) { bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray); } else { bucket.icon.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray); } } function placeFirstAndLastGlyph(fontScale , glyphOffsetArray , lineOffsetX , lineOffsetY , flip , anchorPoint , tileAnchorPoint , symbol , lineVertexArray , labelPlaneMatrix , projectionCache , returnTileDistance ) { var glyphEndIndex = symbol.glyphStartIndex + symbol.numGlyphs; var lineStartIndex = symbol.lineStartIndex; var lineEndIndex = symbol.lineStartIndex + symbol.lineLength; var firstGlyphOffset = glyphOffsetArray.getoffsetX(symbol.glyphStartIndex); var lastGlyphOffset = glyphOffsetArray.getoffsetX(glyphEndIndex - 1); var firstPlacedGlyph = placeGlyphAlongLine(fontScale * firstGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, returnTileDistance); if (!firstPlacedGlyph) { return null; } var lastPlacedGlyph = placeGlyphAlongLine(fontScale * lastGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, returnTileDistance); if (!lastPlacedGlyph) { return null; } return { first: firstPlacedGlyph, last: lastPlacedGlyph }; } function requiresOrientationChange(writingMode, firstPoint, lastPoint, aspectRatio) { if (writingMode === WritingMode.horizontal) { // On top of choosing whether to flip, choose whether to render this version of the glyphs or the alternate // vertical glyphs. We can't just filter out vertical glyphs in the horizontal range because the horizontal // and vertical versions can have slightly different projections which could lead to angles where both or // neither showed. var rise = Math.abs(lastPoint.y - firstPoint.y); var run = Math.abs(lastPoint.x - firstPoint.x) * aspectRatio; if (rise > run) { return { useVertical: true }; } } if (writingMode === WritingMode.vertical ? firstPoint.y < lastPoint.y : firstPoint.x > lastPoint.x) { // Includes "horizontalOnly" case for labels without vertical glyphs return { needsFlipping: true }; } return null; } function placeGlyphsAlongLine(symbol, fontSize, flip, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio) { var fontScale = fontSize / 24; var lineOffsetX = symbol.lineOffsetX * fontSize; var lineOffsetY = symbol.lineOffsetY * fontSize; var placedGlyphs; if (symbol.numGlyphs > 1) { var glyphEndIndex = symbol.glyphStartIndex + symbol.numGlyphs; var lineStartIndex = symbol.lineStartIndex; var lineEndIndex = symbol.lineStartIndex + symbol.lineLength; // Place the first and the last glyph in the label first, so we can figure out // the overall orientation of the label and determine whether it needs to be flipped in keepUpright mode var firstAndLastGlyph = placeFirstAndLastGlyph(fontScale, glyphOffsetArray, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache, false); if (!firstAndLastGlyph) { return { notEnoughRoom: true }; } var firstPoint = project(firstAndLastGlyph.first.point, glCoordMatrix).point; var lastPoint = project(firstAndLastGlyph.last.point, glCoordMatrix).point; if (keepUpright && !flip) { var orientationChange = requiresOrientationChange(symbol.writingMode, firstPoint, lastPoint, aspectRatio); if (orientationChange) { return orientationChange; } } placedGlyphs = [firstAndLastGlyph.first]; for (var glyphIndex = symbol.glyphStartIndex + 1; glyphIndex < glyphEndIndex - 1; glyphIndex++) { // Since first and last glyph fit on the line, we're sure that the rest of the glyphs can be placed // $FlowFixMe placedGlyphs.push(placeGlyphAlongLine(fontScale * glyphOffsetArray.getoffsetX(glyphIndex), lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, false)); } placedGlyphs.push(firstAndLastGlyph.last); } else { // Only a single glyph to place // So, determine whether to flip based on projected angle of the line segment it's on if (keepUpright && !flip) { var a = project(tileAnchorPoint, posMatrix).point; var tileVertexIndex = (symbol.lineStartIndex + symbol.segment + 1); // $FlowFixMe var tileSegmentEnd = new Point(lineVertexArray.getx(tileVertexIndex), lineVertexArray.gety(tileVertexIndex)); var projectedVertex = project(tileSegmentEnd, posMatrix); // We know the anchor will be in the viewport, but the end of the line segment may be // behind the plane of the camera, in which case we can use a point at any arbitrary (closer) // point on the segment. var b = (projectedVertex.signedDistanceFromCamera > 0) ? projectedVertex.point : projectTruncatedLineSegment(tileAnchorPoint, tileSegmentEnd, a, 1, posMatrix); var orientationChange$1 = requiresOrientationChange(symbol.writingMode, a, b, aspectRatio); if (orientationChange$1) { return orientationChange$1; } } // $FlowFixMe var singleGlyph = placeGlyphAlongLine(fontScale * glyphOffsetArray.getoffsetX(symbol.glyphStartIndex), lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, symbol.lineStartIndex, symbol.lineStartIndex + symbol.lineLength, lineVertexArray, labelPlaneMatrix, projectionCache, false); if (!singleGlyph) { return { notEnoughRoom: true }; } placedGlyphs = [singleGlyph]; } for (var i = 0, list = placedGlyphs; i < list.length; i += 1) { var glyph = list[i]; addDynamicAttributes(dynamicLayoutVertexArray, glyph.point, glyph.angle); } return {}; } function projectTruncatedLineSegment(previousTilePoint , currentTilePoint , previousProjectedPoint , minimumLength , projectionMatrix ) { // We are assuming "previousTilePoint" won't project to a point within one unit of the camera plane // If it did, that would mean our label extended all the way out from within the viewport to a (very distant) // point near the plane of the camera. We wouldn't be able to render the label anyway once it crossed the // plane of the camera. var projectedUnitVertex = project(previousTilePoint.add(previousTilePoint.sub(currentTilePoint)._unit()), projectionMatrix).point; var projectedUnitSegment = previousProjectedPoint.sub(projectedUnitVertex); return previousProjectedPoint.add(projectedUnitSegment._mult(minimumLength / projectedUnitSegment.mag())); } function placeGlyphAlongLine(offsetX , lineOffsetX , lineOffsetY , flip , anchorPoint , tileAnchorPoint , anchorSegment , lineStartIndex , lineEndIndex , lineVertexArray , labelPlaneMatrix , projectionCache , returnTileDistance ) { var combinedOffsetX = flip ? offsetX - lineOffsetX : offsetX + lineOffsetX; var dir = combinedOffsetX > 0 ? 1 : -1; var angle = 0; if (flip) { // The label needs to be flipped to keep text upright. // Iterate in the reverse direction. dir *= -1; angle = Math.PI; } if (dir < 0) { angle += Math.PI; } var currentIndex = dir > 0 ? lineStartIndex + anchorSegment : lineStartIndex + anchorSegment + 1; var initialIndex = currentIndex; var current = anchorPoint; var prev = anchorPoint; var distanceToPrev = 0; var currentSegmentDistance = 0; var absOffsetX = Math.abs(combinedOffsetX); while (distanceToPrev + currentSegmentDistance <= absOffsetX) { currentIndex += dir; // offset does not fit on the projected line if (currentIndex < lineStartIndex || currentIndex >= lineEndIndex) { return null; } prev = current; current = projectionCache[currentIndex]; if (current === undefined) { var currentVertex = new Point(lineVertexArray.getx(currentIndex), lineVertexArray.gety(currentIndex)); var projection = project(currentVertex, labelPlaneMatrix); if (projection.signedDistanceFromCamera > 0) { current = projectionCache[currentIndex] = projection.point; } else { // The vertex is behind the plane of the camera, so we can't project it // Instead, we'll create a vertex along the line that's far enough to include the glyph var previousLineVertexIndex = currentIndex - dir; var previousTilePoint = distanceToPrev === 0 ? tileAnchorPoint : new Point(lineVertexArray.getx(previousLineVertexIndex), lineVertexArray.gety(previousLineVertexIndex)); // Don't cache because the new vertex might not be far enough out for future glyphs on the same segment current = projectTruncatedLineSegment(previousTilePoint, currentVertex, prev, absOffsetX - distanceToPrev + 1, labelPlaneMatrix); } } distanceToPrev += currentSegmentDistance; currentSegmentDistance = prev.dist(current); } // The point is on the current segment. Interpolate to find it. var segmentInterpolationT = (absOffsetX - distanceToPrev) / currentSegmentDistance; var prevToCurrent = current.sub(prev); var p = prevToCurrent.mult(segmentInterpolationT)._add(prev); // offset the point from the line to text-offset and icon-offset p._add(prevToCurrent._unit()._perp()._mult(lineOffsetY * dir)); var segmentAngle = angle + Math.atan2(current.y - prev.y, current.x - prev.x); return { point: p, angle: segmentAngle, tileDistance: returnTileDistance ? { prevTileDistance: (currentIndex - dir) === initialIndex ? 0 : lineVertexArray.gettileUnitDistanceFromAnchor(currentIndex - dir), lastSegmentViewportDistance: absOffsetX - distanceToPrev } : null }; } var hiddenGlyphAttributes = new Float32Array([-Infinity, -Infinity, 0, -Infinity, -Infinity, 0, -Infinity, -Infinity, 0, -Infinity, -Infinity, 0]); // Hide them by moving them offscreen. We still need to add them to the buffer // because the dynamic buffer is paired with a static buffer that doesn't get updated. function hideGlyphs(num , dynamicLayoutVertexArray ) { for (var i = 0; i < num; i++) { var offset = dynamicLayoutVertexArray.length; dynamicLayoutVertexArray.resize(offset + 4); // Since all hidden glyphs have the same attributes, we can build up the array faster with a single call to Float32Array.set // for each set of four vertices, instead of calling addDynamicAttributes for each vertex. dynamicLayoutVertexArray.float32.set(hiddenGlyphAttributes, offset * 3); } } // For line label layout, we're not using z output and our w input is always 1 // This custom matrix transformation ignores those components to make projection faster function xyTransformMat4(out , a , m ) { var x = a[0], y = a[1]; out[0] = m[0] * x + m[4] * y + m[12]; out[1] = m[1] * x + m[5] * y + m[13]; out[3] = m[3] * x + m[7] * y + m[15]; return out; } },{"../data/bucket/symbol_bucket":56,"../style/style_layer/symbol_style_layer_properties":214,"../symbol/shaping":231,"./symbol_size":233,"@mapbox/gl-matrix":2,"@mapbox/point-geometry":4}],230:[function(require,module,exports){ 'use strict';// var Point = require('@mapbox/point-geometry'); var ref = require('../style/parse_glyph_pbf'); var GLYPH_PBF_BORDER = ref.GLYPH_PBF_BORDER; module.exports = { getIconQuads: getIconQuads, getGlyphQuads: getGlyphQuads }; /** * A textured quad for rendering a single icon or glyph. * * The zoom range the glyph can be shown is defined by minScale and maxScale. * * @param tl The offset of the top left corner from the anchor. * @param tr The offset of the top right corner from the anchor. * @param bl The offset of the bottom left corner from the anchor. * @param br The offset of the bottom right corner from the anchor. * @param tex The texture coordinates. * * @private */ /** * Create the quads used for rendering an icon. * @private */ function getIconQuads(anchor , shapedIcon , layer , alongLine , shapedText , globalProperties , feature ) { var image = shapedIcon.image; var layout = layer.layout; // If you have a 10px icon that isn't perfectly aligned to the pixel grid it will cover 11 actual // pixels. The quad needs to be padded to account for this, otherwise they'll look slightly clipped // on one edge in some cases. var border = 1; var top = shapedIcon.top - border / image.pixelRatio; var left = shapedIcon.left - border / image.pixelRatio; var bottom = shapedIcon.bottom + border / image.pixelRatio; var right = shapedIcon.right + border / image.pixelRatio; var tl, tr, br, bl; // text-fit mode if (layout.get('icon-text-fit') !== 'none' && shapedText) { var iconWidth = (right - left), iconHeight = (bottom - top), size = layout.get('text-size').evaluate(feature) / 24, textLeft = shapedText.left * size, textRight = shapedText.right * size, textTop = shapedText.top * size, textBottom = shapedText.bottom * size, textWidth = textRight - textLeft, textHeight = textBottom - textTop, padT = layout.get('icon-text-fit-padding')[0], padR = layout.get('icon-text-fit-padding')[1], padB = layout.get('icon-text-fit-padding')[2], padL = layout.get('icon-text-fit-padding')[3], offsetY = layout.get('icon-text-fit') === 'width' ? (textHeight - iconHeight) * 0.5 : 0, offsetX = layout.get('icon-text-fit') === 'height' ? (textWidth - iconWidth) * 0.5 : 0, width = layout.get('icon-text-fit') === 'width' || layout.get('icon-text-fit') === 'both' ? textWidth : iconWidth, height = layout.get('icon-text-fit') === 'height' || layout.get('icon-text-fit') === 'both' ? textHeight : iconHeight; tl = new Point(textLeft + offsetX - padL, textTop + offsetY - padT); tr = new Point(textLeft + offsetX + padR + width, textTop + offsetY - padT); br = new Point(textLeft + offsetX + padR + width, textTop + offsetY + padB + height); bl = new Point(textLeft + offsetX - padL, textTop + offsetY + padB + height); // Normal icon size mode } else { tl = new Point(left, top); tr = new Point(right, top); br = new Point(right, bottom); bl = new Point(left, bottom); } var angle = layer.layout.get('icon-rotate').evaluate(feature) * Math.PI / 180; if (angle) { var sin = Math.sin(angle), cos = Math.cos(angle), matrix = [cos, -sin, sin, cos]; tl._matMult(matrix); tr._matMult(matrix); bl._matMult(matrix); br._matMult(matrix); } // Icon quad is padded, so texture coordinates also need to be padded. var textureRect = { x: image.textureRect.x - border, y: image.textureRect.y - border, w: image.textureRect.w + border * 2, h: image.textureRect.h + border * 2 }; return [{tl: tl, tr: tr, bl: bl, br: br, tex: textureRect, writingMode: undefined, glyphOffset: [0, 0]}]; } /** * Create the quads used for rendering a text label. * @private */ function getGlyphQuads(anchor , shaping , layer , alongLine , globalProperties , feature , positions ) { var oneEm = 24; var textRotate = layer.layout.get('text-rotate').evaluate(feature) * Math.PI / 180; var textOffset = layer.layout.get('text-offset').evaluate(feature).map(function (t){ return t * oneEm; }); var positionedGlyphs = shaping.positionedGlyphs; var quads = []; for (var k = 0; k < positionedGlyphs.length; k++) { var positionedGlyph = positionedGlyphs[k]; var glyph = positions[positionedGlyph.glyph]; if (!glyph) { continue; } var rect = glyph.rect; if (!rect) { continue; } // The rects have an addditional buffer that is not included in their size. var glyphPadding = 1.0; var rectBuffer = GLYPH_PBF_BORDER + glyphPadding; var halfAdvance = glyph.metrics.advance / 2; var glyphOffset = alongLine ? [positionedGlyph.x + halfAdvance, positionedGlyph.y] : [0, 0]; var builtInOffset = alongLine ? [0, 0] : [positionedGlyph.x + halfAdvance + textOffset[0], positionedGlyph.y + textOffset[1]]; var x1 = glyph.metrics.left - rectBuffer - halfAdvance + builtInOffset[0]; var y1 = -glyph.metrics.top - rectBuffer + builtInOffset[1]; var x2 = x1 + rect.w; var y2 = y1 + rect.h; var tl = new Point(x1, y1); var tr = new Point(x2, y1); var bl = new Point(x1, y2); var br = new Point(x2, y2); if (alongLine && positionedGlyph.vertical) { // Vertical-supporting glyphs are laid out in 24x24 point boxes (1 square em) // In horizontal orientation, the y values for glyphs are below the midline // and we use a "yOffset" of -17 to pull them up to the middle. // By rotating counter-clockwise around the point at the center of the left // edge of a 24x24 layout box centered below the midline, we align the center // of the glyphs with the horizontal midline, so the yOffset is no longer // necessary, but we also pull the glyph to the left along the x axis var center = new Point(-halfAdvance, halfAdvance); var verticalRotation = -Math.PI / 2; var xOffsetCorrection = new Point(5, 0); tl._rotateAround(verticalRotation, center)._add(xOffsetCorrection); tr._rotateAround(verticalRotation, center)._add(xOffsetCorrection); bl._rotateAround(verticalRotation, center)._add(xOffsetCorrection); br._rotateAround(verticalRotation, center)._add(xOffsetCorrection); } if (textRotate) { var sin = Math.sin(textRotate), cos = Math.cos(textRotate), matrix = [cos, -sin, sin, cos]; tl._matMult(matrix); tr._matMult(matrix); bl._matMult(matrix); br._matMult(matrix); } quads.push({tl: tl, tr: tr, bl: bl, br: br, tex: rect, writingMode: shaping.writingMode, glyphOffset: glyphOffset}); } return quads; } },{"../style/parse_glyph_pbf":191,"@mapbox/point-geometry":4}],231:[function(require,module,exports){ 'use strict';// var scriptDetection = require('../util/script_detection'); var verticalizePunctuation = require('../util/verticalize_punctuation'); var rtlTextPlugin = require('../source/rtl_text_plugin'); var WritingMode = { horizontal: 1, vertical: 2, horizontalOnly: 3 }; module.exports = { shapeText: shapeText, shapeIcon: shapeIcon, WritingMode: WritingMode }; // The position of a glyph relative to the text's anchor point. // A collection of positioned glyphs and some metadata function breakLines(text , lineBreakPoints ) { var lines = []; var start = 0; for (var i = 0, list = lineBreakPoints; i < list.length; i += 1) { var lineBreak = list[i]; lines.push(text.substring(start, lineBreak)); start = lineBreak; } if (start < text.length) { lines.push(text.substring(start, text.length)); } return lines; } function shapeText(text , glyphs , maxWidth , lineHeight , textAnchor , textJustify , spacing , translate , verticalHeight , writingMode ) { var logicalInput = text.trim(); if (writingMode === WritingMode.vertical) { logicalInput = verticalizePunctuation(logicalInput); } var positionedGlyphs = []; var shaping = { positionedGlyphs: positionedGlyphs, text: logicalInput, top: translate[1], bottom: translate[1], left: translate[0], right: translate[0], writingMode: writingMode }; var lines ; var processBidirectionalText = rtlTextPlugin.processBidirectionalText; if (processBidirectionalText) { lines = processBidirectionalText(logicalInput, determineLineBreaks(logicalInput, spacing, maxWidth, glyphs)); } else { lines = breakLines(logicalInput, determineLineBreaks(logicalInput, spacing, maxWidth, glyphs)); } shapeLines(shaping, glyphs, lines, lineHeight, textAnchor, textJustify, writingMode, spacing, verticalHeight); if (!positionedGlyphs.length) { return false; } return shaping; } var whitespace = {}; whitespace[0x09] = true; whitespace[0x0a] = true; whitespace[0x0b] = true; whitespace[0x0c] = true; whitespace[0x0d] = true; whitespace[0x20] = true; var breakable = {}; breakable[0x0a] = true; breakable[0x20] = true; breakable[0x26] = true; breakable[0x28] = true; breakable[0x29] = true; breakable[0x2b] = true; breakable[0x2d] = true; breakable[0x2f] = true; breakable[0xad] = true; breakable[0xb7] = true; breakable[0x200b] = true; breakable[0x2010] = true; breakable[0x2013] = true; breakable[0x2027] = true; function determineAverageLineWidth(logicalInput , spacing , maxWidth , glyphs ) { var totalWidth = 0; for (var index = 0; index < logicalInput.length; index++) { var glyph = glyphs[logicalInput.charCodeAt(index)]; if (!glyph) { continue; } totalWidth += glyph.metrics.advance + spacing; } var lineCount = Math.max(1, Math.ceil(totalWidth / maxWidth)); return totalWidth / lineCount; } function calculateBadness(lineWidth , targetWidth , penalty , isLastBreak ) { var raggedness = Math.pow(lineWidth - targetWidth, 2); if (isLastBreak) { // Favor finals lines shorter than average over longer than average if (lineWidth < targetWidth) { return raggedness / 2; } else { return raggedness * 2; } } return raggedness + Math.abs(penalty) * penalty; } function calculatePenalty(codePoint , nextCodePoint ) { var penalty = 0; // Force break on newline if (codePoint === 0x0a) { penalty -= 10000; } // Penalize open parenthesis at end of line if (codePoint === 0x28 || codePoint === 0xff08) { penalty += 50; } // Penalize close parenthesis at beginning of line if (nextCodePoint === 0x29 || nextCodePoint === 0xff09) { penalty += 50; } return penalty; } function evaluateBreak(breakIndex , breakX , targetWidth , potentialBreaks , penalty , isLastBreak ) { // We could skip evaluating breaks where the line length (breakX - priorBreak.x) > maxWidth // ...but in fact we allow lines longer than maxWidth (if there's no break points) // ...and when targetWidth and maxWidth are close, strictly enforcing maxWidth can give // more lopsided results. var bestPriorBreak = null; var bestBreakBadness = calculateBadness(breakX, targetWidth, penalty, isLastBreak); for (var i = 0, list = potentialBreaks; i < list.length; i += 1) { var potentialBreak = list[i]; var lineWidth = breakX - potentialBreak.x; var breakBadness = calculateBadness(lineWidth, targetWidth, penalty, isLastBreak) + potentialBreak.badness; if (breakBadness <= bestBreakBadness) { bestPriorBreak = potentialBreak; bestBreakBadness = breakBadness; } } return { index: breakIndex, x: breakX, priorBreak: bestPriorBreak, badness: bestBreakBadness }; } function leastBadBreaks(lastLineBreak ) { if (!lastLineBreak) { return []; } return leastBadBreaks(lastLineBreak.priorBreak).concat(lastLineBreak.index); } function determineLineBreaks(logicalInput , spacing , maxWidth , glyphs ) { if (!maxWidth) { return []; } if (!logicalInput) { return []; } var potentialLineBreaks = []; var targetWidth = determineAverageLineWidth(logicalInput, spacing, maxWidth, glyphs); var currentX = 0; for (var i = 0; i < logicalInput.length; i++) { var codePoint = logicalInput.charCodeAt(i); var glyph = glyphs[codePoint]; if (glyph && !whitespace[codePoint]) { currentX += glyph.metrics.advance + spacing; } // Ideographic characters, spaces, and word-breaking punctuation that often appear without // surrounding spaces. if ((i < logicalInput.length - 1) && (breakable[codePoint] || scriptDetection.charAllowsIdeographicBreaking(codePoint))) { potentialLineBreaks.push( evaluateBreak( i + 1, currentX, targetWidth, potentialLineBreaks, calculatePenalty(codePoint, logicalInput.charCodeAt(i + 1)), false)); } } return leastBadBreaks( evaluateBreak( logicalInput.length, currentX, targetWidth, potentialLineBreaks, 0, true)); } function getAnchorAlignment(anchor ) { var horizontalAlign = 0.5, verticalAlign = 0.5; switch (anchor) { case 'right': case 'top-right': case 'bottom-right': horizontalAlign = 1; break; case 'left': case 'top-left': case 'bottom-left': horizontalAlign = 0; break; } switch (anchor) { case 'bottom': case 'bottom-right': case 'bottom-left': verticalAlign = 1; break; case 'top': case 'top-right': case 'top-left': verticalAlign = 0; break; } return { horizontalAlign: horizontalAlign, verticalAlign: verticalAlign }; } function shapeLines(shaping , glyphs , lines , lineHeight , textAnchor , textJustify , writingMode , spacing , verticalHeight ) { // the y offset *should* be part of the font metadata var yOffset = -17; var x = 0; var y = yOffset; var maxLineLength = 0; var positionedGlyphs = shaping.positionedGlyphs; var justify = textJustify === 'right' ? 1 : textJustify === 'left' ? 0 : 0.5; for (var i$1 = 0, list = lines; i$1 < list.length; i$1 += 1) { var line = list[i$1]; line = line.trim(); if (!line.length) { y += lineHeight; // Still need a line feed after empty line continue; } var lineStartIndex = positionedGlyphs.length; for (var i = 0; i < line.length; i++) { var codePoint = line.charCodeAt(i); var glyph = glyphs[codePoint]; if (!glyph) { continue; } if (!scriptDetection.charHasUprightVerticalOrientation(codePoint) || writingMode === WritingMode.horizontal) { positionedGlyphs.push({glyph: codePoint, x: x, y: y, vertical: false}); x += glyph.metrics.advance + spacing; } else { positionedGlyphs.push({glyph: codePoint, x: x, y: 0, vertical: true}); x += verticalHeight + spacing; } } // Only justify if we placed at least one glyph if (positionedGlyphs.length !== lineStartIndex) { var lineLength = x - spacing; maxLineLength = Math.max(lineLength, maxLineLength); justifyLine(positionedGlyphs, glyphs, lineStartIndex, positionedGlyphs.length - 1, justify); } x = 0; y += lineHeight; } var ref = getAnchorAlignment(textAnchor); var horizontalAlign = ref.horizontalAlign; var verticalAlign = ref.verticalAlign; align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, lines.length); // Calculate the bounding box var height = lines.length * lineHeight; shaping.top += -verticalAlign * height; shaping.bottom = shaping.top + height; shaping.left += -horizontalAlign * maxLineLength; shaping.right = shaping.left + maxLineLength; } // justify right = 1, left = 0, center = 0.5 function justifyLine(positionedGlyphs , glyphs , start , end , justify ) { if (!justify) { return; } var glyph = glyphs[positionedGlyphs[end].glyph]; if (glyph) { var lastAdvance = glyph.metrics.advance; var lineIndent = (positionedGlyphs[end].x + lastAdvance) * justify; for (var j = start; j <= end; j++) { positionedGlyphs[j].x -= lineIndent; } } } function align(positionedGlyphs , justify , horizontalAlign , verticalAlign , maxLineLength , lineHeight , lineCount ) { var shiftX = (justify - horizontalAlign) * maxLineLength; var shiftY = (-verticalAlign * lineCount + 0.5) * lineHeight; for (var j = 0; j < positionedGlyphs.length; j++) { positionedGlyphs[j].x += shiftX; positionedGlyphs[j].y += shiftY; } } function shapeIcon(image , iconOffset , iconAnchor ) { var ref = getAnchorAlignment(iconAnchor); var horizontalAlign = ref.horizontalAlign; var verticalAlign = ref.verticalAlign; var dx = iconOffset[0]; var dy = iconOffset[1]; var x1 = dx - image.displaySize[0] * horizontalAlign; var x2 = x1 + image.displaySize[0]; var y1 = dy - image.displaySize[1] * verticalAlign; var y2 = y1 + image.displaySize[1]; return {image: image, top: y1, bottom: y2, left: x1, right: x2}; } },{"../source/rtl_text_plugin":114,"../util/script_detection":274,"../util/verticalize_punctuation":282}],232:[function(require,module,exports){ 'use strict';// var Anchor = require('./anchor'); var getAnchors = require('./get_anchors'); var clipLine = require('./clip_line'); var OpacityState = require('./opacity_state'); var ref = require('./shaping'); var shapeText = ref.shapeText; var shapeIcon = ref.shapeIcon; var WritingMode = ref.WritingMode; var ref$1 = require('./quads'); var getGlyphQuads = ref$1.getGlyphQuads; var getIconQuads = ref$1.getIconQuads; var CollisionFeature = require('./collision_feature'); var util = require('../util/util'); var scriptDetection = require('../util/script_detection'); var findPoleOfInaccessibility = require('../util/find_pole_of_inaccessibility'); var classifyRings = require('../util/classify_rings'); var EXTENT = require('../data/extent'); var SymbolBucket = require('../data/bucket/symbol_bucket'); var EvaluationParameters = require('../style/evaluation_parameters'); var Point = require('@mapbox/point-geometry'); module.exports = { performSymbolLayout: performSymbolLayout }; // The symbol layout process needs `text-size` evaluated at up to five different zoom levels, and // `icon-size` at up to three: // // 1. `text-size` at the zoom level of the bucket. Used to calculate a per-feature size for source `text-size` // expressions, and to calculate the box dimensions for icon-text-fit. // 2. `icon-size` at the zoom level of the bucket. Used to calculate a per-feature size for source `icon-size` // expressions. // 3. `text-size` and `icon-size` at the zoom level of the bucket, plus one. Used to calculate collision boxes. // 4. `text-size` at zoom level 18. Used for something line-symbol-placement-related. // 5. For composite `*-size` expressions: two zoom levels of curve stops that "cover" the zoom level of the // bucket. These go into a vertex buffer and are used by the shader to interpolate the size at render time. // // (1) and (2) are stored in `bucket.layers[0].layout`. The remainder are below. // function performSymbolLayout(bucket , glyphMap , glyphPositions , imageMap , imagePositions , showCollisionBoxes ) { bucket.createArrays(); bucket.symbolInstances = []; var tileSize = 512 * bucket.overscaling; bucket.tilePixelRatio = EXTENT / tileSize; bucket.compareText = {}; bucket.iconsNeedLinear = false; var layout = bucket.layers[0].layout; var unevaluatedLayoutValues = bucket.layers[0]._unevaluatedLayout._values; var sizes = {}; if (bucket.textSizeData.functionType === 'composite') { var ref = bucket.textSizeData.zoomRange; var min = ref.min; var max = ref.max; sizes.compositeTextSizes = [ unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(min)), unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(max)) ]; } if (bucket.iconSizeData.functionType === 'composite') { var ref$1 = bucket.iconSizeData.zoomRange; var min$1 = ref$1.min; var max$1 = ref$1.max; sizes.compositeIconSizes = [ unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(min$1)), unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(max$1)) ]; } sizes.layoutTextSize = unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(bucket.zoom + 1)); sizes.layoutIconSize = unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(bucket.zoom + 1)); sizes.textMaxSize = unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(18)); var oneEm = 24; var lineHeight = layout.get('text-line-height') * oneEm; var textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') === 'line'; var keepUpright = layout.get('text-keep-upright'); for (var i = 0, list = bucket.features; i < list.length; i += 1) { var feature = list[i]; var fontstack = layout.get('text-font').evaluate(feature).join(','); var glyphs = glyphMap[fontstack] || {}; var glyphPositionMap = glyphPositions[fontstack] || {}; var shapedTextOrientations = {}; var text = feature.text; if (text) { var allowsVerticalWritingMode = scriptDetection.allowsVerticalWritingMode(text); var textOffset = (layout.get('text-offset').evaluate(feature).map(function (t){ return t * oneEm; }) ); var spacing = layout.get('text-letter-spacing').evaluate(feature) * oneEm; var spacingIfAllowed = scriptDetection.allowsLetterSpacing(text) ? spacing : 0; var textAnchor = layout.get('text-anchor').evaluate(feature); var textJustify = layout.get('text-justify').evaluate(feature); var maxWidth = layout.get('symbol-placement') !== 'line' ? layout.get('text-max-width').evaluate(feature) * oneEm : 0; shapedTextOrientations.horizontal = shapeText(text, glyphs, maxWidth, lineHeight, textAnchor, textJustify, spacingIfAllowed, textOffset, oneEm, WritingMode.horizontal); if (allowsVerticalWritingMode && textAlongLine && keepUpright) { shapedTextOrientations.vertical = shapeText(text, glyphs, maxWidth, lineHeight, textAnchor, textJustify, spacingIfAllowed, textOffset, oneEm, WritingMode.vertical); } } var shapedIcon = (void 0); if (feature.icon) { var image = imageMap[feature.icon]; if (image) { shapedIcon = shapeIcon( imagePositions[feature.icon], layout.get('icon-offset').evaluate(feature), layout.get('icon-anchor').evaluate(feature)); if (bucket.sdfIcons === undefined) { bucket.sdfIcons = image.sdf; } else if (bucket.sdfIcons !== image.sdf) { util.warnOnce('Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer'); } if (image.pixelRatio !== bucket.pixelRatio) { bucket.iconsNeedLinear = true; } else if (layout.get('icon-rotate').constantOr(1) !== 0) { bucket.iconsNeedLinear = true; } } } if (shapedTextOrientations.horizontal || shapedIcon) { addFeature(bucket, feature, shapedTextOrientations, shapedIcon, glyphPositionMap, sizes); } } if (showCollisionBoxes) { bucket.generateCollisionDebugBuffers(); } } /** * Given a feature and its shaped text and icon data, add a 'symbol * instance' for each _possible_ placement of the symbol feature. * (At render timePlaceSymbols#place() selects which of these instances to * show or hide based on collisions with symbols in other layers.) * @private */ function addFeature(bucket , feature , shapedTextOrientations , shapedIcon , glyphPositionMap , sizes ) { var layoutTextSize = sizes.layoutTextSize.evaluate(feature); var layoutIconSize = sizes.layoutIconSize.evaluate(feature); // To reduce the number of labels that jump around when zooming we need // to use a text-size value that is the same for all zoom levels. // bucket calculates text-size at a high zoom level so that all tiles can // use the same value when calculating anchor positions. var textMaxSize = sizes.textMaxSize.evaluate(feature); if (textMaxSize === undefined) { textMaxSize = layoutTextSize; } var layout = bucket.layers[0].layout; var textOffset = layout.get('text-offset').evaluate(feature); var iconOffset = layout.get('icon-offset').evaluate(feature); var glyphSize = 24, fontScale = layoutTextSize / glyphSize, textBoxScale = bucket.tilePixelRatio * fontScale, textMaxBoxScale = bucket.tilePixelRatio * textMaxSize / glyphSize, iconBoxScale = bucket.tilePixelRatio * layoutIconSize, symbolMinDistance = bucket.tilePixelRatio * layout.get('symbol-spacing'), textPadding = layout.get('text-padding') * bucket.tilePixelRatio, iconPadding = layout.get('icon-padding') * bucket.tilePixelRatio, textMaxAngle = layout.get('text-max-angle') / 180 * Math.PI, textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') === 'line', iconAlongLine = layout.get('icon-rotation-alignment') === 'map' && layout.get('symbol-placement') === 'line', symbolPlacement = layout.get('symbol-placement'), textRepeatDistance = symbolMinDistance / 2; var addSymbolAtAnchor = function (line, anchor) { if (anchor.x < 0 || anchor.x >= EXTENT || anchor.y < 0 || anchor.y >= EXTENT) { // Symbol layers are drawn across tile boundaries, We filter out symbols // outside our tile boundaries (which may be included in vector tile buffers) // to prevent double-drawing symbols. return; } bucket.symbolInstances.push(addSymbol(bucket, anchor, line, shapedTextOrientations, shapedIcon, bucket.layers[0], bucket.collisionBoxArray, feature.index, feature.sourceLayerIndex, bucket.index, textBoxScale, textPadding, textAlongLine, textOffset, iconBoxScale, iconPadding, iconAlongLine, iconOffset, {zoom: bucket.zoom}, feature, glyphPositionMap, sizes)); }; if (symbolPlacement === 'line') { for (var i = 0, list = clipLine(feature.geometry, 0, 0, EXTENT, EXTENT); i < list.length; i += 1) { var line = list[i]; var anchors = getAnchors( line, symbolMinDistance, textMaxAngle, shapedTextOrientations.vertical || shapedTextOrientations.horizontal, shapedIcon, glyphSize, textMaxBoxScale, bucket.overscaling, EXTENT ); for (var i$1 = 0, list$1 = anchors; i$1 < list$1.length; i$1 += 1) { var anchor = list$1[i$1]; var shapedText = shapedTextOrientations.horizontal; if (!shapedText || !anchorIsTooClose(bucket, shapedText.text, textRepeatDistance, anchor)) { addSymbolAtAnchor(line, anchor); } } } } else if (feature.type === 'Polygon') { for (var i$2 = 0, list$2 = classifyRings(feature.geometry, 0); i$2 < list$2.length; i$2 += 1) { // 16 here represents 2 pixels var polygon = list$2[i$2]; var poi = findPoleOfInaccessibility(polygon, 16); addSymbolAtAnchor(polygon[0], new Anchor(poi.x, poi.y, 0)); } } else if (feature.type === 'LineString') { // https://github.com/mapbox/mapbox-gl-js/issues/3808 for (var i$3 = 0, list$3 = feature.geometry; i$3 < list$3.length; i$3 += 1) { var line$1 = list$3[i$3]; addSymbolAtAnchor(line$1, new Anchor(line$1[0].x, line$1[0].y, 0)); } } else if (feature.type === 'Point') { for (var i$4 = 0, list$4 = feature.geometry; i$4 < list$4.length; i$4 += 1) { var points = list$4[i$4]; for (var i$5 = 0, list$5 = points; i$5 < list$5.length; i$5 += 1) { var point = list$5[i$5]; addSymbolAtAnchor([point], new Anchor(point.x, point.y, 0)); } } } } function addTextVertices(bucket , anchor , shapedText , layer , textAlongLine , globalProperties , feature , textOffset , lineArray , writingMode , placedTextSymbolIndices , glyphPositionMap , sizes ) { var glyphQuads = getGlyphQuads(anchor, shapedText, layer, textAlongLine, globalProperties, feature, glyphPositionMap); var sizeData = bucket.textSizeData; var textSizeData = null; if (sizeData.functionType === 'source') { textSizeData = [ 10 * layer.layout.get('text-size').evaluate(feature) ]; } else if (sizeData.functionType === 'composite') { textSizeData = [ 10 * sizes.compositeTextSizes[0].evaluate(feature), 10 * sizes.compositeTextSizes[1].evaluate(feature) ]; } bucket.addSymbols( bucket.text, glyphQuads, textSizeData, textOffset, textAlongLine, feature, writingMode, anchor, lineArray.lineStartIndex, lineArray.lineLength); // The placedSymbolArray is used at render time in drawTileSymbols // These indices allow access to the array at collision detection time placedTextSymbolIndices.push(bucket.text.placedSymbolArray.length - 1); return glyphQuads.length * 4; } /** * Add a single label & icon placement. * * @private */ function addSymbol(bucket , anchor , line , shapedTextOrientations , shapedIcon , layer , collisionBoxArray , featureIndex , sourceLayerIndex , bucketIndex , textBoxScale , textPadding , textAlongLine , textOffset , iconBoxScale , iconPadding , iconAlongLine , iconOffset , globalProperties , feature , glyphPositionMap , sizes ) { var lineArray = bucket.addToLineVertexArray(anchor, line); var textCollisionFeature, iconCollisionFeature; var numIconVertices = 0; var numGlyphVertices = 0; var numVerticalGlyphVertices = 0; var key = shapedTextOrientations.horizontal ? shapedTextOrientations.horizontal.text : ''; var placedTextSymbolIndices = []; if (shapedTextOrientations.horizontal) { // As a collision approximation, we can use either the vertical or the horizontal version of the feature // We're counting on the two versions having similar dimensions textCollisionFeature = new CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedTextOrientations.horizontal, textBoxScale, textPadding, textAlongLine, bucket.overscaling); numGlyphVertices += addTextVertices(bucket, anchor, shapedTextOrientations.horizontal, layer, textAlongLine, globalProperties, feature, textOffset, lineArray, shapedTextOrientations.vertical ? WritingMode.horizontal : WritingMode.horizontalOnly, placedTextSymbolIndices, glyphPositionMap, sizes); if (shapedTextOrientations.vertical) { numVerticalGlyphVertices += addTextVertices(bucket, anchor, shapedTextOrientations.vertical, layer, textAlongLine, globalProperties, feature, textOffset, lineArray, WritingMode.vertical, placedTextSymbolIndices, glyphPositionMap, sizes); } } var textBoxStartIndex = textCollisionFeature ? textCollisionFeature.boxStartIndex : bucket.collisionBoxArray.length; var textBoxEndIndex = textCollisionFeature ? textCollisionFeature.boxEndIndex : bucket.collisionBoxArray.length; if (shapedIcon) { var iconQuads = getIconQuads(anchor, shapedIcon, layer, iconAlongLine, shapedTextOrientations.horizontal, globalProperties, feature); iconCollisionFeature = new CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedIcon, iconBoxScale, iconPadding, /*align boxes to line*/false, bucket.overscaling); numIconVertices = iconQuads.length * 4; var sizeData = bucket.iconSizeData; var iconSizeData = null; if (sizeData.functionType === 'source') { iconSizeData = [ 10 * layer.layout.get('icon-size').evaluate(feature) ]; } else if (sizeData.functionType === 'composite') { iconSizeData = [ 10 * sizes.compositeIconSizes[0].evaluate(feature), 10 * sizes.compositeIconSizes[1].evaluate(feature) ]; } bucket.addSymbols( bucket.icon, iconQuads, iconSizeData, iconOffset, iconAlongLine, feature, false, anchor, lineArray.lineStartIndex, lineArray.lineLength); } var iconBoxStartIndex = iconCollisionFeature ? iconCollisionFeature.boxStartIndex : bucket.collisionBoxArray.length; var iconBoxEndIndex = iconCollisionFeature ? iconCollisionFeature.boxEndIndex : bucket.collisionBoxArray.length; if (bucket.glyphOffsetArray.length >= SymbolBucket.MAX_GLYPHS) { util.warnOnce("Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907"); } var textOpacityState = new OpacityState(); var iconOpacityState = new OpacityState(); return { key: key, textBoxStartIndex: textBoxStartIndex, textBoxEndIndex: textBoxEndIndex, iconBoxStartIndex: iconBoxStartIndex, iconBoxEndIndex: iconBoxEndIndex, textOffset: textOffset, iconOffset: iconOffset, anchor: anchor, line: line, featureIndex: featureIndex, feature: feature, numGlyphVertices: numGlyphVertices, numVerticalGlyphVertices: numVerticalGlyphVertices, numIconVertices: numIconVertices, textOpacityState: textOpacityState, iconOpacityState: iconOpacityState, isDuplicate: false, placedTextSymbolIndices: placedTextSymbolIndices, crossTileID: 0 }; } function anchorIsTooClose(bucket , text , repeatDistance , anchor ) { var compareText = bucket.compareText; if (!(text in compareText)) { compareText[text] = []; } else { var otherAnchors = compareText[text]; for (var k = otherAnchors.length - 1; k >= 0; k--) { if (anchor.dist(otherAnchors[k]) < repeatDistance) { // If it's within repeatDistance of one anchor, stop looking return true; } } } // If anchor is not within repeatDistance of any other anchor, add to array compareText[text].push(anchor); return false; } },{"../data/bucket/symbol_bucket":56,"../data/extent":58,"../style/evaluation_parameters":187,"../util/classify_rings":260,"../util/find_pole_of_inaccessibility":266,"../util/script_detection":274,"../util/util":280,"./anchor":218,"./clip_line":220,"./collision_feature":221,"./get_anchors":224,"./opacity_state":227,"./quads":230,"./shaping":231,"@mapbox/point-geometry":4}],233:[function(require,module,exports){ 'use strict';// var ref = require('../style-spec/expression'); var normalizePropertyExpression = ref.normalizePropertyExpression; var interpolate = require('../style-spec/util/interpolate'); var util = require('../util/util'); module.exports = { getSizeData: getSizeData, evaluateSizeForFeature: evaluateSizeForFeature, evaluateSizeForZoom: evaluateSizeForZoom }; // For {text,icon}-size, get the bucket-level data that will be needed by // the painter to set symbol-size-related uniforms function getSizeData(tileZoom , value ) { var expression = value.expression; if (expression.kind === 'constant') { return { functionType: 'constant', layoutSize: expression.evaluate({zoom: tileZoom + 1}) }; } else if (expression.kind === 'source') { return { functionType: 'source' }; } else { // calculate covering zoom stops for zoom-dependent values var levels = expression.zoomStops; var lower = 0; while (lower < levels.length && levels[lower] <= tileZoom) { lower++; } lower = Math.max(0, lower - 1); var upper = lower; while (upper < levels.length && levels[upper] < tileZoom + 1) { upper++; } upper = Math.min(levels.length - 1, upper); var zoomRange = { min: levels[lower], max: levels[upper] }; // We'd like to be able to use CameraExpression or CompositeExpression in these // return types rather than ExpressionSpecification, but the former are not // transferrable across Web Worker boundaries. if (expression.kind === 'composite') { return { functionType: 'composite', zoomRange: zoomRange, propertyValue: (value.value ) }; } else { // for camera functions, also save off the function values // evaluated at the covering zoom levels return { functionType: 'camera', layoutSize: expression.evaluate({zoom: tileZoom + 1}), zoomRange: zoomRange, sizeRange: { min: expression.evaluate({zoom: zoomRange.min}), max: expression.evaluate({zoom: zoomRange.max}) }, propertyValue: (value.value ) }; } } } function evaluateSizeForFeature(sizeData , partiallyEvaluatedSize , symbol ) { var part = partiallyEvaluatedSize; if (sizeData.functionType === 'source') { return symbol.lowerSize / 10; } else if (sizeData.functionType === 'composite') { return interpolate.number(symbol.lowerSize / 10, symbol.upperSize / 10, part.uSizeT); } else { return part.uSize; } } function evaluateSizeForZoom(sizeData , currentZoom , property ) { if (sizeData.functionType === 'constant') { return { uSizeT: 0, uSize: sizeData.layoutSize }; } else if (sizeData.functionType === 'source') { return { uSizeT: 0, uSize: 0 }; } else if (sizeData.functionType === 'camera') { var propertyValue = sizeData.propertyValue; var zoomRange = sizeData.zoomRange; var sizeRange = sizeData.sizeRange; var expression = ((normalizePropertyExpression(propertyValue, property.specification) ) ); // Even though we could get the exact value of the camera function // at z = tr.zoom, we intentionally do not: instead, we interpolate // between the camera function values at a pair of zoom stops covering // [tileZoom, tileZoom + 1] in order to be consistent with this // restriction on composite functions var t = util.clamp( expression.interpolationFactor(currentZoom, zoomRange.min, zoomRange.max), 0, 1); return { uSizeT: 0, uSize: sizeRange.min + t * (sizeRange.max - sizeRange.min) }; } else { var propertyValue$1 = sizeData.propertyValue; var zoomRange$1 = sizeData.zoomRange; var expression$1 = ((normalizePropertyExpression(propertyValue$1, property.specification) ) ); return { uSizeT: util.clamp(expression$1.interpolationFactor(currentZoom, zoomRange$1.min, zoomRange$1.max), 0, 1), uSize: 0 }; } } },{"../style-spec/expression":144,"../style-spec/util/interpolate":163,"../util/util":280}],234:[function(require,module,exports){ 'use strict';// var rtlTextPlugin = require('../source/rtl_text_plugin'); module.exports = function(text , layer , feature ) { var transform = layer.layout.get('text-transform').evaluate(feature); if (transform === 'uppercase') { text = text.toLocaleUpperCase(); } else if (transform === 'lowercase') { text = text.toLocaleLowerCase(); } if (rtlTextPlugin.applyArabicShaping) { text = rtlTextPlugin.applyArabicShaping(text); } return text; }; },{"../source/rtl_text_plugin":114}],235:[function(require,module,exports){ 'use strict';// var DOM = require('../util/dom'); var Point = require('@mapbox/point-geometry'); var handlers = { scrollZoom: require('./handler/scroll_zoom'), boxZoom: require('./handler/box_zoom'), dragRotate: require('./handler/drag_rotate'), dragPan: require('./handler/drag_pan'), keyboard: require('./handler/keyboard'), doubleClickZoom: require('./handler/dblclick_zoom'), touchZoomRotate: require('./handler/touch_zoom_rotate') }; module.exports = function bindHandlers(map , options ) { var el = map.getCanvasContainer(); var contextMenuEvent = null; var mouseDown = false; var startPos = null; var tapped = null; for (var name in handlers) { (map )[name] = new handlers[name](map, options); if (options.interactive && options[name]) { (map )[name].enable(options[name]); } } el.addEventListener('mouseout', onMouseOut, false); el.addEventListener('mousedown', onMouseDown, false); el.addEventListener('mouseup', onMouseUp, false); el.addEventListener('mousemove', onMouseMove, false); el.addEventListener('mouseover', onMouseOver, false); el.addEventListener('touchstart', onTouchStart, false); el.addEventListener('touchend', onTouchEnd, false); el.addEventListener('touchmove', onTouchMove, false); el.addEventListener('touchcancel', onTouchCancel, false); el.addEventListener('click', onClick, false); el.addEventListener('dblclick', onDblClick, false); el.addEventListener('contextmenu', onContextMenu, false); function onMouseOut(e ) { fireMouseEvent('mouseout', e); } function onMouseDown(e ) { if (!map.doubleClickZoom.isActive()) { map.stop(); } startPos = DOM.mousePos(el, e); fireMouseEvent('mousedown', e); mouseDown = true; } function onMouseUp(e ) { var rotating = map.dragRotate && map.dragRotate.isActive(); if (contextMenuEvent && !rotating) { // This will be the case for Mac fireMouseEvent('contextmenu', contextMenuEvent); } contextMenuEvent = null; mouseDown = false; fireMouseEvent('mouseup', e); } function onMouseMove(e ) { if (map.dragPan && map.dragPan.isActive()) { return; } if (map.dragRotate && map.dragRotate.isActive()) { return; } var target = e.toElement || e.target; while (target && target !== el) { target = target.parentNode; } if (target !== el) { return; } fireMouseEvent('mousemove', e); } function onMouseOver(e ) { var target = e.toElement || e.target; while (target && target !== el) { target = target.parentNode; } if (target !== el) { return; } fireMouseEvent('mouseover', e); } function onTouchStart(e ) { map.stop(); fireTouchEvent('touchstart', e); if (!e.touches || e.touches.length > 1) { return; } if (!tapped) { tapped = setTimeout(onTouchTimeout, 300); } else { clearTimeout(tapped); tapped = null; fireMouseEvent('dblclick', e); } } function onTouchMove(e ) { fireTouchEvent('touchmove', e); } function onTouchEnd(e ) { fireTouchEvent('touchend', e); } function onTouchCancel(e ) { fireTouchEvent('touchcancel', e); } function onTouchTimeout() { tapped = null; } function onClick(e ) { var pos = DOM.mousePos(el, e); if (pos.equals((startPos ))) { fireMouseEvent('click', e); } } function onDblClick(e ) { fireMouseEvent('dblclick', e); e.preventDefault(); } function onContextMenu(e ) { var rotating = map.dragRotate && map.dragRotate.isActive(); if (!mouseDown && !rotating) { // Windows: contextmenu fired on mouseup, so fire event now fireMouseEvent('contextmenu', e); } else if (mouseDown) { // Mac: contextmenu fired on mousedown; we save it until mouseup for consistency's sake contextMenuEvent = e; } e.preventDefault(); } function fireMouseEvent(type, e) { var pos = DOM.mousePos(el, e); return map.fire(type, { lngLat: map.unproject(pos), point: pos, originalEvent: e }); } function fireTouchEvent(type, e) { var touches = DOM.touchPos(el, e); var singular = touches.reduce(function (prev, curr, i, arr) { return prev.add(curr.div(arr.length)); }, new Point(0, 0)); return map.fire(type, { lngLat: map.unproject(singular), point: singular, lngLats: touches.map(function (t) { return map.unproject(t); }, this), points: touches, originalEvent: e }); } }; },{"../util/dom":264,"./handler/box_zoom":244,"./handler/dblclick_zoom":245,"./handler/drag_pan":246,"./handler/drag_rotate":247,"./handler/keyboard":248,"./handler/scroll_zoom":249,"./handler/touch_zoom_rotate":250,"@mapbox/point-geometry":4}],236:[function(require,module,exports){ 'use strict';// var util = require('../util/util'); var interpolate = require('../style-spec/util/interpolate').number; var browser = require('../util/browser'); var LngLat = require('../geo/lng_lat'); var LngLatBounds = require('../geo/lng_lat_bounds'); var Point = require('@mapbox/point-geometry'); var Evented = require('../util/evented'); /** * Options common to {@link Map#jumpTo}, {@link Map#easeTo}, and {@link Map#flyTo}, controlling the desired location, * zoom, bearing, and pitch of the camera. All properties are optional, and when a property is omitted, the current * camera value for that property will remain unchanged. * * @typedef {Object} CameraOptions * @property {LngLatLike} center The desired center. * @property {number} zoom The desired zoom level. * @property {number} bearing The desired bearing, in degrees. The bearing is the compass direction that * is "up"; for example, a bearing of 90° orients the map so that east is up. * @property {number} pitch The desired pitch, in degrees. * @property {LngLatLike} around If `zoom` is specified, `around` determines the point around which the zoom is centered. */ /** * Options common to map movement methods that involve animation, such as {@link Map#panBy} and * {@link Map#easeTo}, controlling the duration and easing function of the animation. All properties * are optional. * * @typedef {Object} AnimationOptions * @property {number} duration The animation's duration, measured in milliseconds. * @property {Function} easing A function taking a time in the range 0..1 and returning a number where 0 is * the initial state and 1 is the final state. * @property {PointLike} offset of the target center relative to real map container center at the end of animation. * @property {boolean} animate If `false`, no animation will occur. */ /** * Options for setting padding on a call to {@link Map#fitBounds}. All properties of this object must be * non-negative integers. * * @typedef {Object} PaddingOptions * @property {number} top Padding in pixels from the top of the map canvas. * @property {number} bottom Padding in pixels from the bottom of the map canvas. * @property {number} left Padding in pixels from the left of the map canvas. * @property {number} right Padding in pixels from the right of the map canvas. */ var Camera = (function (Evented) { function Camera(transform , options ) { Evented.call(this); this.moving = false; this.transform = transform; this._bearingSnap = options.bearingSnap; } if ( Evented ) Camera.__proto__ = Evented; Camera.prototype = Object.create( Evented && Evented.prototype ); Camera.prototype.constructor = Camera; /** * Returns the map's geographical centerpoint. * * @memberof Map# * @returns The map's geographical centerpoint. */ Camera.prototype.getCenter = function getCenter () { return this.transform.center; }; /** * Sets the map's geographical centerpoint. Equivalent to `jumpTo({center: center})`. * * @memberof Map# * @param center The centerpoint to set. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @example * map.setCenter([-74, 38]); * @see [Move symbol with the keyboard](https://www.mapbox.com/mapbox-gl-js/example/rotating-controllable-marker/) */ Camera.prototype.setCenter = function setCenter (center , eventData ) { return this.jumpTo({center: center}, eventData); }; /** * Pans the map by the specified offest. * * @memberof Map# * @param offset `x` and `y` coordinates by which to pan the map. * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @see [Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/) */ Camera.prototype.panBy = function panBy (offset , options , eventData ) { offset = Point.convert(offset).mult(-1); return this.panTo(this.transform.center, util.extend({offset: offset}, options), eventData); }; /** * Pans the map to the specified location, with an animated transition. * * @memberof Map# * @param lnglat The location to pan the map to. * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.panTo = function panTo (lnglat , options , eventData ) { return this.easeTo(util.extend({ center: lnglat }, options), eventData); }; /** * Returns the map's current zoom level. * * @memberof Map# * @returns The map's current zoom level. */ Camera.prototype.getZoom = function getZoom () { return this.transform.zoom; }; /** * Sets the map's zoom level. Equivalent to `jumpTo({zoom: zoom})`. * * @memberof Map# * @param zoom The zoom level to set (0-20). * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires move * @fires zoom * @fires moveend * @fires zoomend * @returns {Map} `this` * @example * // zoom the map to 5 * map.setZoom(5); */ Camera.prototype.setZoom = function setZoom (zoom , eventData ) { this.jumpTo({zoom: zoom}, eventData); return this; }; /** * Zooms the map to the specified zoom level, with an animated transition. * * @memberof Map# * @param zoom The zoom level to transition to. * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires move * @fires zoom * @fires moveend * @fires zoomend * @returns {Map} `this` */ Camera.prototype.zoomTo = function zoomTo (zoom , options , eventData ) { return this.easeTo(util.extend({ zoom: zoom }, options), eventData); }; /** * Increases the map's zoom level by 1. * * @memberof Map# * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires move * @fires zoom * @fires moveend * @fires zoomend * @returns {Map} `this` */ Camera.prototype.zoomIn = function zoomIn (options , eventData ) { this.zoomTo(this.getZoom() + 1, options, eventData); return this; }; /** * Decreases the map's zoom level by 1. * * @memberof Map# * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires move * @fires zoom * @fires moveend * @fires zoomend * @returns {Map} `this` */ Camera.prototype.zoomOut = function zoomOut (options , eventData ) { this.zoomTo(this.getZoom() - 1, options, eventData); return this; }; /** * Returns the map's current bearing. The bearing is the compass direction that is \"up\"; for example, a bearing * of 90° orients the map so that east is up. * * @memberof Map# * @returns The map's current bearing. * @see [Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/) */ Camera.prototype.getBearing = function getBearing () { return this.transform.bearing; }; /** * Sets the map's bearing (rotation). The bearing is the compass direction that is \"up\"; for example, a bearing * of 90° orients the map so that east is up. * * Equivalent to `jumpTo({bearing: bearing})`. * * @memberof Map# * @param bearing The desired bearing. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @example * // rotate the map to 90 degrees * map.setBearing(90); */ Camera.prototype.setBearing = function setBearing (bearing , eventData ) { this.jumpTo({bearing: bearing}, eventData); return this; }; /** * Rotates the map to the specified bearing, with an animated transition. The bearing is the compass direction * that is \"up\"; for example, a bearing of 90° orients the map so that east is up. * * @memberof Map# * @param bearing The desired bearing. * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.rotateTo = function rotateTo (bearing , options , eventData ) { return this.easeTo(util.extend({ bearing: bearing }, options), eventData); }; /** * Rotates the map so that north is up (0° bearing), with an animated transition. * * @memberof Map# * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.resetNorth = function resetNorth (options , eventData ) { this.rotateTo(0, util.extend({duration: 1000}, options), eventData); return this; }; /** * Snaps the map so that north is up (0° bearing), if the current bearing is close enough to it (i.e. within the * `bearingSnap` threshold). * * @memberof Map# * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.snapToNorth = function snapToNorth (options , eventData ) { if (Math.abs(this.getBearing()) < this._bearingSnap) { return this.resetNorth(options, eventData); } return this; }; /** * Returns the map's current pitch (tilt). * * @memberof Map# * @returns The map's current pitch, measured in degrees away from the plane of the screen. */ Camera.prototype.getPitch = function getPitch () { return this.transform.pitch; }; /** * Sets the map's pitch (tilt). Equivalent to `jumpTo({pitch: pitch})`. * * @memberof Map# * @param pitch The pitch to set, measured in degrees away from the plane of the screen (0-60). * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires pitchstart * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.setPitch = function setPitch (pitch , eventData ) { this.jumpTo({pitch: pitch}, eventData); return this; }; /** * Pans and zooms the map to contain its visible area within the specified geographical bounds. * This function will also reset the map's bearing to 0 if bearing is nonzero. * * @memberof Map# * @param bounds Center these bounds in the viewport and use the highest * zoom level up to and including `Map#getMaxZoom()` that fits them in the viewport. * @param options * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds. * @param {boolean} [options.linear=false] If `true`, the map transitions using * {@link Map#easeTo}. If `false`, the map transitions using {@link Map#flyTo}. See * those functions and {@link AnimationOptions} for information about options available. * @param {Function} [options.easing] An easing function for the animated transition. See {@link AnimationOptions}. * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels. * @param {number} [options.maxZoom] The maximum zoom level to allow when the map view transitions to the specified bounds. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @example * var bbox = [[-79, 43], [-73, 45]]; * map.fitBounds(bbox, { * padding: {top: 10, bottom:25, left: 15, right: 5} * }); * @see [Fit a map to a bounding box](https://www.mapbox.com/mapbox-gl-js/example/fitbounds/) */ Camera.prototype.fitBounds = function fitBounds (bounds , options , eventData ) { options = util.extend({ padding: { top: 0, bottom: 0, right: 0, left: 0 }, offset: [0, 0], maxZoom: this.transform.maxZoom }, options); if (typeof options.padding === 'number') { var p = options.padding; options.padding = { top: p, bottom: p, right: p, left: p }; } if (!util.deepEqual(Object.keys(options.padding).sort(function (a, b) { if (a < b) { return -1; } if (a > b) { return 1; } return 0; }), ["bottom", "left", "right", "top"])) { util.warnOnce("options.padding must be a positive number, or an Object with keys 'bottom', 'left', 'right', 'top'"); return this; } bounds = LngLatBounds.convert(bounds); // we separate the passed padding option into two parts, the part that does not affect the map's center // (lateral and vertical padding), and the part that does (paddingOffset). We add the padding offset // to the options `offset` object where it can alter the map's center in the subsequent calls to // `easeTo` and `flyTo`. var paddingOffset = [(options.padding.left - options.padding.right) / 2, (options.padding.top - options.padding.bottom) / 2], lateralPadding = Math.min(options.padding.right, options.padding.left), verticalPadding = Math.min(options.padding.top, options.padding.bottom); options.offset = [options.offset[0] + paddingOffset[0], options.offset[1] + paddingOffset[1]]; var offset = Point.convert(options.offset), tr = this.transform, nw = tr.project(bounds.getNorthWest()), se = tr.project(bounds.getSouthEast()), size = se.sub(nw), scaleX = (tr.width - lateralPadding * 2 - Math.abs(offset.x) * 2) / size.x, scaleY = (tr.height - verticalPadding * 2 - Math.abs(offset.y) * 2) / size.y; if (scaleY < 0 || scaleX < 0) { util.warnOnce('Map cannot fit within canvas with the given bounds, padding, and/or offset.'); return this; } options.center = tr.unproject(nw.add(se).div(2)); options.zoom = Math.min(tr.scaleZoom(tr.scale * Math.min(scaleX, scaleY)), options.maxZoom); options.bearing = 0; return options.linear ? this.easeTo(options, eventData) : this.flyTo(options, eventData); }; /** * Changes any combination of center, zoom, bearing, and pitch, without * an animated transition. The map will retain its current values for any * details not specified in `options`. * * @memberof Map# * @param options * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires pitchstart * @fires rotate * @fires move * @fires zoom * @fires pitch * @fires moveend * @fires zoomend * @fires pitchend * @returns {Map} `this` */ Camera.prototype.jumpTo = function jumpTo (options , eventData ) { this.stop(); var tr = this.transform; var zoomChanged = false, bearingChanged = false, pitchChanged = false; if ('zoom' in options && tr.zoom !== +options.zoom) { zoomChanged = true; tr.zoom = +options.zoom; } if (options.center !== undefined) { tr.center = LngLat.convert(options.center); } if ('bearing' in options && tr.bearing !== +options.bearing) { bearingChanged = true; tr.bearing = +options.bearing; } if ('pitch' in options && tr.pitch !== +options.pitch) { pitchChanged = true; tr.pitch = +options.pitch; } this.fire('movestart', eventData) .fire('move', eventData); if (zoomChanged) { this.fire('zoomstart', eventData) .fire('zoom', eventData) .fire('zoomend', eventData); } if (bearingChanged) { this.fire('rotate', eventData); } if (pitchChanged) { this.fire('pitchstart', eventData) .fire('pitch', eventData) .fire('pitchend', eventData); } return this.fire('moveend', eventData); }; /** * Changes any combination of center, zoom, bearing, and pitch, with an animated transition * between old and new values. The map will retain its current values for any * details not specified in `options`. * * @memberof Map# * @param options Options describing the destination and animation of the transition. * Accepts {@link CameraOptions} and {@link AnimationOptions}. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires pitchstart * @fires rotate * @fires move * @fires zoom * @fires pitch * @fires moveend * @fires zoomend * @fires pitchend * @returns {Map} `this` * @see [Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/) */ Camera.prototype.easeTo = function easeTo (options , eventData ) { var this$1 = this; this.stop(); options = util.extend({ offset: [0, 0], duration: 500, easing: util.ease }, options); if (options.animate === false) { options.duration = 0; } var tr = this.transform, startZoom = this.getZoom(), startBearing = this.getBearing(), startPitch = this.getPitch(), zoom = 'zoom' in options ? +options.zoom : startZoom, bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing, pitch = 'pitch' in options ? +options.pitch : startPitch; var pointAtOffset = tr.centerPoint.add(Point.convert(options.offset)); var locationAtOffset = tr.pointLocation(pointAtOffset); var center = LngLat.convert(options.center || locationAtOffset); this._normalizeCenter(center); var from = tr.project(locationAtOffset); var delta = tr.project(center).sub(from); var finalScale = tr.zoomScale(zoom - startZoom); var around, aroundPoint; if (options.around) { around = LngLat.convert(options.around); aroundPoint = tr.locationPoint(around); } this.zooming = (zoom !== startZoom); this.rotating = (startBearing !== bearing); this.pitching = (pitch !== startPitch); this._prepareEase(eventData, options.noMoveStart); clearTimeout(this._onEaseEnd); this._ease(function (k) { if (this$1.zooming) { tr.zoom = interpolate(startZoom, zoom, k); } if (this$1.rotating) { tr.bearing = interpolate(startBearing, bearing, k); } if (this$1.pitching) { tr.pitch = interpolate(startPitch, pitch, k); } if (around) { tr.setLocationAtPoint(around, aroundPoint); } else { var scale = tr.zoomScale(tr.zoom - startZoom); var base = zoom > startZoom ? Math.min(2, finalScale) : Math.max(0.5, finalScale); var speedup = Math.pow(base, 1 - k); var newCenter = tr.unproject(from.add(delta.mult(k * speedup)).mult(scale)); tr.setLocationAtPoint(tr.renderWorldCopies ? newCenter.wrap() : newCenter, pointAtOffset); } this$1._fireMoveEvents(eventData); }, function () { if (options.delayEndEvents) { this$1._onEaseEnd = setTimeout(function () { return this$1._afterEase(eventData); }, options.delayEndEvents); } else { this$1._afterEase(eventData); } }, options); return this; }; Camera.prototype._prepareEase = function _prepareEase (eventData , noMoveStart ) { this.moving = true; if (!noMoveStart) { this.fire('movestart', eventData); } if (this.zooming) { this.fire('zoomstart', eventData); } if (this.pitching) { this.fire('pitchstart', eventData); } }; Camera.prototype._fireMoveEvents = function _fireMoveEvents (eventData ) { this.fire('move', eventData); if (this.zooming) { this.fire('zoom', eventData); } if (this.rotating) { this.fire('rotate', eventData); } if (this.pitching) { this.fire('pitch', eventData); } }; Camera.prototype._afterEase = function _afterEase (eventData ) { var wasZooming = this.zooming; var wasPitching = this.pitching; this.moving = false; this.zooming = false; this.rotating = false; this.pitching = false; if (wasZooming) { this.fire('zoomend', eventData); } if (wasPitching) { this.fire('pitchend', eventData); } this.fire('moveend', eventData); }; /** * Changes any combination of center, zoom, bearing, and pitch, animating the transition along a curve that * evokes flight. The animation seamlessly incorporates zooming and panning to help * the user maintain her bearings even after traversing a great distance. * * @memberof Map# * @param {Object} options Options describing the destination and animation of the transition. * Accepts {@link CameraOptions}, {@link AnimationOptions}, * and the following additional options. * @param {number} [options.curve=1.42] The zooming "curve" that will occur along the * flight path. A high value maximizes zooming for an exaggerated animation, while a low * value minimizes zooming for an effect closer to {@link Map#easeTo}. 1.42 is the average * value selected by participants in the user study discussed in * [van Wijk (2003)](https://www.win.tue.nl/~vanwijk/zoompan.pdf). A value of * `Math.pow(6, 0.25)` would be equivalent to the root mean squared average velocity. A * value of 1 would produce a circular motion. * @param {number} [options.minZoom] The zero-based zoom level at the peak of the flight path. If * `options.curve` is specified, this option is ignored. * @param {number} [options.speed=1.2] The average speed of the animation defined in relation to * `options.curve`. A speed of 1.2 means that the map appears to move along the flight path * by 1.2 times `options.curve` screenfuls every second. A _screenful_ is the map's visible span. * It does not correspond to a fixed physical distance, but varies by zoom level. * @param {number} [options.screenSpeed] The average speed of the animation measured in screenfuls * per second, assuming a linear timing curve. If `options.speed` is specified, this option is ignored. * @param {number} [options.maxDuration] The animation's maximum duration, measured in milliseconds. * If duration exceeds maximum duration, it resets to 0. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires pitchstart * @fires move * @fires zoom * @fires rotate * @fires pitch * @fires moveend * @fires zoomend * @fires pitchend * @returns {Map} `this` * @example * // fly with default options to null island * map.flyTo({center: [0, 0], zoom: 9}); * // using flyTo options * map.flyTo({ * center: [0, 0], * zoom: 9, * speed: 0.2, * curve: 1, * easing(t) { * return t; * } * }); * @see [Fly to a location](https://www.mapbox.com/mapbox-gl-js/example/flyto/) * @see [Slowly fly to a location](https://www.mapbox.com/mapbox-gl-js/example/flyto-options/) * @see [Fly to a location based on scroll position](https://www.mapbox.com/mapbox-gl-js/example/scroll-fly-to/) */ Camera.prototype.flyTo = function flyTo (options, eventData ) { var this$1 = this; // This method implements an “optimal path” animation, as detailed in: // // Van Wijk, Jarke J.; Nuij, Wim A. A. “Smooth and efficient zooming and panning.” INFOVIS // ’03. pp. 15–22. . // // Where applicable, local variable documentation begins with the associated variable or // function in van Wijk (2003). this.stop(); options = util.extend({ offset: [0, 0], speed: 1.2, curve: 1.42, easing: util.ease }, options); var tr = this.transform, startZoom = this.getZoom(), startBearing = this.getBearing(), startPitch = this.getPitch(); var zoom = 'zoom' in options ? util.clamp(+options.zoom, tr.minZoom, tr.maxZoom) : startZoom; var bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing; var pitch = 'pitch' in options ? +options.pitch : startPitch; var scale = tr.zoomScale(zoom - startZoom); var pointAtOffset = tr.centerPoint.add(Point.convert(options.offset)); var locationAtOffset = tr.pointLocation(pointAtOffset); var center = LngLat.convert(options.center || locationAtOffset); this._normalizeCenter(center); var from = tr.project(locationAtOffset); var delta = tr.project(center).sub(from); var rho = options.curve; // w₀: Initial visible span, measured in pixels at the initial scale. var w0 = Math.max(tr.width, tr.height), // w₁: Final visible span, measured in pixels with respect to the initial scale. w1 = w0 / scale, // Length of the flight path as projected onto the ground plane, measured in pixels from // the world image origin at the initial scale. u1 = delta.mag(); if ('minZoom' in options) { var minZoom = util.clamp(Math.min(options.minZoom, startZoom, zoom), tr.minZoom, tr.maxZoom); // wm: Maximum visible span, measured in pixels with respect to the initial // scale. var wMax = w0 / tr.zoomScale(minZoom - startZoom); rho = Math.sqrt(wMax / u1 * 2); } // ρ² var rho2 = rho * rho; /** * rᵢ: Returns the zoom-out factor at one end of the animation. * * @param i 0 for the ascent or 1 for the descent. * @private */ function r(i) { var b = (w1 * w1 - w0 * w0 + (i ? -1 : 1) * rho2 * rho2 * u1 * u1) / (2 * (i ? w1 : w0) * rho2 * u1); return Math.log(Math.sqrt(b * b + 1) - b); } function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; } function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; } function tanh(n) { return sinh(n) / cosh(n); } // r₀: Zoom-out factor during ascent. var r0 = r(0); // w(s): Returns the visible span on the ground, measured in pixels with respect to the // initial scale. Assumes an angular field of view of 2 arctan ½ ≈ 53°. var w = function (s) { return (cosh(r0) / cosh(r0 + rho * s)); }; // u(s): Returns the distance along the flight path as projected onto the ground plane, // measured in pixels from the world image origin at the initial scale. var u = function (s) { return w0 * ((cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2) / u1; }; // S: Total length of the flight path, measured in ρ-screenfuls. var S = (r(1) - r0) / rho; // When u₀ = u₁, the optimal path doesn’t require both ascent and descent. if (Math.abs(u1) < 0.000001 || !isFinite(S)) { // Perform a more or less instantaneous transition if the path is too short. if (Math.abs(w0 - w1) < 0.000001) { return this.easeTo(options, eventData); } var k = w1 < w0 ? -1 : 1; S = Math.abs(Math.log(w1 / w0)) / rho; u = function() { return 0; }; w = function(s) { return Math.exp(k * rho * s); }; } if ('duration' in options) { options.duration = +options.duration; } else { var V = 'screenSpeed' in options ? +options.screenSpeed / rho : +options.speed; options.duration = 1000 * S / V; } if (options.maxDuration && options.duration > options.maxDuration) { options.duration = 0; } this.zooming = true; this.rotating = (startBearing !== bearing); this.pitching = (pitch !== startPitch); this._prepareEase(eventData, false); this._ease(function (k) { // s: The distance traveled along the flight path, measured in ρ-screenfuls. var s = k * S; var scale = 1 / w(s); tr.zoom = startZoom + tr.scaleZoom(scale); if (this$1.rotating) { tr.bearing = interpolate(startBearing, bearing, k); } if (this$1.pitching) { tr.pitch = interpolate(startPitch, pitch, k); } var newCenter = tr.unproject(from.add(delta.mult(u(s))).mult(scale)); tr.setLocationAtPoint(tr.renderWorldCopies ? newCenter.wrap() : newCenter, pointAtOffset); this$1._fireMoveEvents(eventData); }, function () { return this$1._afterEase(eventData); }, options); return this; }; Camera.prototype.isEasing = function isEasing () { return !!this._isEasing; }; /** * Returns a Boolean indicating whether the camera is moving. * * @memberof Map# * @returns A Boolean indicating whether the camera is moving. */ Camera.prototype.isMoving = function isMoving () { return this.moving; }; /** * Stops any animated transition underway. * * @memberof Map# * @returns {Map} `this` */ Camera.prototype.stop = function stop () { if (this._onFrame) { this._finishAnimation(); } return this; }; Camera.prototype._ease = function _ease (frame , finish , options ) { var this$1 = this; if (options.animate === false || options.duration === 0) { frame(1); finish(); } else { this._easeStart = browser.now(); this._isEasing = true; this._easeOptions = options; this._startAnimation(function (_) { var t = Math.min((browser.now() - this$1._easeStart) / this$1._easeOptions.duration, 1); frame(this$1._easeOptions.easing(t)); if (t === 1) { this$1.stop(); } }, function () { this$1._isEasing = false; finish(); }); } }; /* * Should be called at the top of the render loop to update camera position * and orientation before they're read by any rendering logic. */ Camera.prototype._updateCamera = function _updateCamera () { if (this._onFrame) { this._onFrame(this.transform); } }; /* * Start the camera animation using the given onFrame callback. * * @param onFrame A callback responsible for updating the transform to reflect the desired camera position and orientation, and also for firing any relevant camera movement events. * @param finish A callback that is called when this animation is stopped (i.e., when `Camera#stop()` is called). */ Camera.prototype._startAnimation = function _startAnimation (onFrame , finish) { if ( finish === void 0 ) finish = function () {}; this.stop(); this._onFrame = onFrame; this._finishFn = finish; this._update(); return this; }; Camera.prototype._finishAnimation = function _finishAnimation () { delete this._onFrame; // The finish function might emit events which trigger new animation, // which sets a new _finishFn. Ensure we don't delete it // unintentionally. var finish = this._finishFn; delete this._finishFn; finish.call(this); }; // convert bearing so that it's numerically close to the current one so that it interpolates properly Camera.prototype._normalizeBearing = function _normalizeBearing (bearing , currentBearing ) { bearing = util.wrap(bearing, -180, 180); var diff = Math.abs(bearing - currentBearing); if (Math.abs(bearing - 360 - currentBearing) < diff) { bearing -= 360; } if (Math.abs(bearing + 360 - currentBearing) < diff) { bearing += 360; } return bearing; }; // If a path crossing the antimeridian would be shorter, extend the final coordinate so that // interpolating between the two endpoints will cross it. Camera.prototype._normalizeCenter = function _normalizeCenter (center ) { var tr = this.transform; if (!tr.renderWorldCopies || tr.lngRange) { return; } var delta = center.lng - tr.center.lng; center.lng += delta > 180 ? -360 : delta < -180 ? 360 : 0; }; return Camera; }(Evented)); module.exports = Camera; },{"../geo/lng_lat":67,"../geo/lng_lat_bounds":68,"../style-spec/util/interpolate":163,"../util/browser":257,"../util/evented":265,"../util/util":280,"@mapbox/point-geometry":4}],237:[function(require,module,exports){ 'use strict';// var DOM = require('../../util/dom'); var util = require('../../util/util'); var config = require('../../util/config'); /** * An `AttributionControl` control presents the map's [attribution information](https://www.mapbox.com/help/attribution/). * * @implements {IControl} * @param {Object} [options] * @param {boolean} [options.compact] If `true` force a compact attribution that shows the full attribution on mouse hover, or if `false` force the full attribution control. The default is a responsive attribution that collapses when the map is less than 640 pixels wide. * @example * var map = new mapboxgl.Map({attributionControl: false}) * .addControl(new mapboxgl.AttributionControl({ * compact: true * })); */ var AttributionControl = function AttributionControl(options ) { this.options = options; util.bindAll([ '_updateEditLink', '_updateData', '_updateCompact' ], this); }; AttributionControl.prototype.getDefaultPosition = function getDefaultPosition () { return 'bottom-right'; }; AttributionControl.prototype.onAdd = function onAdd (map ) { var compact = this.options && this.options.compact; this._map = map; this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-attrib'); if (compact) { this._container.classList.add('mapboxgl-compact'); } this._updateAttributions(); this._updateEditLink(); this._map.on('sourcedata', this._updateData); this._map.on('moveend', this._updateEditLink); if (compact === undefined) { this._map.on('resize', this._updateCompact); this._updateCompact(); } return this._container; }; AttributionControl.prototype.onRemove = function onRemove () { DOM.remove(this._container); this._map.off('sourcedata', this._updateData); this._map.off('moveend', this._updateEditLink); this._map.off('resize', this._updateCompact); this._map = (undefined ); }; AttributionControl.prototype._updateEditLink = function _updateEditLink () { var editLink = this._editLink; if (!editLink) { editLink = this._editLink = (this._container.querySelector('.mapbox-improve-map') ); } var params = [ {key: "owner", value: this.styleOwner}, {key: "id", value: this.styleId}, {key: "access_token", value: config.ACCESS_TOKEN} ]; if (editLink) { var paramString = params.reduce(function (acc, next, i) { if (next.value) { acc += (next.key) + "=" + (next.value) + (i < params.length - 1 ? '&' : ''); } return acc; }, "?"); editLink.href = "https://www.mapbox.com/feedback/" + paramString + (this._map._hash ? this._map._hash.getHashString(true) : ''); } }; AttributionControl.prototype._updateData = function _updateData (e ) { if (e && e.sourceDataType === 'metadata') { this._updateAttributions(); this._updateEditLink(); } }; AttributionControl.prototype._updateAttributions = function _updateAttributions () { if (!this._map.style) { return; } var attributions = []; if (this._map.style.stylesheet) { var stylesheet = this._map.style.stylesheet; this.styleOwner = stylesheet.owner; this.styleId = stylesheet.id; } var sourceCaches = this._map.style.sourceCaches; for (var id in sourceCaches) { var source = sourceCaches[id].getSource(); if (source.attribution && attributions.indexOf(source.attribution) < 0) { attributions.push(source.attribution); } } // remove any entries that are substrings of another entry. // first sort by length so that substrings come first attributions.sort(function (a, b) { return a.length - b.length; }); attributions = attributions.filter(function (attrib, i) { for (var j = i + 1; j < attributions.length; j++) { if (attributions[j].indexOf(attrib) >= 0) { return false; } } return true; }); if (attributions.length) { this._container.innerHTML = attributions.join(' | '); this._container.classList.remove('mapboxgl-attrib-empty'); } else { this._container.classList.add('mapboxgl-attrib-empty'); } // remove old DOM node from _editLink this._editLink = null; }; AttributionControl.prototype._updateCompact = function _updateCompact () { if (this._map.getCanvasContainer().offsetWidth <= 640) { this._container.classList.add('mapboxgl-compact'); } else { this._container.classList.remove('mapboxgl-compact'); } }; module.exports = AttributionControl; },{"../../util/config":261,"../../util/dom":264,"../../util/util":280}],238:[function(require,module,exports){ 'use strict';// var DOM = require('../../util/dom'); var util = require('../../util/util'); var window = require('../../util/window'); /** * A `FullscreenControl` control contains a button for toggling the map in and out of fullscreen mode. * * @implements {IControl} * @example * map.addControl(new mapboxgl.FullscreenControl()); * @see [View a fullscreen map](https://www.mapbox.com/mapbox-gl-js/example/fullscreen/) */ var FullscreenControl = function FullscreenControl() { this._fullscreen = false; util.bindAll([ '_onClickFullscreen', '_changeIcon' ], this); if ('onfullscreenchange' in window.document) { this._fullscreenchange = 'fullscreenchange'; } else if ('onmozfullscreenchange' in window.document) { this._fullscreenchange = 'mozfullscreenchange'; } else if ('onwebkitfullscreenchange' in window.document) { this._fullscreenchange = 'webkitfullscreenchange'; } else if ('onmsfullscreenchange' in window.document) { this._fullscreenchange = 'MSFullscreenChange'; } this._className = 'mapboxgl-ctrl'; }; FullscreenControl.prototype.onAdd = function onAdd (map ) { this._map = map; this._mapContainer = this._map.getContainer(); this._container = DOM.create('div', ((this._className) + " mapboxgl-ctrl-group")); if (this._checkFullscreenSupport()) { this._setupUI(); } else { this._container.style.display = 'none'; util.warnOnce('This device does not support fullscreen mode.'); } return this._container; }; FullscreenControl.prototype.onRemove = function onRemove () { DOM.remove(this._container); this._map = (null ); window.document.removeEventListener(this._fullscreenchange, this._changeIcon); }; FullscreenControl.prototype._checkFullscreenSupport = function _checkFullscreenSupport () { return !!( window.document.fullscreenEnabled || (window.document ).mozFullScreenEnabled || (window.document ).msFullscreenEnabled || (window.document ).webkitFullscreenEnabled ); }; FullscreenControl.prototype._setupUI = function _setupUI () { var button = this._fullscreenButton = DOM.create('button', (((this._className) + "-icon " + (this._className) + "-fullscreen")), this._container); button.setAttribute("aria-label", "Toggle fullscreen"); button.type = 'button'; this._fullscreenButton.addEventListener('click', this._onClickFullscreen); window.document.addEventListener(this._fullscreenchange, this._changeIcon); }; FullscreenControl.prototype._isFullscreen = function _isFullscreen () { return this._fullscreen; }; FullscreenControl.prototype._changeIcon = function _changeIcon () { var fullscreenElement = window.document.fullscreenElement || (window.document ).mozFullScreenElement || (window.document ).webkitFullscreenElement || (window.document ).msFullscreenElement; if ((fullscreenElement === this._mapContainer) !== this._fullscreen) { this._fullscreen = !this._fullscreen; this._fullscreenButton.classList.toggle(((this._className) + "-shrink")); this._fullscreenButton.classList.toggle(((this._className) + "-fullscreen")); } }; FullscreenControl.prototype._onClickFullscreen = function _onClickFullscreen () { if (this._isFullscreen()) { if (window.document.exitFullscreen) { (window.document ).exitFullscreen(); } else if (window.document.mozCancelFullScreen) { (window.document ).mozCancelFullScreen(); } else if (window.document.msExitFullscreen) { (window.document ).msExitFullscreen(); } else if (window.document.webkitCancelFullScreen) { (window.document ).webkitCancelFullScreen(); } } else if (this._mapContainer.requestFullscreen) { this._mapContainer.requestFullscreen(); } else if (this._mapContainer.mozRequestFullScreen) { (this._mapContainer ).mozRequestFullScreen(); } else if (this._mapContainer.msRequestFullscreen) { (this._mapContainer ).msRequestFullscreen(); } else if (this._mapContainer.webkitRequestFullscreen) { (this._mapContainer ).webkitRequestFullscreen(); } }; module.exports = FullscreenControl; },{"../../util/dom":264,"../../util/util":280,"../../util/window":259}],239:[function(require,module,exports){ 'use strict';// var Evented = require('../../util/evented'); var DOM = require('../../util/dom'); var window = require('../../util/window'); var util = require('../../util/util'); var assert = require('assert'); var LngLat = require('../../geo/lng_lat'); var Marker = require('../marker'); var defaultOptions = { positionOptions: { enableHighAccuracy: false, timeout: 6000 /* 6 sec */ }, fitBoundsOptions: { maxZoom: 15 }, trackUserLocation: false, showUserLocation: true }; var className = 'mapboxgl-ctrl'; var supportsGeolocation; function checkGeolocationSupport(callback) { if (supportsGeolocation !== undefined) { callback(supportsGeolocation); } else if (window.navigator.permissions !== undefined) { // navigator.permissions has incomplete browser support // http://caniuse.com/#feat=permissions-api // Test for the case where a browser disables Geolocation because of an // insecure origin window.navigator.permissions.query({ name: 'geolocation' }).then(function (p) { supportsGeolocation = p.state !== 'denied'; callback(supportsGeolocation); }); } else { supportsGeolocation = !!window.navigator.geolocation; callback(supportsGeolocation); } } /** * A `GeolocateControl` control provides a button that uses the browser's geolocation * API to locate the user on the map. * * Not all browsers support geolocation, * and some users may disable the feature. Geolocation support for modern * browsers including Chrome requires sites to be served over HTTPS. If * geolocation support is not available, the GeolocateControl will not * be visible. * * The zoom level applied will depend on the accuracy of the geolocation provided by the device. * * The GeolocateControl has two modes. If `trackUserLocation` is `false` (default) the control acts as a button, which when pressed will set the map's camera to target the user location. If the user moves, the map won't update. This is most suited for the desktop. If `trackUserLocation` is `true` the control acts as a toggle button that when active the user's location is actively monitored for changes. In this mode the GeolocateControl has three states: * * active - the map's camera automatically updates as the user's location changes, keeping the location dot in the center. * * passive - the user's location dot automatically updates, but the map's camera does not. * * disabled * * @implements {IControl} * @param {Object} [options] * @param {Object} [options.positionOptions={enableHighAccuracy: false, timeout: 6000}] A Geolocation API [PositionOptions](https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions) object. * @param {Object} [options.fitBoundsOptions={maxZoom: 15}] A [`fitBounds`](#Map#fitBounds) options object to use when the map is panned and zoomed to the user's location. The default is to use a `maxZoom` of 15 to limit how far the map will zoom in for very accurate locations. * @param {Object} [options.trackUserLocation=false] If `true` the Geolocate Control becomes a toggle button and when active the map will receive updates to the user's location as it changes. * @param {Object} [options.showUserLocation=true] By default a dot will be shown on the map at the user's location. Set to `false` to disable. * * @example * map.addControl(new mapboxgl.GeolocateControl({ * positionOptions: { * enableHighAccuracy: true * }, * trackUserLocation: true * })); */ var GeolocateControl = (function (Evented) { function GeolocateControl(options ) { Evented.call(this); this.options = util.extend({}, defaultOptions, options); util.bindAll([ '_onSuccess', '_onError', '_finish', '_setupUI', '_updateCamera', '_updateMarker', '_onClickGeolocate' ], this); } if ( Evented ) GeolocateControl.__proto__ = Evented; GeolocateControl.prototype = Object.create( Evented && Evented.prototype ); GeolocateControl.prototype.constructor = GeolocateControl; GeolocateControl.prototype.onAdd = function onAdd (map ) { this._map = map; this._container = DOM.create('div', (className + " " + className + "-group")); checkGeolocationSupport(this._setupUI); return this._container; }; GeolocateControl.prototype.onRemove = function onRemove () { // clear the geolocation watch if exists if (this._geolocationWatchID !== undefined) { window.navigator.geolocation.clearWatch(this._geolocationWatchID); this._geolocationWatchID = (undefined ); } // clear the marker from the map if (this.options.showUserLocation) { this._userLocationDotMarker.remove(); } DOM.remove(this._container); this._map = (undefined ); }; GeolocateControl.prototype._onSuccess = function _onSuccess (position ) { if (this.options.trackUserLocation) { // keep a record of the position so that if the state is BACKGROUND and the user // clicks the button, we can move to ACTIVE_LOCK immediately without waiting for // watchPosition to trigger _onSuccess this._lastKnownPosition = position; switch (this._watchState) { case 'WAITING_ACTIVE': case 'ACTIVE_LOCK': case 'ACTIVE_ERROR': this._watchState = 'ACTIVE_LOCK'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active-error'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active'); break; case 'BACKGROUND': case 'BACKGROUND_ERROR': this._watchState = 'BACKGROUND'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background-error'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background'); break; default: assert(false, ("Unexpected watchState " + (this._watchState))); } } // if showUserLocation and the watch state isn't off then update the marker location if (this.options.showUserLocation && this._watchState !== 'OFF') { this._updateMarker(position); } // if in normal mode (not watch mode), or if in watch mode and the state is active watch // then update the camera if (!this.options.trackUserLocation || this._watchState === 'ACTIVE_LOCK') { this._updateCamera(position); } if (this.options.showUserLocation) { this._dotElement.classList.remove('mapboxgl-user-location-dot-stale'); } this.fire('geolocate', position); this._finish(); }; GeolocateControl.prototype._updateCamera = function _updateCamera (position ) { var center = new LngLat(position.coords.longitude, position.coords.latitude); var radius = position.coords.accuracy; this._map.fitBounds(center.toBounds(radius), this.options.fitBoundsOptions, { geolocateSource: true // tag this camera change so it won't cause the control to change to background state }); }; GeolocateControl.prototype._updateMarker = function _updateMarker (position ) { if (position) { this._userLocationDotMarker.setLngLat([position.coords.longitude, position.coords.latitude]).addTo(this._map); } else { this._userLocationDotMarker.remove(); } }; GeolocateControl.prototype._onError = function _onError (error ) { if (this.options.trackUserLocation) { if (error.code === 1) { // PERMISSION_DENIED this._watchState = 'OFF'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active-error'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background-error'); if (this._geolocationWatchID !== undefined) { this._clearWatch(); } } else { switch (this._watchState) { case 'WAITING_ACTIVE': this._watchState = 'ACTIVE_ERROR'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active-error'); break; case 'ACTIVE_LOCK': this._watchState = 'ACTIVE_ERROR'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active-error'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); // turn marker grey break; case 'BACKGROUND': this._watchState = 'BACKGROUND_ERROR'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background-error'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); // turn marker grey break; case 'ACTIVE_ERROR': break; default: assert(false, ("Unexpected watchState " + (this._watchState))); } } } if (this._watchState !== 'OFF' && this.options.showUserLocation) { this._dotElement.classList.add('mapboxgl-user-location-dot-stale'); } this.fire('error', error); this._finish(); }; GeolocateControl.prototype._finish = function _finish () { if (this._timeoutId) { clearTimeout(this._timeoutId); } this._timeoutId = undefined; }; GeolocateControl.prototype._setupUI = function _setupUI (supported ) { var this$1 = this; if (supported === false) { return; } this._container.addEventListener('contextmenu', function (e ) { return e.preventDefault(); }); this._geolocateButton = DOM.create('button', (className + "-icon " + className + "-geolocate"), this._container); this._geolocateButton.type = 'button'; this._geolocateButton.setAttribute('aria-label', 'Geolocate'); if (this.options.trackUserLocation) { this._geolocateButton.setAttribute('aria-pressed', 'false'); this._watchState = 'OFF'; } // when showUserLocation is enabled, keep the Geolocate button disabled until the device location marker is setup on the map if (this.options.showUserLocation) { this._dotElement = DOM.create('div', 'mapboxgl-user-location-dot'); this._userLocationDotMarker = new Marker(this._dotElement); if (this.options.trackUserLocation) { this._watchState = 'OFF'; } } this._geolocateButton.addEventListener('click', this._onClickGeolocate.bind(this)); // when the camera is changed (and it's not as a result of the Geolocation Control) change // the watch mode to background watch, so that the marker is updated but not the camera. if (this.options.trackUserLocation) { this._map.on('movestart', function (event) { if (!event.geolocateSource && this$1._watchState === 'ACTIVE_LOCK') { this$1._watchState = 'BACKGROUND'; this$1._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background'); this$1._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this$1.fire('trackuserlocationend'); } }); } }; GeolocateControl.prototype._onClickGeolocate = function _onClickGeolocate () { if (this.options.trackUserLocation) { // update watchState and do any outgoing state cleanup switch (this._watchState) { case 'OFF': // turn on the Geolocate Control this._watchState = 'WAITING_ACTIVE'; this.fire('trackuserlocationstart'); break; case 'WAITING_ACTIVE': case 'ACTIVE_LOCK': case 'ACTIVE_ERROR': case 'BACKGROUND_ERROR': // turn off the Geolocate Control this._watchState = 'OFF'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active-error'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background-error'); this.fire('trackuserlocationend'); break; case 'BACKGROUND': this._watchState = 'ACTIVE_LOCK'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); // set camera to last known location if (this._lastKnownPosition) { this._updateCamera(this._lastKnownPosition); } this.fire('trackuserlocationstart'); break; default: assert(false, ("Unexpected watchState " + (this._watchState))); } // incoming state setup switch (this._watchState) { case 'WAITING_ACTIVE': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active'); break; case 'ACTIVE_LOCK': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active'); break; case 'ACTIVE_ERROR': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active-error'); break; case 'BACKGROUND': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background'); break; case 'BACKGROUND_ERROR': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background-error'); break; case 'OFF': break; default: assert(false, ("Unexpected watchState " + (this._watchState))); } // manage geolocation.watchPosition / geolocation.clearWatch if (this._watchState === 'OFF' && this._geolocationWatchID !== undefined) { // clear watchPosition as we've changed to an OFF state this._clearWatch(); } else if (this._geolocationWatchID === undefined) { // enable watchPosition since watchState is not OFF and there is no watchPosition already running this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.setAttribute('aria-pressed', 'true'); this._geolocationWatchID = window.navigator.geolocation.watchPosition( this._onSuccess, this._onError, this.options.positionOptions); } } else { window.navigator.geolocation.getCurrentPosition( this._onSuccess, this._onError, this.options.positionOptions); // This timeout ensures that we still call finish() even if // the user declines to share their location in Firefox this._timeoutId = setTimeout(this._finish, 10000 /* 10sec */); } }; GeolocateControl.prototype._clearWatch = function _clearWatch () { window.navigator.geolocation.clearWatch(this._geolocationWatchID); this._geolocationWatchID = (undefined ); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.setAttribute('aria-pressed', 'false'); if (this.options.showUserLocation) { this._updateMarker(null); } }; return GeolocateControl; }(Evented)); module.exports = GeolocateControl; /* Geolocate Control Watch States * This is the private state of the control. * * OFF * off/inactive * WAITING_ACTIVE * Geolocate Control was clicked but still waiting for Geolocation API response with user location * ACTIVE_LOCK * Showing the user location as a dot AND tracking the camera to be fixed to their location. If their location changes the map moves to follow. * ACTIVE_ERROR * There was en error from the Geolocation API while trying to show and track the user location. * BACKGROUND * Showing the user location as a dot but the camera doesn't follow their location as it changes. * BACKGROUND_ERROR * There was an error from the Geolocation API while trying to show (but not track) the user location. */ /** * Fired on each Geolocation API position update which returned as success. * * @event geolocate * @memberof GeolocateControl * @instance * @property {Position} data The returned [Position](https://developer.mozilla.org/en-US/docs/Web/API/Position) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition) or [Geolocation.watchPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition). * */ /** * Fired on each Geolocation API position update which returned as an error. * * @event error * @memberof GeolocateControl * @instance * @property {PositionError} data The returned [PositionError](https://developer.mozilla.org/en-US/docs/Web/API/PositionError) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition) or [Geolocation.watchPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition). * */ /** * Fired when the Geolocate Control changes to the active lock state, which happens either upon first obtaining a successful Geolocation API position for the user (a geolocate event will follow), or the user clicks the geolocate button when in the background state which uses the last known position to recenter the map and enter active lock state (no geolocate event will follow unless the users's location changes). * * @event trackuserlocationstart * @memberof GeolocateControl * @instance * */ /** * Fired when the Geolocate Control changes to the background state, which happens when a user changes the camera during an active position lock. This only applies when trackUserLocation is true. In the background state, the dot on the map will update with location updates but the camera will not. * * @event trackuserlocationend * @memberof GeolocateControl * @instance * */ },{"../../geo/lng_lat":67,"../../util/dom":264,"../../util/evented":265,"../../util/util":280,"../../util/window":259,"../marker":253,"assert":13}],240:[function(require,module,exports){ 'use strict';// var DOM = require('../../util/dom'); var util = require('../../util/util'); /** * A `LogoControl` is a control that adds the Mapbox watermark * to the map as required by the [terms of service](https://www.mapbox.com/tos/) for Mapbox * vector tiles and core styles. * * @implements {IControl} * @private **/ var LogoControl = function LogoControl() { util.bindAll(['_updateLogo'], this); }; LogoControl.prototype.onAdd = function onAdd (map ) { this._map = map; this._container = DOM.create('div', 'mapboxgl-ctrl'); var anchor = DOM.create('a', 'mapboxgl-ctrl-logo'); anchor.target = "_blank"; anchor.href = "https://www.mapbox.com/"; anchor.setAttribute("aria-label", "Mapbox logo"); this._container.appendChild(anchor); this._container.style.display = 'none'; this._map.on('sourcedata', this._updateLogo); this._updateLogo(); return this._container; }; LogoControl.prototype.onRemove = function onRemove () { DOM.remove(this._container); this._map.off('sourcedata', this._updateLogo); }; LogoControl.prototype.getDefaultPosition = function getDefaultPosition () { return 'bottom-left'; }; LogoControl.prototype._updateLogo = function _updateLogo (e ) { if (!e || e.sourceDataType === 'metadata') { this._container.style.display = this._logoRequired() ? 'block' : 'none'; } }; LogoControl.prototype._logoRequired = function _logoRequired () { if (!this._map.style) { return; } var sourceCaches = this._map.style.sourceCaches; for (var id in sourceCaches) { var source = sourceCaches[id].getSource(); if (source.mapbox_logo) { return true; } } return false; }; module.exports = LogoControl; },{"../../util/dom":264,"../../util/util":280}],241:[function(require,module,exports){ 'use strict';// var DOM = require('../../util/dom'); var util = require('../../util/util'); var DragRotateHandler = require('../handler/drag_rotate'); var defaultOptions = { showCompass: true, showZoom: true }; /** * A `NavigationControl` control contains zoom buttons and a compass. * * @implements {IControl} * @param {Object} [options] * @param {Boolean} [options.showCompass=true] If `true` the compass button is included. * @param {Boolean} [options.showZoom=true] If `true` the zoom-in and zoom-out buttons are included. * @example * var nav = new mapboxgl.NavigationControl(); * map.addControl(nav, 'top-left'); * @see [Display map navigation controls](https://www.mapbox.com/mapbox-gl-js/example/navigation/) * @see [Add a third party vector tile source](https://www.mapbox.com/mapbox-gl-js/example/third-party/) */ var NavigationControl = function NavigationControl(options ) { var this$1 = this; this.options = util.extend({}, defaultOptions, options); this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-group'); this._container.addEventListener('contextmenu', function (e) { return e.preventDefault(); }); if (this.options.showZoom) { this._zoomInButton = this._createButton('mapboxgl-ctrl-icon mapboxgl-ctrl-zoom-in', 'Zoom In', function () { return this$1._map.zoomIn(); }); this._zoomOutButton = this._createButton('mapboxgl-ctrl-icon mapboxgl-ctrl-zoom-out', 'Zoom Out', function () { return this$1._map.zoomOut(); }); } if (this.options.showCompass) { util.bindAll([ '_rotateCompassArrow' ], this); this._compass = this._createButton('mapboxgl-ctrl-icon mapboxgl-ctrl-compass', 'Reset North', function () { return this$1._map.resetNorth(); }); this._compassArrow = DOM.create('span', 'mapboxgl-ctrl-compass-arrow', this._compass); } }; NavigationControl.prototype._rotateCompassArrow = function _rotateCompassArrow () { var rotate = "rotate(" + (this._map.transform.angle * (180 / Math.PI)) + "deg)"; this._compassArrow.style.transform = rotate; }; NavigationControl.prototype.onAdd = function onAdd (map ) { this._map = map; if (this.options.showCompass) { this._map.on('rotate', this._rotateCompassArrow); this._rotateCompassArrow(); this._handler = new DragRotateHandler(map, {button: 'left', element: this._compass}); this._handler.enable(); } return this._container; }; NavigationControl.prototype.onRemove = function onRemove () { DOM.remove(this._container); if (this.options.showCompass) { this._map.off('rotate', this._rotateCompassArrow); this._handler.disable(); delete this._handler; } delete this._map; }; NavigationControl.prototype._createButton = function _createButton (className , ariaLabel , fn ) { var a = DOM.create('button', className, this._container); a.type = 'button'; a.setAttribute('aria-label', ariaLabel); a.addEventListener('click', fn); return a; }; module.exports = NavigationControl; },{"../../util/dom":264,"../../util/util":280,"../handler/drag_rotate":247}],242:[function(require,module,exports){ 'use strict';// var DOM = require('../../util/dom'); var util = require('../../util/util'); /** * A `ScaleControl` control displays the ratio of a distance on the map to the corresponding distance on the ground. * * @implements {IControl} * @param {Object} [options] * @param {number} [options.maxWidth='100'] The maximum length of the scale control in pixels. * @param {string} [options.unit='metric'] Unit of the distance (`'imperial'`, `'metric'` or `'nautical'`). * @example * map.addControl(new mapboxgl.ScaleControl({ * maxWidth: 80, * unit: 'imperial' * })); */ var ScaleControl = function ScaleControl(options ) { this.options = options; util.bindAll([ '_onMove' ], this); }; ScaleControl.prototype.getDefaultPosition = function getDefaultPosition () { return 'bottom-left'; }; ScaleControl.prototype._onMove = function _onMove () { updateScale(this._map, this._container, this.options); }; ScaleControl.prototype.onAdd = function onAdd (map ) { this._map = map; this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-scale', map.getContainer()); this._map.on('move', this._onMove); this._onMove(); return this._container; }; ScaleControl.prototype.onRemove = function onRemove () { DOM.remove(this._container); this._map.off('move', this._onMove); this._map = (undefined ); }; module.exports = ScaleControl; function updateScale(map, container, options) { // A horizontal scale is imagined to be present at center of the map // container with maximum length (Default) as 100px. // Using spherical law of cosines approximation, the real distance is // found between the two coordinates. var maxWidth = options && options.maxWidth || 100; var y = map._container.clientHeight / 2; var maxMeters = getDistance(map.unproject([0, y]), map.unproject([maxWidth, y])); // The real distance corresponding to 100px scale length is rounded off to // near pretty number and the scale length for the same is found out. // Default unit of the scale is based on User's locale. if (options && options.unit === 'imperial') { var maxFeet = 3.2808 * maxMeters; if (maxFeet > 5280) { var maxMiles = maxFeet / 5280; setScale(container, maxWidth, maxMiles, 'mi'); } else { setScale(container, maxWidth, maxFeet, 'ft'); } } else if (options && options.unit === 'nautical') { var maxNauticals = maxMeters / 1852; setScale(container, maxWidth, maxNauticals, 'nm'); } else { setScale(container, maxWidth, maxMeters, 'm'); } } function setScale(container, maxWidth, maxDistance, unit) { var distance = getRoundNum(maxDistance); var ratio = distance / maxDistance; if (unit === 'm' && distance >= 1000) { distance = distance / 1000; unit = 'km'; } container.style.width = (maxWidth * ratio) + "px"; container.innerHTML = distance + unit; } function getDistance(latlng1, latlng2) { // Uses spherical law of cosines approximation. var R = 6371000; var rad = Math.PI / 180, lat1 = latlng1.lat * rad, lat2 = latlng2.lat * rad, a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlng2.lng - latlng1.lng) * rad); var maxMeters = R * Math.acos(Math.min(a, 1)); return maxMeters; } function getRoundNum(num) { var pow10 = Math.pow(10, (("" + (Math.floor(num)))).length - 1); var d = num / pow10; d = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : 1; return pow10 * d; } },{"../../util/dom":264,"../../util/util":280}],243:[function(require,module,exports){ 'use strict';// /** * @typedef {Object} MapMouseEvent * @property {string} type The event type. * @property {Map} target The `Map` object that fired the event. * @property {MouseEvent} originalEvent * @property {Point} point The pixel coordinates of the mouse event target, relative to the map * and measured from the top left corner. * @property {LngLat} lngLat The geographic location on the map of the mouse event target. */ /** * @typedef {Object} MapTouchEvent * @property {string} type The event type. * @property {Map} target The `Map` object that fired the event. * @property {TouchEvent} originalEvent * @property {Point} point The pixel coordinates of the center of the touch event points, relative to the map * and measured from the top left corner. * @property {LngLat} lngLat The geographic location on the map of the center of the touch event points. * @property {Array} points The array of pixel coordinates corresponding to * a [touch event's `touches`](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/touches) * property. * @property {Array} lngLats The geographical locations on the map corresponding to * a [touch event's `touches`](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/touches) * property. */ /** * @typedef {Object} MapBoxZoomEvent * @property {MouseEvent} originalEvent * @property {LngLatBounds} boxZoomBounds The bounding box of the "box zoom" interaction. * This property is only provided for `boxzoomend` events. */ /** * A `MapDataEvent` object is emitted with the {@link Map.event:data} * and {@link Map.event:dataloading} events. Possible values for * `dataType`s are: * * - `'source'`: The non-tile data associated with any source * - `'style'`: The [style](https://www.mapbox.com/mapbox-gl-style-spec/) used by the map * * @typedef {Object} MapDataEvent * @property {string} type The event type. * @property {string} dataType The type of data that has changed. One of `'source'`, `'style'`. * @property {boolean} [isSourceLoaded] True if the event has a `dataType` of `source` and the source has no outstanding network requests. * @property {Object} [source] The [style spec representation of the source](https://www.mapbox.com/mapbox-gl-style-spec/#sources) if the event has a `dataType` of `source`. * @property {string} [sourceDataType] Included if the event has a `dataType` of `source` and the event signals * that internal data has been received or changed. Possible values are `metadata` and `content`. * @property {Object} [tile] The tile being loaded or changed, if the event has a `dataType` of `source` and * the event is related to loading of a tile. * @property {Coordinate} [coord] The coordinate of the tile if the event has a `dataType` of `source` and * the event is related to loading of a tile. */ },{}],244:[function(require,module,exports){ 'use strict';// var DOM = require('../../util/dom'); var LngLatBounds = require('../../geo/lng_lat_bounds'); var util = require('../../util/util'); var window = require('../../util/window'); /** * The `BoxZoomHandler` allows the user to zoom the map to fit within a bounding box. * The bounding box is defined by clicking and holding `shift` while dragging the cursor. * * @param {Map} map The Mapbox GL JS map to add the handler to. */ var BoxZoomHandler = function BoxZoomHandler(map ) { this._map = map; this._el = map.getCanvasContainer(); this._container = map.getContainer(); util.bindAll([ '_onMouseDown', '_onMouseMove', '_onMouseUp', '_onKeyDown' ], this); }; /** * Returns a Boolean indicating whether the "box zoom" interaction is enabled. * * @returns {boolean} `true` if the "box zoom" interaction is enabled. */ BoxZoomHandler.prototype.isEnabled = function isEnabled () { return !!this._enabled; }; /** * Returns a Boolean indicating whether the "box zoom" interaction is active, i.e. currently being used. * * @returns {boolean} `true` if the "box zoom" interaction is active. */ BoxZoomHandler.prototype.isActive = function isActive () { return !!this._active; }; /** * Enables the "box zoom" interaction. * * @example * map.boxZoom.enable(); */ BoxZoomHandler.prototype.enable = function enable () { if (this.isEnabled()) { return; } // the event listeners for the DragPanHandler have to fire _after_ the event listener for BoxZoomHandler in order, // for the DragPanHandler's check on map.boxZoom.isActive() to tell whether or not to ignore a keydown event // so this makes sure the firing order is preserved if the BoxZoomHandler is enabled after the DragPanHandler. if (this._map.dragPan) { this._map.dragPan.disable(); } this._el.addEventListener('mousedown', this._onMouseDown, false); if (this._map.dragPan) { this._map.dragPan.enable(); } this._enabled = true; }; /** * Disables the "box zoom" interaction. * * @example * map.boxZoom.disable(); */ BoxZoomHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._el.removeEventListener('mousedown', this._onMouseDown); this._enabled = false; }; BoxZoomHandler.prototype._onMouseDown = function _onMouseDown (e ) { if (!(e.shiftKey && e.button === 0)) { return; } window.document.addEventListener('mousemove', this._onMouseMove, false); window.document.addEventListener('keydown', this._onKeyDown, false); window.document.addEventListener('mouseup', this._onMouseUp, false); DOM.disableDrag(); this._startPos = DOM.mousePos(this._el, e); this._active = true; }; BoxZoomHandler.prototype._onMouseMove = function _onMouseMove (e ) { var p0 = this._startPos, p1 = DOM.mousePos(this._el, e); if (!this._box) { this._box = DOM.create('div', 'mapboxgl-boxzoom', this._container); this._container.classList.add('mapboxgl-crosshair'); this._fireEvent('boxzoomstart', e); } var minX = Math.min(p0.x, p1.x), maxX = Math.max(p0.x, p1.x), minY = Math.min(p0.y, p1.y), maxY = Math.max(p0.y, p1.y); DOM.setTransform(this._box, ("translate(" + minX + "px," + minY + "px)")); this._box.style.width = (maxX - minX) + "px"; this._box.style.height = (maxY - minY) + "px"; }; BoxZoomHandler.prototype._onMouseUp = function _onMouseUp (e ) { if (e.button !== 0) { return; } var p0 = this._startPos, p1 = DOM.mousePos(this._el, e), bounds = new LngLatBounds() .extend(this._map.unproject(p0)) .extend(this._map.unproject(p1)); this._finish(); if (p0.x === p1.x && p0.y === p1.y) { this._fireEvent('boxzoomcancel', e); } else { this._map .fitBounds(bounds, {linear: true}) .fire('boxzoomend', { originalEvent: e, boxZoomBounds: bounds }); } }; BoxZoomHandler.prototype._onKeyDown = function _onKeyDown (e ) { if (e.keyCode === 27) { this._finish(); this._fireEvent('boxzoomcancel', e); } }; BoxZoomHandler.prototype._finish = function _finish () { this._active = false; window.document.removeEventListener('mousemove', this._onMouseMove, false); window.document.removeEventListener('keydown', this._onKeyDown, false); window.document.removeEventListener('mouseup', this._onMouseUp, false); this._container.classList.remove('mapboxgl-crosshair'); if (this._box) { DOM.remove(this._box); this._box = (null ); } DOM.enableDrag(); }; BoxZoomHandler.prototype._fireEvent = function _fireEvent (type , e ) { return this._map.fire(type, { originalEvent: e }); }; module.exports = BoxZoomHandler; },{"../../geo/lng_lat_bounds":68,"../../util/dom":264,"../../util/util":280,"../../util/window":259}],245:[function(require,module,exports){ 'use strict';// var util = require('../../util/util'); /** * The `DoubleClickZoomHandler` allows the user to zoom the map at a point by * double clicking. * * @param {Map} map The Mapbox GL JS map to add the handler to. */ var DoubleClickZoomHandler = function DoubleClickZoomHandler(map ) { this._map = map; util.bindAll([ '_onDblClick', '_onZoomEnd' ], this); }; /** * Returns a Boolean indicating whether the "double click to zoom" interaction is enabled. * * @returns {boolean} `true` if the "double click to zoom" interaction is enabled. */ DoubleClickZoomHandler.prototype.isEnabled = function isEnabled () { return !!this._enabled; }; /** * Returns a Boolean indicating whether the "double click to zoom" interaction is active, i.e. currently being used. * * @returns {boolean} `true` if the "double click to zoom" interaction is active. */ DoubleClickZoomHandler.prototype.isActive = function isActive () { return !!this._active; }; /** * Enables the "double click to zoom" interaction. * * @example * map.doubleClickZoom.enable(); */ DoubleClickZoomHandler.prototype.enable = function enable () { if (this.isEnabled()) { return; } this._map.on('dblclick', this._onDblClick); this._enabled = true; }; /** * Disables the "double click to zoom" interaction. * * @example * map.doubleClickZoom.disable(); */ DoubleClickZoomHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._map.off('dblclick', this._onDblClick); this._enabled = false; }; DoubleClickZoomHandler.prototype._onDblClick = function _onDblClick (e ) { this._active = true; this._map.on('zoomend', this._onZoomEnd); this._map.zoomTo( this._map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1), {around: e.lngLat}, e ); }; DoubleClickZoomHandler.prototype._onZoomEnd = function _onZoomEnd () { this._active = false; this._map.off('zoomend', this._onZoomEnd); }; module.exports = DoubleClickZoomHandler; },{"../../util/util":280}],246:[function(require,module,exports){ 'use strict';// var DOM = require('../../util/dom'); var util = require('../../util/util'); var window = require('../../util/window'); var browser = require('../../util/browser'); var inertiaLinearity = 0.3, inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1), inertiaMaxSpeed = 1400, // px/s inertiaDeceleration = 2500; // px/s^2 /** * The `DragPanHandler` allows the user to pan the map by clicking and dragging * the cursor. * * @param {Map} map The Mapbox GL JS map to add the handler to. */ var DragPanHandler = function DragPanHandler(map ) { this._map = map; this._el = map.getCanvasContainer(); util.bindAll([ '_onDown', '_onMove', '_onUp', '_onTouchEnd', '_onMouseUp', '_onDragFrame', '_onDragFinished' ], this); }; /** * Returns a Boolean indicating whether the "drag to pan" interaction is enabled. * * @returns {boolean} `true` if the "drag to pan" interaction is enabled. */ DragPanHandler.prototype.isEnabled = function isEnabled () { return !!this._enabled; }; /** * Returns a Boolean indicating whether the "drag to pan" interaction is active, i.e. currently being used. * * @returns {boolean} `true` if the "drag to pan" interaction is active. */ DragPanHandler.prototype.isActive = function isActive () { return !!this._active; }; /** * Enables the "drag to pan" interaction. * * @example * map.dragPan.enable(); */ DragPanHandler.prototype.enable = function enable () { if (this.isEnabled()) { return; } this._el.classList.add('mapboxgl-touch-drag-pan'); this._el.addEventListener('mousedown', this._onDown); this._el.addEventListener('touchstart', this._onDown); this._enabled = true; }; /** * Disables the "drag to pan" interaction. * * @example * map.dragPan.disable(); */ DragPanHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._el.classList.remove('mapboxgl-touch-drag-pan'); this._el.removeEventListener('mousedown', this._onDown); this._el.removeEventListener('touchstart', this._onDown); this._enabled = false; }; DragPanHandler.prototype._onDown = function _onDown (e ) { if (this._ignoreEvent(e)) { return; } if (this.isActive()) { return; } if (e.touches) { window.document.addEventListener('touchmove', this._onMove); window.document.addEventListener('touchend', this._onTouchEnd); } else { window.document.addEventListener('mousemove', this._onMove); window.document.addEventListener('mouseup', this._onMouseUp); } /* Deactivate DragPan when the window looses focus. Otherwise if a mouseup occurs when the window isn't in focus, DragPan will still be active even though the mouse is no longer pressed. */ window.addEventListener('blur', this._onMouseUp); this._active = false; this._previousPos = DOM.mousePos(this._el, e); this._inertia = [[browser.now(), this._previousPos]]; }; DragPanHandler.prototype._onMove = function _onMove (e ) { if (this._ignoreEvent(e)) { return; } this._lastMoveEvent = e; e.preventDefault(); var pos = DOM.mousePos(this._el, e); this._drainInertiaBuffer(); this._inertia.push([browser.now(), pos]); // if the dragging animation was interrupted (e.g. by another handler), // we need to reestablish a _previousPos before we can resume dragging if (!this._previousPos) { this._previousPos = pos; return; } this._pos = pos; if (!this.isActive()) { // we treat the first move event (rather than the mousedown event) // as the start of the drag this._active = true; this._map.moving = true; this._fireEvent('dragstart', e); this._fireEvent('movestart', e); this._map._startAnimation(this._onDragFrame, this._onDragFinished); } // ensure a new render frame is scheduled this._map._update(); }; /** * Called in each render frame while dragging is happening. * @private */ DragPanHandler.prototype._onDragFrame = function _onDragFrame (tr ) { var e = this._lastMoveEvent; if (!e) { return; } tr.setLocationAtPoint(tr.pointLocation(this._previousPos), this._pos); this._fireEvent('drag', e); this._fireEvent('move', e); this._previousPos = this._pos; delete this._lastMoveEvent; }; /** * Called when dragging stops. * @private */ DragPanHandler.prototype._onDragFinished = function _onDragFinished (e ) { var this$1 = this; if (!this.isActive()) { return; } this._active = false; delete this._lastMoveEvent; delete this._previousPos; delete this._pos; this._fireEvent('dragend', e); this._drainInertiaBuffer(); var finish = function () { this$1._map.moving = false; this$1._fireEvent('moveend', e); }; var inertia = this._inertia; if (inertia.length < 2) { finish(); return; } var last = inertia[inertia.length - 1], first = inertia[0], flingOffset = last[1].sub(first[1]), flingDuration = (last[0] - first[0]) / 1000; if (flingDuration === 0 || last[1].equals(first[1])) { finish(); return; } // calculate px/s velocity & adjust for increased initial animation speed when easing out var velocity = flingOffset.mult(inertiaLinearity / flingDuration); var speed = velocity.mag(); // px/s if (speed > inertiaMaxSpeed) { speed = inertiaMaxSpeed; velocity._unit()._mult(speed); } var duration = speed / (inertiaDeceleration * inertiaLinearity), offset = velocity.mult(-duration / 2); this._map.panBy(offset, { duration: duration * 1000, easing: inertiaEasing, noMoveStart: true }, { originalEvent: e }); }; DragPanHandler.prototype._onUp = function _onUp (e ) { this._onDragFinished(e); }; DragPanHandler.prototype._onMouseUp = function _onMouseUp (e ) { if (this._ignoreEvent(e)) { return; } this._onUp(e); window.document.removeEventListener('mousemove', this._onMove); window.document.removeEventListener('mouseup', this._onMouseUp); window.removeEventListener('blur', this._onMouseUp); }; DragPanHandler.prototype._onTouchEnd = function _onTouchEnd (e ) { if (this._ignoreEvent(e)) { return; } this._onUp(e); window.document.removeEventListener('touchmove', this._onMove); window.document.removeEventListener('touchend', this._onTouchEnd); }; DragPanHandler.prototype._fireEvent = function _fireEvent (type , e ) { return this._map.fire(type, e ? { originalEvent: e } : {}); }; DragPanHandler.prototype._ignoreEvent = function _ignoreEvent (e ) { var map = this._map; if (map.boxZoom && map.boxZoom.isActive()) { return true; } if (map.dragRotate && map.dragRotate.isActive()) { return true; } if (e.touches) { return (e.touches.length > 1); } else { if (e.ctrlKey) { return true; } return e.type !== 'mousemove' && e.button && e.button !== 0; // left button } }; DragPanHandler.prototype._drainInertiaBuffer = function _drainInertiaBuffer () { var inertia = this._inertia, now = browser.now(), cutoff = 160; // msec while (inertia.length > 0 && now - inertia[0][0] > cutoff) { inertia.shift(); } }; module.exports = DragPanHandler; },{"../../util/browser":257,"../../util/dom":264,"../../util/util":280,"../../util/window":259}],247:[function(require,module,exports){ 'use strict';// var DOM = require('../../util/dom'); var util = require('../../util/util'); var window = require('../../util/window'); var browser = require('../../util/browser'); var inertiaLinearity = 0.25, inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1), inertiaMaxSpeed = 180, // deg/s inertiaDeceleration = 720; // deg/s^2 /** * The `DragRotateHandler` allows the user to rotate the map by clicking and * dragging the cursor while holding the right mouse button or `ctrl` key. * * @param {Map} map The Mapbox GL JS map to add the handler to. * @param {Object} [options] * @param {number} [options.bearingSnap] The threshold, measured in degrees, that determines when the map's * bearing will snap to north. * @param {bool} [options.pitchWithRotate=true] Control the map pitch in addition to the bearing */ var DragRotateHandler = function DragRotateHandler(map , options ) { this._map = map; this._el = options.element || map.getCanvasContainer(); this._button = options.button || 'right'; this._bearingSnap = options.bearingSnap || 0; this._pitchWithRotate = options.pitchWithRotate !== false; util.bindAll([ '_onDown', '_onMove', '_onUp', '_onDragFrame', '_onDragFinished' ], this); }; /** * Returns a Boolean indicating whether the "drag to rotate" interaction is enabled. * * @returns {boolean} `true` if the "drag to rotate" interaction is enabled. */ DragRotateHandler.prototype.isEnabled = function isEnabled () { return !!this._enabled; }; /** * Returns a Boolean indicating whether the "drag to rotate" interaction is active, i.e. currently being used. * * @returns {boolean} `true` if the "drag to rotate" interaction is active. */ DragRotateHandler.prototype.isActive = function isActive () { return !!this._active; }; /** * Enables the "drag to rotate" interaction. * * @example * map.dragRotate.enable(); */ DragRotateHandler.prototype.enable = function enable () { if (this.isEnabled()) { return; } this._el.addEventListener('mousedown', this._onDown); this._enabled = true; }; /** * Disables the "drag to rotate" interaction. * * @example * map.dragRotate.disable(); */ DragRotateHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._el.removeEventListener('mousedown', this._onDown); this._enabled = false; }; DragRotateHandler.prototype._onDown = function _onDown (e ) { if (this._map.boxZoom && this._map.boxZoom.isActive()) { return; } if (this._map.dragPan && this._map.dragPan.isActive()) { return; } if (this.isActive()) { return; } if (this._button === 'right') { var button = (e.ctrlKey ? 0 : 2); // ? ctrl+left button : right button var eventButton = e.button; if (typeof window.InstallTrigger !== 'undefined' && e.button === 2 && e.ctrlKey && window.navigator.platform.toUpperCase().indexOf('MAC') >= 0) { // Fix for https://github.com/mapbox/mapbox-gl-js/issues/3131: // Firefox (detected by InstallTrigger) on Mac determines e.button = 2 when // using Control + left click eventButton = 0; } if (eventButton !== button) { return; } } else { if (e.ctrlKey || e.button !== 0) { return; } } DOM.disableDrag(); window.document.addEventListener('mousemove', this._onMove, {capture: true}); window.document.addEventListener('mouseup', this._onUp); /* Deactivate DragRotate when the window looses focus. Otherwise if a mouseup occurs when the window isn't in focus, DragRotate will still be active even though the mouse is no longer pressed. */ window.addEventListener('blur', this._onUp); this._active = false; this._inertia = [[browser.now(), this._map.getBearing()]]; this._previousPos = DOM.mousePos(this._el, e); this._center = this._map.transform.centerPoint; // Center of rotation e.preventDefault(); }; DragRotateHandler.prototype._onMove = function _onMove (e ) { this._lastMoveEvent = e; var pos = DOM.mousePos(this._el, e); // if the dragging animation was interrupted (e.g. by another handler), // we need to reestablish a _previousPos before we can resume dragging if (!this._previousPos) { this._previousPos = pos; return; } this._pos = pos; if (!this.isActive()) { this._active = true; this._map.moving = true; this._fireEvent('rotatestart', e); this._fireEvent('movestart', e); if (this._pitchWithRotate) { this._fireEvent('pitchstart', e); } this._map._startAnimation(this._onDragFrame, this._onDragFinished); } // ensure a new render frame is scheduled this._map._update(); }; DragRotateHandler.prototype._onUp = function _onUp (e ) { window.document.removeEventListener('mousemove', this._onMove, {capture: true}); window.document.removeEventListener('mouseup', this._onUp); window.removeEventListener('blur', this._onUp); DOM.enableDrag(); this._onDragFinished(e); }; DragRotateHandler.prototype._onDragFrame = function _onDragFrame (tr ) { var e = this._lastMoveEvent; if (!e) { return; } var p1 = this._previousPos, p2 = this._pos, bearingDiff = (p1.x - p2.x) * 0.8, pitchDiff = (p1.y - p2.y) * -0.5, bearing = tr.bearing - bearingDiff, pitch = tr.pitch - pitchDiff, inertia = this._inertia, last = inertia[inertia.length - 1]; this._drainInertiaBuffer(); inertia.push([browser.now(), this._map._normalizeBearing(bearing, last[1])]); tr.bearing = bearing; if (this._pitchWithRotate) { this._fireEvent('pitch', e); tr.pitch = pitch; } this._fireEvent('rotate', e); this._fireEvent('move', e); delete this._lastMoveEvent; this._previousPos = this._pos; }; DragRotateHandler.prototype._onDragFinished = function _onDragFinished (e ) { var this$1 = this; if (!this.isActive()) { return; } this._active = false; delete this._lastMoveEvent; delete this._previousPos; this._fireEvent('rotateend', e); this._drainInertiaBuffer(); var map = this._map, mapBearing = map.getBearing(), inertia = this._inertia; var finish = function () { if (Math.abs(mapBearing) < this$1._bearingSnap) { map.resetNorth({noMoveStart: true}, { originalEvent: e }); } else { this$1._map.moving = false; this$1._fireEvent('moveend', e); } if (this$1._pitchWithRotate) { this$1._fireEvent('pitchend', e); } }; if (inertia.length < 2) { finish(); return; } var first = inertia[0], last = inertia[inertia.length - 1], previous = inertia[inertia.length - 2]; var bearing = map._normalizeBearing(mapBearing, previous[1]); var flingDiff = last[1] - first[1], sign = flingDiff < 0 ? -1 : 1, flingDuration = (last[0] - first[0]) / 1000; if (flingDiff === 0 || flingDuration === 0) { finish(); return; } var speed = Math.abs(flingDiff * (inertiaLinearity / flingDuration)); // deg/s if (speed > inertiaMaxSpeed) { speed = inertiaMaxSpeed; } var duration = speed / (inertiaDeceleration * inertiaLinearity), offset = sign * speed * (duration / 2); bearing += offset; if (Math.abs(map._normalizeBearing(bearing, 0)) < this._bearingSnap) { bearing = map._normalizeBearing(0, bearing); } map.rotateTo(bearing, { duration: duration * 1000, easing: inertiaEasing, noMoveStart: true }, { originalEvent: e }); }; DragRotateHandler.prototype._fireEvent = function _fireEvent (type , e ) { return this._map.fire(type, e ? { originalEvent: e } : {}); }; DragRotateHandler.prototype._drainInertiaBuffer = function _drainInertiaBuffer () { var inertia = this._inertia, now = browser.now(), cutoff = 160; //msec while (inertia.length > 0 && now - inertia[0][0] > cutoff) { inertia.shift(); } }; module.exports = DragRotateHandler; },{"../../util/browser":257,"../../util/dom":264,"../../util/util":280,"../../util/window":259}],248:[function(require,module,exports){ 'use strict';// var util = require('../../util/util'); var panStep = 100, bearingStep = 15, pitchStep = 10; /** * The `KeyboardHandler` allows the user to zoom, rotate, and pan the map using * the following keyboard shortcuts: * * - `=` / `+`: Increase the zoom level by 1. * - `Shift-=` / `Shift-+`: Increase the zoom level by 2. * - `-`: Decrease the zoom level by 1. * - `Shift--`: Decrease the zoom level by 2. * - Arrow keys: Pan by 100 pixels. * - `Shift+⇢`: Increase the rotation by 15 degrees. * - `Shift+⇠`: Decrease the rotation by 15 degrees. * - `Shift+⇡`: Increase the pitch by 10 degrees. * - `Shift+⇣`: Decrease the pitch by 10 degrees. * * @param {Map} map The Mapbox GL JS map to add the handler to. */ var KeyboardHandler = function KeyboardHandler(map ) { this._map = map; this._el = map.getCanvasContainer(); util.bindAll([ '_onKeyDown' ], this); }; /** * Returns a Boolean indicating whether keyboard interaction is enabled. * * @returns {boolean} `true` if keyboard interaction is enabled. */ KeyboardHandler.prototype.isEnabled = function isEnabled () { return !!this._enabled; }; /** * Enables keyboard interaction. * * @example * map.keyboard.enable(); */ KeyboardHandler.prototype.enable = function enable () { if (this.isEnabled()) { return; } this._el.addEventListener('keydown', this._onKeyDown, false); this._enabled = true; }; /** * Disables keyboard interaction. * * @example * map.keyboard.disable(); */ KeyboardHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._el.removeEventListener('keydown', this._onKeyDown); this._enabled = false; }; KeyboardHandler.prototype._onKeyDown = function _onKeyDown (e ) { if (e.altKey || e.ctrlKey || e.metaKey) { return; } var zoomDir = 0; var bearingDir = 0; var pitchDir = 0; var xDir = 0; var yDir = 0; switch (e.keyCode) { case 61: case 107: case 171: case 187: zoomDir = 1; break; case 189: case 109: case 173: zoomDir = -1; break; case 37: if (e.shiftKey) { bearingDir = -1; } else { e.preventDefault(); xDir = -1; } break; case 39: if (e.shiftKey) { bearingDir = 1; } else { e.preventDefault(); xDir = 1; } break; case 38: if (e.shiftKey) { pitchDir = 1; } else { e.preventDefault(); yDir = -1; } break; case 40: if (e.shiftKey) { pitchDir = -1; } else { yDir = 1; e.preventDefault(); } break; default: return; } var map = this._map; var zoom = map.getZoom(); var easeOptions = { duration: 300, delayEndEvents: 500, easing: easeOut, zoom: zoomDir ? Math.round(zoom) + zoomDir * (e.shiftKey ? 2 : 1) : zoom, bearing: map.getBearing() + bearingDir * bearingStep, pitch: map.getPitch() + pitchDir * pitchStep, offset: [-xDir * panStep, -yDir * panStep], center: map.getCenter() }; map.easeTo(easeOptions, {originalEvent: e}); }; function easeOut(t) { return t * (2 - t); } module.exports = KeyboardHandler; },{"../../util/util":280}],249:[function(require,module,exports){ 'use strict';// var DOM = require('../../util/dom'); var util = require('../../util/util'); var browser = require('../../util/browser'); var window = require('../../util/window'); var interpolate = require('../../style-spec/util/interpolate').number; var LngLat = require('../../geo/lng_lat'); // deltaY value for mouse scroll wheel identification var wheelZoomDelta = 4.000244140625; // These magic numbers control the rate of zoom. Trackpad events fire at a greater // frequency than mouse scroll wheel, so reduce the zoom rate per wheel tick var defaultZoomRate = 1 / 100; var wheelZoomRate = 1 / 450; // upper bound on how much we scale the map in any single render frame; this // is used to limit zoom rate in the case of very fast scrolling var maxScalePerFrame = 2; var ua = window.navigator.userAgent.toLowerCase(), firefox = ua.indexOf('firefox') !== -1, safari = ua.indexOf('safari') !== -1 && ua.indexOf('chrom') === -1; /** * The `ScrollZoomHandler` allows the user to zoom the map by scrolling. * * @param {Map} map The Mapbox GL JS map to add the handler to. */ var ScrollZoomHandler = function ScrollZoomHandler(map ) { this._map = map; this._el = map.getCanvasContainer(); this._delta = 0; util.bindAll([ '_onWheel', '_onTimeout', '_onScrollFrame', '_onScrollFinished' ], this); }; /** * Returns a Boolean indicating whether the "scroll to zoom" interaction is enabled. * * @returns {boolean} `true` if the "scroll to zoom" interaction is enabled. */ ScrollZoomHandler.prototype.isEnabled = function isEnabled () { return !!this._enabled; }; ScrollZoomHandler.prototype.isActive = function isActive () { return !!this._active; }; /** * Enables the "scroll to zoom" interaction. * * @param {Object} [options] * @param {string} [options.around] If "center" is passed, map will zoom around center of map * * @example * map.scrollZoom.enable(); * @example * map.scrollZoom.enable({ around: 'center' }) */ ScrollZoomHandler.prototype.enable = function enable (options ) { if (this.isEnabled()) { return; } this._el.addEventListener('wheel', this._onWheel, false); this._el.addEventListener('mousewheel', this._onWheel, false); this._enabled = true; this._aroundCenter = options && options.around === 'center'; }; /** * Disables the "scroll to zoom" interaction. * * @example * map.scrollZoom.disable(); */ ScrollZoomHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._el.removeEventListener('wheel', this._onWheel); this._el.removeEventListener('mousewheel', this._onWheel); this._enabled = false; }; ScrollZoomHandler.prototype._onWheel = function _onWheel (e ) { var value = 0; if (e.type === 'wheel') { value = e.deltaY; // Firefox doubles the values on retina screens... // Remove `any` casts when https://github.com/facebook/flow/issues/4879 is fixed. if (firefox && e.deltaMode === (window.WheelEvent ).DOM_DELTA_PIXEL) { value /= browser.devicePixelRatio; } if (e.deltaMode === (window.WheelEvent ).DOM_DELTA_LINE) { value *= 40; } } else if (e.type === 'mousewheel') { value = -e.wheelDeltaY; if (safari) { value = value / 3; } } var now = browser.now(), timeDelta = now - (this._lastWheelEventTime || 0); this._lastWheelEventTime = now; if (value !== 0 && (value % wheelZoomDelta) === 0) { // This one is definitely a mouse wheel event. this._type = 'wheel'; } else if (value !== 0 && Math.abs(value) < 4) { // This one is definitely a trackpad event because it is so small. this._type = 'trackpad'; } else if (timeDelta > 400) { // This is likely a new scroll action. this._type = null; this._lastValue = value; // Start a timeout in case this was a singular event, and dely it by up to 40ms. this._timeout = setTimeout(this._onTimeout, 40, e); } else if (!this._type) { // This is a repeating event, but we don't know the type of event just yet. // If the delta per time is small, we assume it's a fast trackpad; otherwise we switch into wheel mode. this._type = (Math.abs(timeDelta * value) < 200) ? 'trackpad' : 'wheel'; // Make sure our delayed event isn't fired again, because we accumulate // the previous event (which was less than 40ms ago) into this event. if (this._timeout) { clearTimeout(this._timeout); this._timeout = null; value += this._lastValue; } } // Slow down zoom if shift key is held for more precise zooming if (e.shiftKey && value) { value = value / 4; } // Only fire the callback if we actually know what type of scrolling device the user uses. if (this._type) { this._lastWheelEvent = e; this._delta -= value; if (!this.isActive()) { this._start(e); } } e.preventDefault(); }; ScrollZoomHandler.prototype._onTimeout = function _onTimeout (initialEvent ) { this._type = 'wheel'; this._delta -= this._lastValue; if (!this.isActive()) { this._start(initialEvent); } }; ScrollZoomHandler.prototype._start = function _start (e ) { if (!this._delta) { return; } this._active = true; this._map.moving = true; this._map.zooming = true; this._map.fire('movestart', {originalEvent: e}); this._map.fire('zoomstart', {originalEvent: e}); clearTimeout(this._finishTimeout); var pos = DOM.mousePos(this._el, e); this._around = LngLat.convert(this._aroundCenter ? this._map.getCenter() : this._map.unproject(pos)); this._aroundPoint = this._map.transform.locationPoint(this._around); this._map._startAnimation(this._onScrollFrame, this._onScrollFinished); }; ScrollZoomHandler.prototype._onScrollFrame = function _onScrollFrame (tr ) { if (!this.isActive()) { return; } // if we've had scroll events since the last render frame, consume the // accumulated delta, and update the target zoom level accordingly if (this._delta !== 0) { // For trackpad events and single mouse wheel ticks, use the default zoom rate var zoomRate = (this._type === 'wheel' && Math.abs(this._delta) > wheelZoomDelta) ? wheelZoomRate : defaultZoomRate; // Scale by sigmoid of scroll wheel delta. var scale = maxScalePerFrame / (1 + Math.exp(-Math.abs(this._delta * zoomRate))); if (this._delta < 0 && scale !== 0) { scale = 1 / scale; } var fromScale = typeof this._targetZoom === 'number' ? tr.zoomScale(this._targetZoom) : tr.scale; this._targetZoom = Math.min(tr.maxZoom, Math.max(tr.minZoom, tr.scaleZoom(fromScale * scale))); // if this is a mouse wheel, refresh the starting zoom and easing // function we're using to smooth out the zooming between wheel // events if (this._type === 'wheel') { this._startZoom = tr.zoom; this._easing = this._smoothOutEasing(200); } this._delta = 0; } if (this._type === 'wheel') { var t = Math.min((browser.now() - this._lastWheelEventTime) / 200, 1); var k = this._easing(t); tr.zoom = interpolate(this._startZoom, this._targetZoom, k); if (t === 1) { this._map.stop(); } } else { tr.zoom = this._targetZoom; this._map.stop(); } tr.setLocationAtPoint(this._around, this._aroundPoint); this._map.fire('move', {originalEvent: this._lastWheelEvent}); this._map.fire('zoom', {originalEvent: this._lastWheelEvent}); }; ScrollZoomHandler.prototype._onScrollFinished = function _onScrollFinished () { var this$1 = this; if (!this.isActive()) { return; } this._active = false; this._finishTimeout = setTimeout(function () { this$1._map.moving = false; this$1._map.zooming = false; this$1._map.fire('zoomend'); this$1._map.fire('moveend'); delete this$1._targetZoom; }, 200); }; ScrollZoomHandler.prototype._smoothOutEasing = function _smoothOutEasing (duration ) { var easing = util.ease; if (this._prevEase) { var ease = this._prevEase, t = (browser.now() - ease.start) / ease.duration, speed = ease.easing(t + 0.01) - ease.easing(t), // Quick hack to make new bezier that is continuous with last x = 0.27 / Math.sqrt(speed * speed + 0.0001) * 0.01, y = Math.sqrt(0.27 * 0.27 - x * x); easing = util.bezier(x, y, 0.25, 1); } this._prevEase = { start: browser.now(), duration: duration, easing: easing }; return easing; }; module.exports = ScrollZoomHandler; },{"../../geo/lng_lat":67,"../../style-spec/util/interpolate":163,"../../util/browser":257,"../../util/dom":264,"../../util/util":280,"../../util/window":259}],250:[function(require,module,exports){ 'use strict';// var DOM = require('../../util/dom'); var util = require('../../util/util'); var window = require('../../util/window'); var browser = require('../../util/browser'); var inertiaLinearity = 0.15, inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1), inertiaDeceleration = 12, // scale / s^2 inertiaMaxSpeed = 2.5, // scale / s significantScaleThreshold = 0.15, significantRotateThreshold = 10; /** * The `TouchZoomRotateHandler` allows the user to zoom and rotate the map by * pinching on a touchscreen. * * @param {Map} map The Mapbox GL JS map to add the handler to. */ var TouchZoomRotateHandler = function TouchZoomRotateHandler(map ) { this._map = map; this._el = map.getCanvasContainer(); util.bindAll([ '_onStart', '_onMove', '_onEnd' ], this); }; /** * Returns a Boolean indicating whether the "pinch to rotate and zoom" interaction is enabled. * * @returns {boolean} `true` if the "pinch to rotate and zoom" interaction is enabled. */ TouchZoomRotateHandler.prototype.isEnabled = function isEnabled () { return !!this._enabled; }; /** * Enables the "pinch to rotate and zoom" interaction. * * @param {Object} [options] * @param {string} [options.around] If "center" is passed, map will zoom around the center * * @example * map.touchZoomRotate.enable(); * @example * map.touchZoomRotate.enable({ around: 'center' }); */ TouchZoomRotateHandler.prototype.enable = function enable (options ) { if (this.isEnabled()) { return; } this._el.classList.add('mapboxgl-touch-zoom-rotate'); this._el.addEventListener('touchstart', this._onStart, false); this._enabled = true; this._aroundCenter = options && options.around === 'center'; }; /** * Disables the "pinch to rotate and zoom" interaction. * * @example * map.touchZoomRotate.disable(); */ TouchZoomRotateHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._el.classList.remove('mapboxgl-touch-zoom-rotate'); this._el.removeEventListener('touchstart', this._onStart); this._enabled = false; }; /** * Disables the "pinch to rotate" interaction, leaving the "pinch to zoom" * interaction enabled. * * @example * map.touchZoomRotate.disableRotation(); */ TouchZoomRotateHandler.prototype.disableRotation = function disableRotation () { this._rotationDisabled = true; }; /** * Enables the "pinch to rotate" interaction. * * @example * map.touchZoomRotate.enable(); * map.touchZoomRotate.enableRotation(); */ TouchZoomRotateHandler.prototype.enableRotation = function enableRotation () { this._rotationDisabled = false; }; TouchZoomRotateHandler.prototype._onStart = function _onStart (e ) { if (e.touches.length !== 2) { return; } var p0 = DOM.mousePos(this._el, e.touches[0]), p1 = DOM.mousePos(this._el, e.touches[1]); this._startVec = p0.sub(p1); this._startScale = this._map.transform.scale; this._startBearing = this._map.transform.bearing; this._gestureIntent = undefined; this._inertia = []; window.document.addEventListener('touchmove', this._onMove, false); window.document.addEventListener('touchend', this._onEnd, false); }; TouchZoomRotateHandler.prototype._onMove = function _onMove (e ) { if (e.touches.length !== 2) { return; } var p0 = DOM.mousePos(this._el, e.touches[0]), p1 = DOM.mousePos(this._el, e.touches[1]), p = p0.add(p1).div(2), vec = p0.sub(p1), scale = vec.mag() / this._startVec.mag(), bearing = this._rotationDisabled ? 0 : vec.angleWith(this._startVec) * 180 / Math.PI, map = this._map; // Determine 'intent' by whichever threshold is surpassed first, // then keep that state for the duration of this gesture. if (!this._gestureIntent) { var scalingSignificantly = (Math.abs(1 - scale) > significantScaleThreshold), rotatingSignificantly = (Math.abs(bearing) > significantRotateThreshold); if (rotatingSignificantly) { this._gestureIntent = 'rotate'; } else if (scalingSignificantly) { this._gestureIntent = 'zoom'; } if (this._gestureIntent) { this._startVec = vec; this._startScale = map.transform.scale; this._startBearing = map.transform.bearing; } } else { var param = { duration: 0, around: map.unproject(p) }; if (this._gestureIntent === 'rotate') { param.bearing = this._startBearing + bearing; } if (this._gestureIntent === 'zoom' || this._gestureIntent === 'rotate') { param.zoom = map.transform.scaleZoom(this._startScale * scale); } map.stop(); this._drainInertiaBuffer(); this._inertia.push([browser.now(), scale, p]); map.easeTo(param, { originalEvent: e }); } e.preventDefault(); }; TouchZoomRotateHandler.prototype._onEnd = function _onEnd (e ) { window.document.removeEventListener('touchmove', this._onMove); window.document.removeEventListener('touchend', this._onEnd); this._drainInertiaBuffer(); var inertia = this._inertia, map = this._map; if (inertia.length < 2) { map.snapToNorth({}, { originalEvent: e }); return; } var last = inertia[inertia.length - 1], first = inertia[0], lastScale = map.transform.scaleZoom(this._startScale * last[1]), firstScale = map.transform.scaleZoom(this._startScale * first[1]), scaleOffset = lastScale - firstScale, scaleDuration = (last[0] - first[0]) / 1000, p = last[2]; if (scaleDuration === 0 || lastScale === firstScale) { map.snapToNorth({}, { originalEvent: e }); return; } // calculate scale/s speed and adjust for increased initial animation speed when easing var speed = scaleOffset * inertiaLinearity / scaleDuration; // scale/s if (Math.abs(speed) > inertiaMaxSpeed) { if (speed > 0) { speed = inertiaMaxSpeed; } else { speed = -inertiaMaxSpeed; } } var duration = Math.abs(speed / (inertiaDeceleration * inertiaLinearity)) * 1000; var targetScale = lastScale + speed * duration / 2000; if (targetScale < 0) { targetScale = 0; } map.easeTo({ zoom: targetScale, duration: duration, easing: inertiaEasing, around: this._aroundCenter ? map.getCenter() : map.unproject(p) }, { originalEvent: e }); }; TouchZoomRotateHandler.prototype._drainInertiaBuffer = function _drainInertiaBuffer () { var inertia = this._inertia, now = browser.now(), cutoff = 160; // msec while (inertia.length > 2 && now - inertia[0][0] > cutoff) { inertia.shift(); } }; module.exports = TouchZoomRotateHandler; },{"../../util/browser":257,"../../util/dom":264,"../../util/util":280,"../../util/window":259}],251:[function(require,module,exports){ 'use strict';// var util = require('../util/util'); var window = require('../util/window'); var throttle = require('../util/throttle'); /* * Adds the map's position to its page's location hash. * Passed as an option to the map object. * * @returns {Hash} `this` */ var Hash = function Hash() { util.bindAll([ '_onHashChange', '_updateHash' ], this); // Mobile Safari doesn't allow updating the hash more than 100 times per 30 seconds. this._updateHash = throttle(this._updateHashUnthrottled.bind(this), 30 * 1000 / 100); }; /* * Map element to listen for coordinate changes * * @param {Object} map * @returns {Hash} `this` */ Hash.prototype.addTo = function addTo (map ) { this._map = map; window.addEventListener('hashchange', this._onHashChange, false); this._map.on('moveend', this._updateHash); return this; }; /* * Removes hash * * @returns {Popup} `this` */ Hash.prototype.remove = function remove () { window.removeEventListener('hashchange', this._onHashChange, false); this._map.off('moveend', this._updateHash); delete this._map; return this; }; Hash.prototype.getHashString = function getHashString (mapFeedback ) { var center = this._map.getCenter(), zoom = Math.round(this._map.getZoom() * 100) / 100, // derived from equation: 512px * 2^z / 360 / 10^d < 0.5px precision = Math.ceil((zoom * Math.LN2 + Math.log(512 / 360 / 0.5)) / Math.LN10), m = Math.pow(10, precision), lng = Math.round(center.lng * m) / m, lat = Math.round(center.lat * m) / m, bearing = this._map.getBearing(), pitch = this._map.getPitch(); var hash = ''; if (mapFeedback) { // new map feedback site has some constraints that don't allow // us to use the same hash format as we do for the Map hash option. hash += "#/" + lng + "/" + lat + "/" + zoom; } else { hash += "#" + zoom + "/" + lat + "/" + lng; } if (bearing || pitch) { hash += (("/" + (Math.round(bearing * 10) / 10))); } if (pitch) { hash += (("/" + (Math.round(pitch)))); } return hash; }; Hash.prototype._onHashChange = function _onHashChange () { var loc = window.location.hash.replace('#', '').split('/'); if (loc.length >= 3) { this._map.jumpTo({ center: [+loc[2], +loc[1]], zoom: +loc[0], bearing: +(loc[3] || 0), pitch: +(loc[4] || 0) }); return true; } return false; }; Hash.prototype._updateHashUnthrottled = function _updateHashUnthrottled () { var hash = this.getHashString(); window.history.replaceState('', '', hash); }; module.exports = Hash; },{"../util/throttle":277,"../util/util":280,"../util/window":259}],252:[function(require,module,exports){ 'use strict';// var util = require('../util/util'); var browser = require('../util/browser'); var window = require('../util/window'); var ref = require('../util/window'); var HTMLImageElement = ref.HTMLImageElement; var HTMLElement = ref.HTMLElement; var DOM = require('../util/dom'); var ajax = require('../util/ajax'); var Style = require('../style/style'); var EvaluationParameters = require('../style/evaluation_parameters'); var Painter = require('../render/painter'); var Transform = require('../geo/transform'); var Hash = require('./hash'); var bindHandlers = require('./bind_handlers'); var Camera = require('./camera'); var LngLat = require('../geo/lng_lat'); var LngLatBounds = require('../geo/lng_lat_bounds'); var Point = require('@mapbox/point-geometry'); var AttributionControl = require('./control/attribution_control'); var LogoControl = require('./control/logo_control'); var isSupported = require('@mapbox/mapbox-gl-supported'); var ref$1 = require('../util/image'); var RGBAImage = ref$1.RGBAImage; require('./events'); // Pull in for documentation.js /* eslint-disable no-use-before-define */ /* eslint-enable no-use-before-define */ var defaultMinZoom = 0; var defaultMaxZoom = 22; var defaultOptions = { center: [0, 0], zoom: 0, bearing: 0, pitch: 0, minZoom: defaultMinZoom, maxZoom: defaultMaxZoom, interactive: true, scrollZoom: true, boxZoom: true, dragRotate: true, dragPan: true, keyboard: true, doubleClickZoom: true, touchZoomRotate: true, bearingSnap: 7, hash: false, attributionControl: true, failIfMajorPerformanceCaveat: false, preserveDrawingBuffer: false, trackResize: true, renderWorldCopies: true, refreshExpiredTiles: true, maxTileCacheSize: null, transformRequest: null, fadeDuration: 300 }; /** * The `Map` object represents the map on your page. It exposes methods * and properties that enable you to programmatically change the map, * and fires events as users interact with it. * * You create a `Map` by specifying a `container` and other options. * Then Mapbox GL JS initializes the map on the page and returns your `Map` * object. * * @extends Evented * @param {Object} options * @param {HTMLElement|string} options.container The HTML element in which Mapbox GL JS will render the map, or the element's string `id`. The specified element must have no children. * @param {number} [options.minZoom=0] The minimum zoom level of the map (0-24). * @param {number} [options.maxZoom=22] The maximum zoom level of the map (0-24). * @param {Object|string} [options.style] The map's Mapbox style. This must be an a JSON object conforming to * the schema described in the [Mapbox Style Specification](https://mapbox.com/mapbox-gl-style-spec/), or a URL to * such JSON. * * To load a style from the Mapbox API, you can use a URL of the form `mapbox://styles/:owner/:style`, * where `:owner` is your Mapbox account name and `:style` is the style ID. Or you can use one of the following * [the predefined Mapbox styles](https://www.mapbox.com/maps/): * * * `mapbox://styles/mapbox/streets-v9` * * `mapbox://styles/mapbox/outdoors-v9` * * `mapbox://styles/mapbox/light-v9` * * `mapbox://styles/mapbox/dark-v9` * * `mapbox://styles/mapbox/satellite-v9` * * `mapbox://styles/mapbox/satellite-streets-v9` * * Tilesets hosted with Mapbox can be style-optimized if you append `?optimize=true` to the end of your style URL, like `mapbox://styles/mapbox/streets-v9?optimize=true`. * Learn more about style-optimized vector tiles in our [API documentation](https://www.mapbox.com/api-documentation/#retrieve-tiles). * * @param {boolean} [options.hash=false] If `true`, the map's position (zoom, center latitude, center longitude, bearing, and pitch) will be synced with the hash fragment of the page's URL. * For example, `http://path/to/my/page.html#2.59/39.26/53.07/-24.1/60`. * @param {boolean} [options.interactive=true] If `false`, no mouse, touch, or keyboard listeners will be attached to the map, so it will not respond to interaction. * @param {number} [options.bearingSnap=7] The threshold, measured in degrees, that determines when the map's * bearing will snap to north. For example, with a `bearingSnap` of 7, if the user rotates * the map within 7 degrees of north, the map will automatically snap to exact north. * @param {boolean} [options.pitchWithRotate=true] If `false`, the map's pitch (tilt) control with "drag to rotate" interaction will be disabled. * @param {boolean} [options.attributionControl=true] If `true`, an {@link AttributionControl} will be added to the map. * @param {string} [options.logoPosition='bottom-left'] A string representing the position of the Mapbox wordmark on the map. Valid options are `top-left`,`top-right`, `bottom-left`, `bottom-right`. * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, map creation will fail if the performance of Mapbox * GL JS would be dramatically worse than expected (i.e. a software renderer would be used). * @param {boolean} [options.preserveDrawingBuffer=false] If `true`, the map's canvas can be exported to a PNG using `map.getCanvas().toDataURL()`. This is `false` by default as a performance optimization. * @param {boolean} [options.refreshExpiredTiles=true] If `false`, the map won't attempt to re-request tiles once they expire per their HTTP `cacheControl`/`expires` headers. * @param {LngLatBoundsLike} [options.maxBounds] If set, the map will be constrained to the given bounds. * @param {boolean|Object} [options.scrollZoom=true] If `true`, the "scroll to zoom" interaction is enabled. An `Object` value is passed as options to {@link ScrollZoomHandler#enable}. * @param {boolean} [options.boxZoom=true] If `true`, the "box zoom" interaction is enabled (see {@link BoxZoomHandler}). * @param {boolean} [options.dragRotate=true] If `true`, the "drag to rotate" interaction is enabled (see {@link DragRotateHandler}). * @param {boolean} [options.dragPan=true] If `true`, the "drag to pan" interaction is enabled (see {@link DragPanHandler}). * @param {boolean} [options.keyboard=true] If `true`, keyboard shortcuts are enabled (see {@link KeyboardHandler}). * @param {boolean} [options.doubleClickZoom=true] If `true`, the "double click to zoom" interaction is enabled (see {@link DoubleClickZoomHandler}). * @param {boolean|Object} [options.touchZoomRotate=true] If `true`, the "pinch to rotate and zoom" interaction is enabled. An `Object` value is passed as options to {@link TouchZoomRotateHandler#enable}. * @param {boolean} [options.trackResize=true] If `true`, the map will automatically resize when the browser window resizes. * @param {LngLatLike} [options.center=[0, 0]] The inital geographical centerpoint of the map. If `center` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `[0, 0]` Note: Mapbox GL uses longitude, latitude coordinate order (as opposed to latitude, longitude) to match GeoJSON. * @param {number} [options.zoom=0] The initial zoom level of the map. If `zoom` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`. * @param {number} [options.bearing=0] The initial bearing (rotation) of the map, measured in degrees counter-clockwise from north. If `bearing` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`. * @param {number} [options.pitch=0] The initial pitch (tilt) of the map, measured in degrees away from the plane of the screen (0-60). If `pitch` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`. * @param {boolean} [options.renderWorldCopies=true] If `true`, multiple copies of the world will be rendered, when zoomed out. * @param {number} [options.maxTileCacheSize=null] The maximum number of tiles stored in the tile cache for a given source. If omitted, the cache will be dynamically sized based on the current viewport. * @param {string} [options.localIdeographFontFamily=null] If specified, defines a CSS font-family * for locally overriding generation of glyphs in the 'CJK Unified Ideographs' and 'Hangul Syllables' ranges. * In these ranges, font settings from the map's style will be ignored, except for font-weight keywords (light/regular/medium/bold). * The purpose of this option is to avoid bandwidth-intensive glyph server requests. (see [Use locally generated ideographs](https://www.mapbox.com/mapbox-gl-js/example/local-ideographs)) * @param {RequestTransformFunction} [options.transformRequest=null] A callback run before the Map makes a request for an external URL. The callback can be used to modify the url, set headers, or set the credentials property for cross-origin requests. * Expected to return an object with a `url` property and optionally `headers` and `credentials` properties. * @param {boolean} [options.collectResourceTiming=false] If `true`, Resource Timing API information will be collected for requests made by GeoJSON and Vector Tile web workers (this information is normally inaccessible from the main Javascript thread). Information will be returned in a `resourceTiming` property of relevant `data` events. * @example * var map = new mapboxgl.Map({ * container: 'map', * center: [-122.420679, 37.772537], * zoom: 13, * style: style_object, * hash: true, * transformRequest: (url, resourceType)=> { * if(resourceType == 'Source' && url.startsWith('http://myHost')) { * return { * url: url.replace('http', 'https'), * headers: { 'my-custom-header': true}, * credentials: 'include' // Include cookies for cross-origin requests * } * } * } * }); * @see [Display a map](https://www.mapbox.com/mapbox-gl-js/examples/) */ var Map = (function (Camera) { function Map(options ) { options = util.extend({}, defaultOptions, options); if (options.minZoom != null && options.maxZoom != null && options.minZoom > options.maxZoom) { throw new Error("maxZoom must be greater than minZoom"); } var transform = new Transform(options.minZoom, options.maxZoom, options.renderWorldCopies); Camera.call(this, transform, options); this._interactive = options.interactive; this._maxTileCacheSize = options.maxTileCacheSize; this._failIfMajorPerformanceCaveat = options.failIfMajorPerformanceCaveat; this._preserveDrawingBuffer = options.preserveDrawingBuffer; this._trackResize = options.trackResize; this._bearingSnap = options.bearingSnap; this._refreshExpiredTiles = options.refreshExpiredTiles; this._fadeDuration = options.fadeDuration; this._crossFadingFactor = 1; this._collectResourceTiming = options.collectResourceTiming; var transformRequestFn = options.transformRequest; this._transformRequest = transformRequestFn ? function (url, type) { return transformRequestFn(url, type) || ({ url: url }); } : function (url) { return ({ url: url }); }; if (typeof options.container === 'string') { var container = window.document.getElementById(options.container); if (!container) { throw new Error(("Container '" + (options.container) + "' not found.")); } else { this._container = container; } } else if (options.container instanceof HTMLElement) { this._container = options.container; } else { throw new Error("Invalid type: 'container' must be a String or HTMLElement."); } if (options.maxBounds) { this.setMaxBounds(options.maxBounds); } util.bindAll([ '_onWindowOnline', '_onWindowResize', '_contextLost', '_contextRestored', '_update', '_render', '_onData', '_onDataLoading' ], this); this._setupContainer(); this._setupPainter(); this.on('move', this._update.bind(this, false)); this.on('zoom', this._update.bind(this, true)); if (typeof window !== 'undefined') { window.addEventListener('online', this._onWindowOnline, false); window.addEventListener('resize', this._onWindowResize, false); } bindHandlers(this, options); this._hash = options.hash && (new Hash()).addTo(this); // don't set position from options if set through hash if (!this._hash || !this._hash._onHashChange()) { this.jumpTo({ center: options.center, zoom: options.zoom, bearing: options.bearing, pitch: options.pitch }); } this.resize(); if (options.style) { this.setStyle(options.style, { localIdeographFontFamily: options.localIdeographFontFamily }); } if (options.attributionControl) { this.addControl(new AttributionControl()); } this.addControl(new LogoControl(), options.logoPosition); this.on('style.load', function() { if (this.transform.unmodified) { this.jumpTo(this.style.stylesheet); } }); this.on('data', this._onData); this.on('dataloading', this._onDataLoading); } if ( Camera ) Map.__proto__ = Camera; Map.prototype = Object.create( Camera && Camera.prototype ); Map.prototype.constructor = Map; var prototypeAccessors = { showTileBoundaries: {},showCollisionBoxes: {},showOverdrawInspector: {},repaint: {},vertices: {} }; /** * Adds a {@link IControl} to the map, calling `control.onAdd(this)`. * * @param {IControl} control The {@link IControl} to add. * @param {string} [position] position on the map to which the control will be added. * Valid values are `'top-left'`, `'top-right'`, `'bottom-left'`, and `'bottom-right'`. Defaults to `'top-right'`. * @returns {Map} `this` * @see [Display map navigation controls](https://www.mapbox.com/mapbox-gl-js/example/navigation/) */ Map.prototype.addControl = function addControl (control , position ) { if (position === undefined && control.getDefaultPosition) { position = control.getDefaultPosition(); } if (position === undefined) { position = 'top-right'; } var controlElement = control.onAdd(this); var positionContainer = this._controlPositions[position]; if (position.indexOf('bottom') !== -1) { positionContainer.insertBefore(controlElement, positionContainer.firstChild); } else { positionContainer.appendChild(controlElement); } return this; }; /** * Removes the control from the map. * * @param {IControl} control The {@link IControl} to remove. * @returns {Map} `this` */ Map.prototype.removeControl = function removeControl (control ) { control.onRemove(this); return this; }; /** * Resizes the map according to the dimensions of its * `container` element. * * This method must be called after the map's `container` is resized by another script, * or when the map is shown after being initially hidden with CSS. * * @returns {Map} `this` */ Map.prototype.resize = function resize () { var dimensions = this._containerDimensions(); var width = dimensions[0]; var height = dimensions[1]; this._resizeCanvas(width, height); this.transform.resize(width, height); this.painter.resize(width, height); return this .fire('movestart') .fire('move') .fire('resize') .fire('moveend'); }; /** * Returns the map's geographical bounds. * * @returns {LngLatBounds} The map's geographical bounds. */ Map.prototype.getBounds = function getBounds () { var bounds = new LngLatBounds( this.transform.pointLocation(new Point(0, this.transform.height)), this.transform.pointLocation(new Point(this.transform.width, 0))); if (this.transform.angle || this.transform.pitch) { bounds.extend(this.transform.pointLocation(new Point(this.transform.size.x, 0))); bounds.extend(this.transform.pointLocation(new Point(0, this.transform.size.y))); } return bounds; }; /** * Gets the map's geographical bounds. * * Returns the LngLatBounds by which pan and zoom operations on the map are constrained. * * @returns {LngLatBounds | null} The maximum bounds the map is constrained to, or `null` if none set. */ Map.prototype.getMaxBounds = function getMaxBounds () { if (this.transform.latRange && this.transform.latRange.length === 2 && this.transform.lngRange && this.transform.lngRange.length === 2) { return new LngLatBounds([this.transform.lngRange[0], this.transform.latRange[0]], [this.transform.lngRange[1], this.transform.latRange[1]]); } else { return null; } }; /** * Sets or clears the map's geographical bounds. * * Pan and zoom operations are constrained within these bounds. * If a pan or zoom is performed that would * display regions outside these bounds, the map will * instead display a position and zoom level * as close as possible to the operation's request while still * remaining within the bounds. * * @param {LngLatBoundsLike | null | undefined} lnglatbounds The maximum bounds to set. If `null` or `undefined` is provided, the function removes the map's maximum bounds. * @returns {Map} `this` */ Map.prototype.setMaxBounds = function setMaxBounds (lnglatbounds ) { if (lnglatbounds) { var b = LngLatBounds.convert(lnglatbounds); this.transform.lngRange = [b.getWest(), b.getEast()]; this.transform.latRange = [b.getSouth(), b.getNorth()]; this.transform._constrain(); this._update(); } else if (lnglatbounds === null || lnglatbounds === undefined) { this.transform.lngRange = null; this.transform.latRange = null; this._update(); } return this; }; /** * Sets or clears the map's minimum zoom level. * If the map's current zoom level is lower than the new minimum, * the map will zoom to the new minimum. * * @param {number | null | undefined} minZoom The minimum zoom level to set (0-24). * If `null` or `undefined` is provided, the function removes the current minimum zoom (i.e. sets it to 0). * @returns {Map} `this` */ Map.prototype.setMinZoom = function setMinZoom (minZoom ) { minZoom = minZoom === null || minZoom === undefined ? defaultMinZoom : minZoom; if (minZoom >= defaultMinZoom && minZoom <= this.transform.maxZoom) { this.transform.minZoom = minZoom; this._update(); if (this.getZoom() < minZoom) { this.setZoom(minZoom); } return this; } else { throw new Error(("minZoom must be between " + defaultMinZoom + " and the current maxZoom, inclusive")); } }; /** * Returns the map's minimum allowable zoom level. * * @returns {number} minZoom */ Map.prototype.getMinZoom = function getMinZoom () { return this.transform.minZoom; }; /** * Sets or clears the map's maximum zoom level. * If the map's current zoom level is higher than the new maximum, * the map will zoom to the new maximum. * * @param {number | null | undefined} maxZoom The maximum zoom level to set. * If `null` or `undefined` is provided, the function removes the current maximum zoom (sets it to 22). * @returns {Map} `this` */ Map.prototype.setMaxZoom = function setMaxZoom (maxZoom ) { maxZoom = maxZoom === null || maxZoom === undefined ? defaultMaxZoom : maxZoom; if (maxZoom >= this.transform.minZoom) { this.transform.maxZoom = maxZoom; this._update(); if (this.getZoom() > maxZoom) { this.setZoom(maxZoom); } return this; } else { throw new Error("maxZoom must be greater than the current minZoom"); } }; /** * Returns the map's maximum allowable zoom level. * * @returns {number} maxZoom */ Map.prototype.getMaxZoom = function getMaxZoom () { return this.transform.maxZoom; }; /** * Returns a {@link Point} representing pixel coordinates, relative to the map's `container`, * that correspond to the specified geographical location. * * @param {LngLatLike} lnglat The geographical location to project. * @returns {Point} The {@link Point} corresponding to `lnglat`, relative to the map's `container`. */ Map.prototype.project = function project (lnglat ) { return this.transform.locationPoint(LngLat.convert(lnglat)); }; /** * Returns a {@link LngLat} representing geographical coordinates that correspond * to the specified pixel coordinates. * * @param {PointLike} point The pixel coordinates to unproject. * @returns {LngLat} The {@link LngLat} corresponding to `point`. * @see [Show polygon information on click](https://www.mapbox.com/mapbox-gl-js/example/polygon-popup-on-click/) */ Map.prototype.unproject = function unproject (point ) { return this.transform.pointLocation(Point.convert(point)); }; /** * Adds a listener for events of a specified type. * * @method * @name on * @memberof Map * @instance * @param {string} type The event type to add a listen for. * @param {Function} listener The function to be called when the event is fired. * The listener function is called with the data object passed to `fire`, * extended with `target` and `type` properties. * @returns {Map} `this` */ /** * Adds a listener for events of a specified type occurring on features in a specified style layer. * * @param {string} type The event type to listen for; one of `'mousedown'`, `'mouseup'`, `'click'`, `'dblclick'`, * `'mousemove'`, `'mouseenter'`, `'mouseleave'`, `'mouseover'`, `'mouseout'`, `'contextmenu'`, `'touchstart'`, * `'touchend'`, or `'touchcancel'`. `mouseenter` and `mouseover` events are triggered when the cursor enters * a visible portion of the specified layer from outside that layer or outside the map canvas. `mouseleave` * and `mouseout` events are triggered when the cursor leaves a visible portion of the specified layer, or leaves * the map canvas. * @param {string} layer The ID of a style layer. Only events whose location is within a visible * feature in this layer will trigger the listener. The event will have a `features` property containing * an array of the matching features. * @param {Function} listener The function to be called when the event is fired. * @returns {Map} `this` */ Map.prototype.on = function on (type , layer , listener ) { var this$1 = this; if (listener === undefined) { return Camera.prototype.on.call(this, type, layer); } var delegatedListener = (function () { if (type === 'mouseenter' || type === 'mouseover') { var mousein = false; var mousemove = function (e) { var features = this$1.getLayer(layer) ? this$1.queryRenderedFeatures(e.point, {layers: [layer]}) : []; if (!features.length) { mousein = false; } else if (!mousein) { mousein = true; listener.call(this$1, util.extend({features: features}, e, {type: type})); } }; var mouseout = function () { mousein = false; }; return {layer: layer, listener: listener, delegates: {mousemove: mousemove, mouseout: mouseout}}; } else if (type === 'mouseleave' || type === 'mouseout') { var mousein$1 = false; var mousemove$1 = function (e) { var features = this$1.getLayer(layer) ? this$1.queryRenderedFeatures(e.point, {layers: [layer]}) : []; if (features.length) { mousein$1 = true; } else if (mousein$1) { mousein$1 = false; listener.call(this$1, util.extend({}, e, {type: type})); } }; var mouseout$1 = function (e) { if (mousein$1) { mousein$1 = false; listener.call(this$1, util.extend({}, e, {type: type})); } }; return {layer: layer, listener: listener, delegates: {mousemove: mousemove$1, mouseout: mouseout$1}}; } else { var delegate = function (e) { var features = this$1.getLayer(layer) ? this$1.queryRenderedFeatures(e.point, {layers: [layer]}) : []; if (features.length) { listener.call(this$1, util.extend({features: features}, e)); } }; return {layer: layer, listener: listener, delegates: ( obj = {}, obj[type] = delegate, obj )}; var obj; } })(); this._delegatedListeners = this._delegatedListeners || {}; this._delegatedListeners[type] = this._delegatedListeners[type] || []; this._delegatedListeners[type].push(delegatedListener); for (var event in delegatedListener.delegates) { this$1.on((event ), delegatedListener.delegates[event]); } return this; }; /** * Removes an event listener previously added with `Map#on`. * * @method * @name off * @memberof Map * @instance * @param {string} type The event type previously used to install the listener. * @param {Function} listener The function previously installed as a listener. * @returns {Map} `this` */ /** * Removes an event listener for layer-specific events previously added with `Map#on`. * * @param {string} type The event type previously used to install the listener. * @param {string} layer The layer ID previously used to install the listener. * @param {Function} listener The function previously installed as a listener. * @returns {Map} `this` */ Map.prototype.off = function off (type , layer , listener ) { var this$1 = this; if (listener === undefined) { return Camera.prototype.off.call(this, type, layer); } if (this._delegatedListeners && this._delegatedListeners[type]) { var listeners = this._delegatedListeners[type]; for (var i = 0; i < listeners.length; i++) { var delegatedListener = listeners[i]; if (delegatedListener.layer === layer && delegatedListener.listener === listener) { for (var event in delegatedListener.delegates) { this$1.off((event ), delegatedListener.delegates[event]); } listeners.splice(i, 1); return this$1; } } } return this; }; /** * Returns an array of [GeoJSON](http://geojson.org/) * [Feature objects](http://geojson.org/geojson-spec.html#feature-objects) * representing visible features that satisfy the query parameters. * * @param {PointLike|Array} [geometry] - The geometry of the query region: * either a single point or southwest and northeast points describing a bounding box. * Omitting this parameter (i.e. calling {@link Map#queryRenderedFeatures} with zero arguments, * or with only a `options` argument) is equivalent to passing a bounding box encompassing the entire * map viewport. * @param {Object} [options] * @param {Array} [options.layers] An array of style layer IDs for the query to inspect. * Only features within these layers will be returned. If this parameter is undefined, all layers will be checked. * @param {Array} [options.filter] A [filter](https://www.mapbox.com/mapbox-gl-js/style-spec/#other-filter) * to limit query results. * * @returns {Array} An array of [GeoJSON](http://geojson.org/) * [feature objects](http://geojson.org/geojson-spec.html#feature-objects). * * The `properties` value of each returned feature object contains the properties of its source feature. For GeoJSON sources, only * string and numeric property values are supported (i.e. `null`, `Array`, and `Object` values are not supported). * * Each feature includes a top-level `layer` property whose value is an object representing the style layer to * which the feature belongs. Layout and paint properties in this object contain values which are fully evaluated * for the given zoom level and feature. * * Features from layers whose `visibility` property is `"none"`, or from layers whose zoom range excludes the * current zoom level are not included. Symbol features that have been hidden due to text or icon collision are * not included. Features from all other layers are included, including features that may have no visible * contribution to the rendered result; for example, because the layer's opacity or color alpha component is set to * 0. * * The topmost rendered feature appears first in the returned array, and subsequent features are sorted by * descending z-order. Features that are rendered multiple times (due to wrapping across the antimeridian at low * zoom levels) are returned only once (though subject to the following caveat). * * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature * geometries may be split or duplicated across tile boundaries and, as a result, features may appear multiple * times in query results. For example, suppose there is a highway running through the bounding rectangle of a query. * The results of the query will be those parts of the highway that lie within the map tiles covering the bounding * rectangle, even if the highway extends into other tiles, and the portion of the highway within each map tile * will be returned as a separate feature. Similarly, a point feature near a tile boundary may appear in multiple * tiles due to tile buffering. * * @example * // Find all features at a point * var features = map.queryRenderedFeatures( * [20, 35], * { layers: ['my-layer-name'] } * ); * * @example * // Find all features within a static bounding box * var features = map.queryRenderedFeatures( * [[10, 20], [30, 50]], * { layers: ['my-layer-name'] } * ); * * @example * // Find all features within a bounding box around a point * var width = 10; * var height = 20; * var features = map.queryRenderedFeatures([ * [point.x - width / 2, point.y - height / 2], * [point.x + width / 2, point.y + height / 2] * ], { layers: ['my-layer-name'] }); * * @example * // Query all rendered features from a single layer * var features = map.queryRenderedFeatures({ layers: ['my-layer-name'] }); * @see [Get features under the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/queryrenderedfeatures/) * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) * @see [Center the map on a clicked symbol](https://www.mapbox.com/mapbox-gl-js/example/center-on-symbol/) */ Map.prototype.queryRenderedFeatures = function queryRenderedFeatures (geometry , options ) { // The first parameter can be omitted entirely, making this effectively an overloaded method // with two signatures: // // queryRenderedFeatures(geometry: PointLike | [PointLike, PointLike], options?: Object) // queryRenderedFeatures(options?: Object) // // There no way to express that in a way that's compatible with both flow and documentation.js. // Related: https://github.com/facebook/flow/issues/1556 if (arguments.length === 2) { geometry = arguments[0]; options = arguments[1]; } else if (arguments.length === 1 && isPointLike(arguments[0])) { geometry = arguments[0]; options = {}; } else if (arguments.length === 1) { geometry = undefined; options = arguments[0]; } else { geometry = undefined; options = {}; } if (!this.style) { return []; } return this.style.queryRenderedFeatures( this._makeQueryGeometry(geometry), options, this.transform.zoom, this.transform.angle ); function isPointLike(input) { return input instanceof Point || Array.isArray(input); } }; Map.prototype._makeQueryGeometry = function _makeQueryGeometry (pointOrBox ) { var this$1 = this; if (pointOrBox === undefined) { // bounds was omitted: use full viewport pointOrBox = [ Point.convert([0, 0]), Point.convert([this.transform.width, this.transform.height]) ]; } var queryGeometry; if (pointOrBox instanceof Point || typeof pointOrBox[0] === 'number') { var point = Point.convert(pointOrBox); queryGeometry = [point]; } else { var box = [Point.convert(pointOrBox[0]), Point.convert(pointOrBox[1])]; queryGeometry = [ box[0], new Point(box[1].x, box[0].y), box[1], new Point(box[0].x, box[1].y), box[0] ]; } queryGeometry = queryGeometry.map(function (p) { return this$1.transform.pointCoordinate(p); }); return queryGeometry; }; /** * Returns an array of [GeoJSON](http://geojson.org/) * [Feature objects](http://geojson.org/geojson-spec.html#feature-objects) * representing features within the specified vector tile or GeoJSON source that satisfy the query parameters. * * @param {string} sourceID The ID of the vector tile or GeoJSON source to query. * @param {Object} [parameters] * @param {string} [parameters.sourceLayer] The name of the vector tile layer to query. *For vector tile * sources, this parameter is required.* For GeoJSON sources, it is ignored. * @param {Array} [parameters.filter] A [filter](https://www.mapbox.com/mapbox-gl-js/style-spec/#other-filter) * to limit query results. * * @returns {Array} An array of [GeoJSON](http://geojson.org/) * [Feature objects](http://geojson.org/geojson-spec.html#feature-objects). * * In contrast to {@link Map#queryRenderedFeatures}, this function * returns all features matching the query parameters, * whether or not they are rendered by the current style (i.e. visible). The domain of the query includes all currently-loaded * vector tiles and GeoJSON source tiles: this function does not check tiles outside the currently * visible viewport. * * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature * geometries may be split or duplicated across tile boundaries and, as a result, features may appear multiple * times in query results. For example, suppose there is a highway running through the bounding rectangle of a query. * The results of the query will be those parts of the highway that lie within the map tiles covering the bounding * rectangle, even if the highway extends into other tiles, and the portion of the highway within each map tile * will be returned as a separate feature. Similarly, a point feature near a tile boundary may appear in multiple * tiles due to tile buffering. * @see [Filter features within map view](https://www.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/) * @see [Highlight features containing similar data](https://www.mapbox.com/mapbox-gl-js/example/query-similar-features/) */ Map.prototype.querySourceFeatures = function querySourceFeatures (sourceID , parameters ) { return this.style.querySourceFeatures(sourceID, parameters); }; /** * Updates the map's Mapbox style object with a new value. If the given * value is style JSON object, compares it against the the map's current * state and perform only the changes necessary to make the map style match * the desired state. * * @param style A JSON object conforming to the schema described in the * [Mapbox Style Specification](https://mapbox.com/mapbox-gl-style-spec/), or a URL to such JSON. * @param {Object} [options] * @param {boolean} [options.diff=true] If false, force a 'full' update, removing the current style * and adding building the given one instead of attempting a diff-based update. * @param {string} [options.localIdeographFontFamily=null] If non-null, defines a css font-family * for locally overriding generation of glyphs in the 'CJK Unified Ideographs' and 'Hangul Syllables' * ranges. Forces a full update. * @returns {Map} `this` * @see [Change a map's style](https://www.mapbox.com/mapbox-gl-js/example/setstyle/) */ Map.prototype.setStyle = function setStyle (style , options ) { var shouldTryDiff = (!options || (options.diff !== false && !options.localIdeographFontFamily)) && this.style; if (shouldTryDiff && style && typeof style === 'object') { try { if (this.style.setState(style)) { this._update(true); } return this; } catch (e) { util.warnOnce(("Unable to perform style diff: " + (e.message || e.error || e) + ". Rebuilding the style from scratch.")); } } if (this.style) { this.style.setEventedParent(null); this.style._remove(); } if (!style) { delete this.style; return this; } else { this.style = new Style(this, options || {}); } this.style.setEventedParent(this, {style: this.style}); if (typeof style === 'string') { this.style.loadURL(style); } else { this.style.loadJSON(style); } return this; }; /** * Returns the map's Mapbox style object, which can be used to recreate the map's style. * * @returns {Object} The map's style object. */ Map.prototype.getStyle = function getStyle () { if (this.style) { return this.style.serialize(); } }; /** * Returns a Boolean indicating whether the map's style is fully loaded. * * @returns {boolean} A Boolean indicating whether the style is fully loaded. */ Map.prototype.isStyleLoaded = function isStyleLoaded () { if (!this.style) { return util.warnOnce('There is no style added to the map.'); } return this.style.loaded(); }; /** * Adds a source to the map's style. * * @param {string} id The ID of the source to add. Must not conflict with existing sources. * @param {Object} source The source object, conforming to the * Mapbox Style Specification's [source definition](https://www.mapbox.com/mapbox-gl-style-spec/#sources). * @fires source.add * @returns {Map} `this` * @see [Draw GeoJSON points](https://www.mapbox.com/mapbox-gl-js/example/geojson-markers/) * @see [Style circles using data-driven styling](https://www.mapbox.com/mapbox-gl-js/example/data-driven-circle-colors/) * @see [Set a point after Geocoder result](https://www.mapbox.com/mapbox-gl-js/example/point-from-geocoder-result/) */ Map.prototype.addSource = function addSource (id , source ) { this.style.addSource(id, source); this._update(true); return this; }; /** * Returns a Boolean indicating whether the source is loaded. * * @param {string} id The ID of the source to be checked. * @returns {boolean} A Boolean indicating whether the source is loaded. */ Map.prototype.isSourceLoaded = function isSourceLoaded (id ) { var source = this.style && this.style.sourceCaches[id]; if (source === undefined) { this.fire('error', { error: new Error(("There is no source with ID '" + id + "'")) }); return; } return source.loaded(); }; /** * Returns a Boolean indicating whether all tiles in the viewport from all sources on * the style are loaded. * * @returns {boolean} A Boolean indicating whether all tiles are loaded. */ Map.prototype.areTilesLoaded = function areTilesLoaded () { var sources = this.style && this.style.sourceCaches; for (var id in sources) { var source = sources[id]; var tiles = source._tiles; for (var t in tiles) { var tile = tiles[t]; if (!(tile.state === 'loaded' || tile.state === 'errored')) { return false; } } } return true; }; /** * Adds a [custom source type](#Custom Sources), making it available for use with * {@link Map#addSource}. * @private * @param {string} name The name of the source type; source definition objects use this name in the `{type: ...}` field. * @param {Function} SourceType A {@link Source} constructor. * @param {Function} callback Called when the source type is ready or with an error argument if there is an error. */ Map.prototype.addSourceType = function addSourceType (name , SourceType , callback ) { return this.style.addSourceType(name, SourceType, callback); }; /** * Removes a source from the map's style. * * @param {string} id The ID of the source to remove. * @returns {Map} `this` */ Map.prototype.removeSource = function removeSource (id ) { this.style.removeSource(id); this._update(true); return this; }; /** * Returns the source with the specified ID in the map's style. * * @param {string} id The ID of the source to get. * @returns {?Object} The style source with the specified ID, or `undefined` * if the ID corresponds to no existing sources. * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/) * @see [Animate a point](https://www.mapbox.com/mapbox-gl-js/example/animate-point-along-line/) * @see [Add live realtime data](https://www.mapbox.com/mapbox-gl-js/example/live-geojson/) */ Map.prototype.getSource = function getSource (id ) { return this.style.getSource(id); }; /** * Add an image to the style. This image can be used in `icon-image`, * `background-pattern`, `fill-pattern`, and `line-pattern`. An * {@link Map#error} event will be fired if there is not enough space in the * sprite to add this image. * * @see [Add an icon to the map](https://www.mapbox.com/mapbox-gl-js/example/add-image/) * @see [Add a generated icon to the map](https://www.mapbox.com/mapbox-gl-js/example/add-image-generated/) * @param id The ID of the image. * @param image The image as an `HTMLImageElement`, `ImageData`, or object with `width`, `height`, and `data` * properties with the same format as `ImageData`. * @param options * @param options.pixelRatio The ratio of pixels in the image to physical pixels on the screen * @param options.sdf Whether the image should be interpreted as an SDF image */ Map.prototype.addImage = function addImage (id , image , ref) { if ( ref === void 0 ) ref = {}; var pixelRatio = ref.pixelRatio; if ( pixelRatio === void 0 ) pixelRatio = 1; var sdf = ref.sdf; if ( sdf === void 0 ) sdf = false; if (image instanceof HTMLImageElement) { var ref$1 = browser.getImageData(image); var width = ref$1.width; var height = ref$1.height; var data = ref$1.data; this.style.addImage(id, { data: new RGBAImage({width: width, height: height}, data), pixelRatio: pixelRatio, sdf: sdf }); } else if (image.width === undefined || image.height === undefined) { return this.fire('error', {error: new Error( 'Invalid arguments to map.addImage(). The second argument must be an `HTMLImageElement`, `ImageData`, ' + 'or object with `width`, `height`, and `data` properties with the same format as `ImageData`')}); } else { var width$1 = image.width; var height$1 = image.height; var data$1 = image.data; this.style.addImage(id, { data: new RGBAImage({width: width$1, height: height$1}, data$1.slice(0)), pixelRatio: pixelRatio, sdf: sdf }); } }; /** * Define wether the image has been added or not * * @param id The ID of the image. */ Map.prototype.hasImage = function hasImage (id ) { if (!id) { this.fire('error', { error: new Error('Missing required image id') }); return false; } return !!this.style.getImage(id); }; /** * Remove an image from the style (such as one used by `icon-image` or `background-pattern`). * * @param id The ID of the image. */ Map.prototype.removeImage = function removeImage (id ) { this.style.removeImage(id); }; /** * Load an image from an external URL for use with `Map#addImage`. External * domains must support [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS). * * @param {string} url The URL of the image file. Image file must be in png, webp, or jpg format. * @param {Function} callback Expecting `callback(error, data)`. Called when the image has loaded or with an error argument if there is an error. * @see [Add an icon to the map](https://www.mapbox.com/mapbox-gl-js/example/add-image/) */ Map.prototype.loadImage = function loadImage (url , callback ) { ajax.getImage(this._transformRequest(url, ajax.ResourceType.Image), callback); }; /** * Adds a [Mapbox style layer](https://www.mapbox.com/mapbox-gl-style-spec/#layers) * to the map's style. * * A layer defines styling for data from a specified source. * * @param {Object} layer The style layer to add, conforming to the Mapbox Style Specification's * [layer definition](https://www.mapbox.com/mapbox-gl-style-spec/#layers). * @param {string} [before] The ID of an existing layer to insert the new layer before. * If this argument is omitted, the layer will be appended to the end of the layers array. * @returns {Map} `this` * @see [Create and style clusters](https://www.mapbox.com/mapbox-gl-js/example/cluster/) * @see [Add a vector tile source](https://www.mapbox.com/mapbox-gl-js/example/vector-source/) * @see [Add a WMS source](https://www.mapbox.com/mapbox-gl-js/example/wms/) */ Map.prototype.addLayer = function addLayer (layer , before ) { this.style.addLayer(layer, before); this._update(true); return this; }; /** * Moves a layer to a different z-position. * * @param {string} id The ID of the layer to move. * @param {string} [beforeId] The ID of an existing layer to insert the new layer before. * If this argument is omitted, the layer will be appended to the end of the layers array. * @returns {Map} `this` */ Map.prototype.moveLayer = function moveLayer (id , beforeId ) { this.style.moveLayer(id, beforeId); this._update(true); return this; }; /** * Removes the layer with the given id from the map's style. * * If no such layer exists, an `error` event is fired. * * @param {string} id id of the layer to remove * @fires error */ Map.prototype.removeLayer = function removeLayer (id ) { this.style.removeLayer(id); this._update(true); return this; }; /** * Returns the layer with the specified ID in the map's style. * * @param {string} id The ID of the layer to get. * @returns {?Object} The layer with the specified ID, or `undefined` * if the ID corresponds to no existing layers. * @see [Filter symbols by toggling a list](https://www.mapbox.com/mapbox-gl-js/example/filter-markers/) * @see [Filter symbols by text input](https://www.mapbox.com/mapbox-gl-js/example/filter-markers-by-input/) */ Map.prototype.getLayer = function getLayer (id ) { return this.style.getLayer(id); }; /** * Sets the filter for the specified style layer. * * @param {string} layer The ID of the layer to which the filter will be applied. * @param {Array | null | undefined} filter The filter, conforming to the Mapbox Style Specification's * [filter definition](https://www.mapbox.com/mapbox-gl-js/style-spec/#other-filter). If `null` or `undefined` is provided, the function removes any existing filter from the layer. * @returns {Map} `this` * @example * map.setFilter('my-layer', ['==', 'name', 'USA']); * @see [Filter features within map view](https://www.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/) * @see [Highlight features containing similar data](https://www.mapbox.com/mapbox-gl-js/example/query-similar-features/) * @see [Create a timeline animation](https://www.mapbox.com/mapbox-gl-js/example/timeline-animation/) */ Map.prototype.setFilter = function setFilter (layer , filter ) { this.style.setFilter(layer, filter); this._update(true); return this; }; /** * Sets the zoom extent for the specified style layer. * * @param {string} layerId The ID of the layer to which the zoom extent will be applied. * @param {number} minzoom The minimum zoom to set (0-24). * @param {number} maxzoom The maximum zoom to set (0-24). * @returns {Map} `this` * @example * map.setLayerZoomRange('my-layer', 2, 5); */ Map.prototype.setLayerZoomRange = function setLayerZoomRange (layerId , minzoom , maxzoom ) { this.style.setLayerZoomRange(layerId, minzoom, maxzoom); this._update(true); return this; }; /** * Returns the filter applied to the specified style layer. * * @param {string} layer The ID of the style layer whose filter to get. * @returns {Array} The layer's filter. */ Map.prototype.getFilter = function getFilter (layer ) { return this.style.getFilter(layer); }; /** * Sets the value of a paint property in the specified style layer. * * @param {string} layer The ID of the layer to set the paint property in. * @param {string} name The name of the paint property to set. * @param {*} value The value of the paint propery to set. * Must be of a type appropriate for the property, as defined in the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/). * @returns {Map} `this` * @example * map.setPaintProperty('my-layer', 'fill-color', '#faafee'); * @see [Change a layer's color with buttons](https://www.mapbox.com/mapbox-gl-js/example/color-switcher/) * @see [Adjust a layer's opacity](https://www.mapbox.com/mapbox-gl-js/example/adjust-layer-opacity/) * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/) */ Map.prototype.setPaintProperty = function setPaintProperty (layer , name , value ) { this.style.setPaintProperty(layer, name, value); this._update(true); return this; }; /** * Returns the value of a paint property in the specified style layer. * * @param {string} layer The ID of the layer to get the paint property from. * @param {string} name The name of a paint property to get. * @returns {*} The value of the specified paint property. */ Map.prototype.getPaintProperty = function getPaintProperty (layer , name ) { return this.style.getPaintProperty(layer, name); }; /** * Sets the value of a layout property in the specified style layer. * * @param {string} layer The ID of the layer to set the layout property in. * @param {string} name The name of the layout property to set. * @param {*} value The value of the layout propery. Must be of a type appropriate for the property, as defined in the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/). * @returns {Map} `this` * @example * map.setLayoutProperty('my-layer', 'visibility', 'none'); */ Map.prototype.setLayoutProperty = function setLayoutProperty (layer , name , value ) { this.style.setLayoutProperty(layer, name, value); this._update(true); return this; }; /** * Returns the value of a layout property in the specified style layer. * * @param {string} layer The ID of the layer to get the layout property from. * @param {string} name The name of the layout property to get. * @returns {*} The value of the specified layout property. */ Map.prototype.getLayoutProperty = function getLayoutProperty (layer , name ) { return this.style.getLayoutProperty(layer, name); }; /** * Sets the any combination of light values. * * @param light Light properties to set. Must conform to the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/). * @returns {Map} `this` */ Map.prototype.setLight = function setLight (light ) { this.style.setLight(light); this._update(true); return this; }; /** * Returns the value of the light object. * * @returns {Object} light Light properties of the style. */ Map.prototype.getLight = function getLight () { return this.style.getLight(); }; /** * Returns the map's containing HTML element. * * @returns {HTMLElement} The map's container. */ Map.prototype.getContainer = function getContainer () { return this._container; }; /** * Returns the HTML element containing the map's `` element. * * If you want to add non-GL overlays to the map, you should append them to this element. * * This is the element to which event bindings for map interactivity (such as panning and zooming) are * attached. It will receive bubbled events from child elements such as the ``, but not from * map controls. * * @returns {HTMLElement} The container of the map's ``. * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/) * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) */ Map.prototype.getCanvasContainer = function getCanvasContainer () { return this._canvasContainer; }; /** * Returns the map's `` element. * * @returns {HTMLCanvasElement} The map's `` element. * @see [Measure distances](https://www.mapbox.com/mapbox-gl-js/example/measure/) * @see [Display a popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/) * @see [Center the map on a clicked symbol](https://www.mapbox.com/mapbox-gl-js/example/center-on-symbol/) */ Map.prototype.getCanvas = function getCanvas () { return this._canvas; }; Map.prototype._containerDimensions = function _containerDimensions () { var width = 0; var height = 0; if (this._container) { width = this._container.offsetWidth || 400; height = this._container.offsetHeight || 300; } return [width, height]; }; Map.prototype._setupContainer = function _setupContainer () { var container = this._container; container.classList.add('mapboxgl-map'); var missingCSSContainer = this._missingCSSContainer = DOM.create('div', 'mapboxgl-missing-css', container); missingCSSContainer.innerHTML = 'Missing Mapbox GL JS CSS'; var canvasContainer = this._canvasContainer = DOM.create('div', 'mapboxgl-canvas-container', container); if (this._interactive) { canvasContainer.classList.add('mapboxgl-interactive'); } this._canvas = DOM.create('canvas', 'mapboxgl-canvas', canvasContainer); this._canvas.style.position = 'absolute'; this._canvas.addEventListener('webglcontextlost', this._contextLost, false); this._canvas.addEventListener('webglcontextrestored', this._contextRestored, false); this._canvas.setAttribute('tabindex', '0'); this._canvas.setAttribute('aria-label', 'Map'); var dimensions = this._containerDimensions(); this._resizeCanvas(dimensions[0], dimensions[1]); var controlContainer = this._controlContainer = DOM.create('div', 'mapboxgl-control-container', container); var positions = this._controlPositions = {}; ['top-left', 'top-right', 'bottom-left', 'bottom-right'].forEach(function (positionName) { positions[positionName] = DOM.create('div', ("mapboxgl-ctrl-" + positionName), controlContainer); }); }; Map.prototype._resizeCanvas = function _resizeCanvas (width , height ) { var pixelRatio = window.devicePixelRatio || 1; // Request the required canvas size taking the pixelratio into account. this._canvas.width = pixelRatio * width; this._canvas.height = pixelRatio * height; // Maintain the same canvas size, potentially downscaling it for HiDPI displays this._canvas.style.width = width + "px"; this._canvas.style.height = height + "px"; }; Map.prototype._setupPainter = function _setupPainter () { var attributes = util.extend({ failIfMajorPerformanceCaveat: this._failIfMajorPerformanceCaveat, preserveDrawingBuffer: this._preserveDrawingBuffer }, isSupported.webGLContextAttributes); var gl = this._canvas.getContext('webgl', attributes) || this._canvas.getContext('experimental-webgl', attributes); if (!gl) { this.fire('error', { error: new Error('Failed to initialize WebGL') }); return; } this.painter = new Painter(gl, this.transform); }; Map.prototype._contextLost = function _contextLost (event ) { event.preventDefault(); if (this._frameId) { browser.cancelFrame(this._frameId); this._frameId = null; } this.fire('webglcontextlost', {originalEvent: event}); }; Map.prototype._contextRestored = function _contextRestored (event ) { this._setupPainter(); this.resize(); this._update(); this.fire('webglcontextrestored', {originalEvent: event}); }; /** * Returns a Boolean indicating whether the map is fully loaded. * * Returns `false` if the style is not yet fully loaded, * or if there has been a change to the sources or style that * has not yet fully loaded. * * @returns {boolean} A Boolean indicating whether the map is fully loaded. */ Map.prototype.loaded = function loaded () { if (this._styleDirty || this._sourcesDirty) { return false; } if (!this.style || !this.style.loaded()) { return false; } return true; }; /** * Update this map's style and sources, and re-render the map. * * @param {boolean} updateStyle mark the map's style for reprocessing as * well as its sources * @returns {Map} this * @private */ Map.prototype._update = function _update (updateStyle ) { if (!this.style) { return; } this._styleDirty = this._styleDirty || updateStyle; this._sourcesDirty = true; this._rerender(); }; /** * Call when a (re-)render of the map is required: * - The style has changed (`setPaintProperty()`, etc.) * - Source data has changed (e.g. tiles have finished loading) * - The map has is moving (or just finished moving) * - A transition is in progress * * @returns {Map} this * @private */ Map.prototype._render = function _render () { this._updateCamera(); var crossFading = false; // If the style has changed, the map is being zoomed, or a transition or fade is in progress: // - Apply style changes (in a batch) // - Recalculate paint properties. if (this.style && this._styleDirty) { this._styleDirty = false; var zoom = this.transform.zoom; var now = browser.now(); this.style.zoomHistory.update(zoom, now); var parameters = new EvaluationParameters(zoom, { now: now, fadeDuration: this._fadeDuration, zoomHistory: this.style.zoomHistory, transition: this.style.getTransition() }); var factor = parameters.crossFadingFactor(); if (factor !== 1 || factor !== this._crossFadingFactor) { crossFading = true; this._crossFadingFactor = factor; } this.style.update(parameters); } // If we are in _render for any reason other than an in-progress paint // transition, update source caches to check for and load any tiles we // need for the current transform if (this.style && this._sourcesDirty) { this._sourcesDirty = false; this.style._updateSources(this.transform); } this._placementDirty = this.style && this.style._updatePlacement(this.painter.transform, this.showCollisionBoxes, this._fadeDuration); // Actually draw this.painter.render(this.style, { showTileBoundaries: this.showTileBoundaries, showOverdrawInspector: this._showOverdrawInspector, rotating: this.rotating, zooming: this.zooming, fadeDuration: this._fadeDuration }); this.fire('render'); if (this.loaded() && !this._loaded) { this._loaded = true; this.fire('load'); } if (this.style && (this.style.hasTransitions() || crossFading)) { this._styleDirty = true; } // Schedule another render frame if it's needed. // // Even though `_styleDirty` and `_sourcesDirty` are reset in this // method, synchronous events fired during Style#update or // Style#_updateSources could have caused them to be set again. if (this._sourcesDirty || this._repaint || this._styleDirty || this._placementDirty) { this._rerender(); } return this; }; /** * Clean up and release all internal resources associated with this map. * * This includes DOM elements, event bindings, web workers, and WebGL resources. * * Use this method when you are done using the map and wish to ensure that it no * longer consumes browser resources. Afterwards, you must not call any other * methods on the map. */ Map.prototype.remove = function remove () { if (this._hash) { this._hash.remove(); } browser.cancelFrame(this._frameId); this._frameId = null; this.setStyle(null); if (typeof window !== 'undefined') { window.removeEventListener('resize', this._onWindowResize, false); window.removeEventListener('online', this._onWindowOnline, false); } var extension = this.painter.context.gl.getExtension('WEBGL_lose_context'); if (extension) { extension.loseContext(); } removeNode(this._canvasContainer); removeNode(this._controlContainer); removeNode(this._missingCSSContainer); this._container.classList.remove('mapboxgl-map'); this.fire('remove'); }; Map.prototype._rerender = function _rerender () { var this$1 = this; if (this.style && !this._frameId) { this._frameId = browser.frame(function () { this$1._frameId = null; this$1._render(); }); } }; Map.prototype._onWindowOnline = function _onWindowOnline () { this._update(); }; Map.prototype._onWindowResize = function _onWindowResize () { if (this._trackResize) { this.stop().resize()._update(); } }; /** * Gets and sets a Boolean indicating whether the map will render an outline * around each tile. These tile boundaries are useful for debugging. * * @name showTileBoundaries * @type {boolean} * @instance * @memberof Map */ prototypeAccessors.showTileBoundaries.get = function () { return !!this._showTileBoundaries; }; prototypeAccessors.showTileBoundaries.set = function (value ) { if (this._showTileBoundaries === value) { return; } this._showTileBoundaries = value; this._update(); }; /** * Gets and sets a Boolean indicating whether the map will render boxes * around all symbols in the data source, revealing which symbols * were rendered or which were hidden due to collisions. * This information is useful for debugging. * * @name showCollisionBoxes * @type {boolean} * @instance * @memberof Map */ prototypeAccessors.showCollisionBoxes.get = function () { return !!this._showCollisionBoxes; }; prototypeAccessors.showCollisionBoxes.set = function (value ) { if (this._showCollisionBoxes === value) { return; } this._showCollisionBoxes = value; if (value) { // When we turn collision boxes on we have to generate them for existing tiles // When we turn them off, there's no cost to leaving existing boxes in place this.style._generateCollisionBoxes(); } else { // Otherwise, call an update to remove collision boxes this._update(); } }; /* * Gets and sets a Boolean indicating whether the map should color-code * each fragment to show how many times it has been shaded. * White fragments have been shaded 8 or more times. * Black fragments have been shaded 0 times. * This information is useful for debugging. * * @name showOverdraw * @type {boolean} * @instance * @memberof Map */ prototypeAccessors.showOverdrawInspector.get = function () { return !!this._showOverdrawInspector; }; prototypeAccessors.showOverdrawInspector.set = function (value ) { if (this._showOverdrawInspector === value) { return; } this._showOverdrawInspector = value; this._update(); }; /** * Gets and sets a Boolean indicating whether the map will * continuously repaint. This information is useful for analyzing performance. * * @name repaint * @type {boolean} * @instance * @memberof Map */ prototypeAccessors.repaint.get = function () { return !!this._repaint; }; prototypeAccessors.repaint.set = function (value ) { this._repaint = value; this._update(); }; // show vertices prototypeAccessors.vertices.get = function () { return !!this._vertices; }; prototypeAccessors.vertices.set = function (value ) { this._vertices = value; this._update(); }; Map.prototype._onData = function _onData (event ) { this._update(event.dataType === 'style'); this.fire(((event.dataType) + "data"), event); }; Map.prototype._onDataLoading = function _onDataLoading (event ) { this.fire(((event.dataType) + "dataloading"), event); }; Object.defineProperties( Map.prototype, prototypeAccessors ); return Map; }(Camera)); module.exports = Map; function removeNode(node) { if (node.parentNode) { node.parentNode.removeChild(node); } } /** * Interface for interactive controls added to the map. This is an * specification for implementers to model: it is not * an exported method or class. * * Controls must implement `onAdd` and `onRemove`, and must own an * element, which is often a `div` element. To use Mapbox GL JS's * default control styling, add the `mapboxgl-ctrl` class to your control's * node. * * @interface IControl * @example * // Control implemented as ES6 class * class HelloWorldControl { * onAdd(map) { * this._map = map; * this._container = document.createElement('div'); * this._container.className = 'mapboxgl-ctrl'; * this._container.textContent = 'Hello, world'; * return this._container; * } * * onRemove() { * this._container.parentNode.removeChild(this._container); * this._map = undefined; * } * } * * // Control implemented as ES5 prototypical class * function HelloWorldControl() { } * * HelloWorldControl.prototype.onAdd = function(map) { * this._map = map; * this._container = document.createElement('div'); * this._container.className = 'mapboxgl-ctrl'; * this._container.textContent = 'Hello, world'; * return this._container; * }; * * HelloWorldControl.prototype.onRemove = function () { * this._container.parentNode.removeChild(this._container); * this._map = undefined; * }; */ /** * Register a control on the map and give it a chance to register event listeners * and resources. This method is called by {@link Map#addControl} * internally. * * @function * @memberof IControl * @instance * @name onAdd * @param {Map} map the Map this control will be added to * @returns {HTMLElement} The control's container element. This should * be created by the control and returned by onAdd without being attached * to the DOM: the map will insert the control's element into the DOM * as necessary. */ /** * Unregister a control on the map and give it a chance to detach event listeners * and resources. This method is called by {@link Map#removeControl} * internally. * * @function * @memberof IControl * @instance * @name onRemove * @param {Map} map the Map this control will be removed from * @returns {undefined} there is no required return value for this method */ /** * Optionally provide a default position for this control. If this method * is implemented and {@link Map#addControl} is called without the `position` * parameter, the value returned by getDefaultPosition will be used as the * control's position. * * @function * @memberof IControl * @instance * @name getDefaultPosition * @returns {string} a control position, one of the values valid in addControl. */ /** * A [`Point` geometry](https://github.com/mapbox/point-geometry) object, which has * `x` and `y` properties representing screen coordinates in pixels. * * @typedef {Object} Point */ /** * A {@link Point} or an array of two numbers representing `x` and `y` screen coordinates in pixels. * * @typedef {(Point | Array)} PointLike */ },{"../geo/lng_lat":67,"../geo/lng_lat_bounds":68,"../geo/transform":69,"../render/painter":95,"../style/evaluation_parameters":187,"../style/style":195,"../util/ajax":256,"../util/browser":257,"../util/dom":264,"../util/image":268,"../util/util":280,"../util/window":259,"./bind_handlers":235,"./camera":236,"./control/attribution_control":237,"./control/logo_control":240,"./events":243,"./hash":251,"@mapbox/mapbox-gl-supported":3,"@mapbox/point-geometry":4}],253:[function(require,module,exports){ 'use strict';// var DOM = require('../util/dom'); var LngLat = require('../geo/lng_lat'); var Point = require('@mapbox/point-geometry'); var smartWrap = require('../util/smart_wrap'); var ref = require('../util/util'); var bindAll = ref.bindAll; /** * Creates a marker component * @param element DOM element to use as a marker. If left unspecified a default SVG will be created as the DOM element to use. * @param options * @param options.offset The offset in pixels as a {@link PointLike} object to apply relative to the element's center. Negatives indicate left and up. * @example * var marker = new mapboxgl.Marker() * .setLngLat([30.5, 50.5]) * .addTo(map); * @see [Add custom icons with Markers](https://www.mapbox.com/mapbox-gl-js/example/custom-marker-icons/) */ var Marker = function Marker(element , options ) { bindAll(['_update', '_onMapClick'], this); if (!element) { element = DOM.create('div'); // create default map marker SVG var svg = DOM.createNS('http://www.w3.org/2000/svg', 'svg'); svg.setAttributeNS(null, 'height', '41px'); svg.setAttributeNS(null, 'width', '27px'); svg.setAttributeNS(null, 'viewBox', '0 0 27 41'); var markerLarge = DOM.createNS('http://www.w3.org/2000/svg', 'g'); markerLarge.setAttributeNS(null, 'stroke', 'none'); markerLarge.setAttributeNS(null, 'stroke-width', '1'); markerLarge.setAttributeNS(null, 'fill', 'none'); markerLarge.setAttributeNS(null, 'fill-rule', 'evenodd'); var page1 = DOM.createNS('http://www.w3.org/2000/svg', 'g'); page1.setAttributeNS(null, 'fill-rule', 'nonzero'); var shadow = DOM.createNS('http://www.w3.org/2000/svg', 'g'); shadow.setAttributeNS(null, 'transform', 'translate(3.0, 29.0)'); shadow.setAttributeNS(null, 'fill', '#000000'); var ellipses = [ {'rx': '10.5', 'ry': '5.25002273'}, {'rx': '10.5', 'ry': '5.25002273'}, {'rx': '9.5', 'ry': '4.77275007'}, {'rx': '8.5', 'ry': '4.29549936'}, {'rx': '7.5', 'ry': '3.81822308'}, {'rx': '6.5', 'ry': '3.34094679'}, {'rx': '5.5', 'ry': '2.86367051'}, {'rx': '4.5', 'ry': '2.38636864'} ]; for (var i = 0, list = ellipses; i < list.length; i += 1) { var data = list[i]; var ellipse = DOM.createNS('http://www.w3.org/2000/svg', 'ellipse'); ellipse.setAttributeNS(null, 'opacity', '0.04'); ellipse.setAttributeNS(null, 'cx', '10.5'); ellipse.setAttributeNS(null, 'cy', '5.80029008'); ellipse.setAttributeNS(null, 'rx', data['rx']); ellipse.setAttributeNS(null, 'ry', data['ry']); shadow.appendChild(ellipse); } var background = DOM.createNS('http://www.w3.org/2000/svg', 'g'); background.setAttributeNS(null, 'fill', '#3FB1CE'); var bgPath = DOM.createNS('http://www.w3.org/2000/svg', 'path'); bgPath.setAttributeNS(null, 'd', 'M27,13.5 C27,19.074644 20.250001,27.000002 14.75,34.500002 C14.016665,35.500004 12.983335,35.500004 12.25,34.500002 C6.7499993,27.000002 0,19.222562 0,13.5 C0,6.0441559 6.0441559,0 13.5,0 C20.955844,0 27,6.0441559 27,13.5 Z'); background.appendChild(bgPath); var border = DOM.createNS('http://www.w3.org/2000/svg', 'g'); border.setAttributeNS(null, 'opacity', '0.25'); border.setAttributeNS(null, 'fill', '#000000'); var borderPath = DOM.createNS('http://www.w3.org/2000/svg', 'path'); borderPath.setAttributeNS(null, 'd', 'M13.5,0 C6.0441559,0 0,6.0441559 0,13.5 C0,19.222562 6.7499993,27 12.25,34.5 C13,35.522727 14.016664,35.500004 14.75,34.5 C20.250001,27 27,19.074644 27,13.5 C27,6.0441559 20.955844,0 13.5,0 Z M13.5,1 C20.415404,1 26,6.584596 26,13.5 C26,15.898657 24.495584,19.181431 22.220703,22.738281 C19.945823,26.295132 16.705119,30.142167 13.943359,33.908203 C13.743445,34.180814 13.612715,34.322738 13.5,34.441406 C13.387285,34.322738 13.256555,34.180814 13.056641,33.908203 C10.284481,30.127985 7.4148684,26.314159 5.015625,22.773438 C2.6163816,19.232715 1,15.953538 1,13.5 C1,6.584596 6.584596,1 13.5,1 Z'); border.appendChild(borderPath); var maki = DOM.createNS('http://www.w3.org/2000/svg', 'g'); maki.setAttributeNS(null, 'transform', 'translate(6.0, 7.0)'); maki.setAttributeNS(null, 'fill', '#FFFFFF'); var circleContainer = DOM.createNS('http://www.w3.org/2000/svg', 'g'); circleContainer.setAttributeNS(null, 'transform', 'translate(8.0, 8.0)'); var circle1 = DOM.createNS('http://www.w3.org/2000/svg', 'circle'); circle1.setAttributeNS(null, 'fill', '#000000'); circle1.setAttributeNS(null, 'opacity', '0.25'); circle1.setAttributeNS(null, 'cx', '5.5'); circle1.setAttributeNS(null, 'cy', '5.5'); circle1.setAttributeNS(null, 'r', '5.4999962'); var circle2 = DOM.createNS('http://www.w3.org/2000/svg', 'circle'); circle2.setAttributeNS(null, 'fill', '#FFFFFF'); circle2.setAttributeNS(null, 'cx', '5.5'); circle2.setAttributeNS(null, 'cy', '5.5'); circle2.setAttributeNS(null, 'r', '5.4999962'); circleContainer.appendChild(circle1); circleContainer.appendChild(circle2); page1.appendChild(shadow); page1.appendChild(background); page1.appendChild(border); page1.appendChild(maki); page1.appendChild(circleContainer); svg.appendChild(page1); element.appendChild(svg); // if no element and no offset option given apply an offset for the default marker // the -14 as the y value of the default marker offset was determined as follows // // the marker tip is at the center of the shadow ellipse from the default svg // the y value of the center of the shadow ellipse relative to the svg top left is "shadow transform translate-y (29.0) + ellipse cy (5.80029008)" // offset to the svg center "height (41 / 2)" gives (29.0 + 5.80029008) - (41 / 2) and rounded for an integer pixel offset gives 14 // negative is used to move the marker up from the center so the tip is at the Marker lngLat var defaultMarkerOffset = [0, -14]; if (!(options && options.offset)) { if (!options) { options = { offset: defaultMarkerOffset }; } else { options.offset = defaultMarkerOffset; } } } this._offset = Point.convert(options && options.offset || [0, 0]); element.classList.add('mapboxgl-marker'); this._element = element; this._popup = null; }; /** * Attaches the marker to a map * @param {Map} map * @returns {Marker} `this` */ Marker.prototype.addTo = function addTo (map ) { this.remove(); this._map = map; map.getCanvasContainer().appendChild(this._element); map.on('move', this._update); map.on('moveend', this._update); this._update(); // If we attached the `click` listener to the marker element, the popup // would close once the event propogated to `map` due to the // `Popup#_onClickClose` listener. this._map.on('click', this._onMapClick); return this; }; /** * Removes the marker from a map * @example * var marker = new mapboxgl.Marker().addTo(map); * marker.remove(); * @returns {Marker} `this` */ Marker.prototype.remove = function remove () { if (this._map) { this._map.off('click', this._onMapClick); this._map.off('move', this._update); this._map.off('moveend', this._update); delete this._map; } DOM.remove(this._element); if (this._popup) { this._popup.remove(); } return this; }; /** * Get the marker's geographical location. * * The longitude of the result may differ by a multiple of 360 degrees from the longitude previously * set by `setLngLat` because `Marker` wraps the anchor longitude across copies of the world to keep * the marker on screen. * * @returns {LngLat} */ Marker.prototype.getLngLat = function getLngLat () { return this._lngLat; }; /** * Set the marker's geographical position and move it. * @returns {Marker} `this` */ Marker.prototype.setLngLat = function setLngLat (lnglat ) { this._lngLat = LngLat.convert(lnglat); this._pos = null; if (this._popup) { this._popup.setLngLat(this._lngLat); } this._update(); return this; }; /** * Returns the `Marker`'s HTML element. * @returns {HTMLElement} element */ Marker.prototype.getElement = function getElement () { return this._element; }; /** * Binds a Popup to the Marker * @param popup an instance of the `Popup` class. If undefined or null, any popup * set on this `Marker` instance is unset * @returns {Marker} `this` */ Marker.prototype.setPopup = function setPopup (popup ) { if (this._popup) { this._popup.remove(); this._popup = null; } if (popup) { if (!('offset' in popup.options)) { popup.options.offset = this._offset; } this._popup = popup; if (this._lngLat) { this._popup.setLngLat(this._lngLat); } } return this; }; Marker.prototype._onMapClick = function _onMapClick (event ) { var targetElement = event.originalEvent.target; var element = this._element; if (this._popup && (targetElement === element || element.contains((targetElement )))) { this.togglePopup(); } }; /** * Returns the Popup instance that is bound to the Marker * @returns {Popup} popup */ Marker.prototype.getPopup = function getPopup () { return this._popup; }; /** * Opens or closes the bound popup, depending on the current state * @returns {Marker} `this` */ Marker.prototype.togglePopup = function togglePopup () { var popup = this._popup; if (!popup) { return this; } else if (popup.isOpen()) { popup.remove(); } else { popup.addTo(this._map); } return this; }; Marker.prototype._update = function _update (e ) { if (!this._map) { return; } if (this._map.transform.renderWorldCopies) { this._lngLat = smartWrap(this._lngLat, this._pos, this._map.transform); } this._pos = this._map.project(this._lngLat)._add(this._offset); // because rounding the coordinates at every `move` event causes stuttered zooming // we only round them when _update is called with `moveend` or when its called with // no arguments (when the Marker is initialized or Marker#setLngLat is invoked). if (!e || e.type === "moveend") { this._pos = this._pos.round(); } DOM.setTransform(this._element, ("translate(-50%, -50%) translate(" + (this._pos.x) + "px, " + (this._pos.y) + "px)")); }; /** * Get the marker's offset. * @returns {Point} */ Marker.prototype.getOffset = function getOffset () { return this._offset; }; /** * Sets the offset of the marker * @param {PointLike} offset The offset in pixels as a {@link PointLike} object to apply relative to the element's center. Negatives indicate left and up. * @returns {Marker} `this` */ Marker.prototype.setOffset = function setOffset (offset ) { this._offset = Point.convert(offset); this._update(); return this; }; module.exports = Marker; },{"../geo/lng_lat":67,"../util/dom":264,"../util/smart_wrap":275,"../util/util":280,"@mapbox/point-geometry":4}],254:[function(require,module,exports){ 'use strict';// var util = require('../util/util'); var Evented = require('../util/evented'); var DOM = require('../util/dom'); var LngLat = require('../geo/lng_lat'); var Point = require('@mapbox/point-geometry'); var window = require('../util/window'); var smartWrap = require('../util/smart_wrap'); var defaultOptions = { closeButton: true, closeOnClick: true }; /** * A popup component. * * @param {Object} [options] * @param {boolean} [options.closeButton=true] If `true`, a close button will appear in the * top right corner of the popup. * @param {boolean} [options.closeOnClick=true] If `true`, the popup will closed when the * map is clicked. * @param {string} [options.anchor] - A string indicating the popup's location relative to * the coordinate set via {@link Popup#setLngLat}. * Options are `'top'`, `'bottom'`, `'left'`, `'right'`, `'top-left'`, * `'top-right'`, `'bottom-left'`, and `'bottom-right'`. If unset the anchor will be * dynamically set to ensure the popup falls within the map container with a preference * for `'bottom'`. * @param {number|PointLike|Object} [options.offset] - * A pixel offset applied to the popup's location specified as: * - a single number specifying a distance from the popup's location * - a {@link PointLike} specifying a constant offset * - an object of {@link Point}s specifing an offset for each anchor position * Negative offsets indicate left and up. * @example * var markerHeight = 50, markerRadius = 10, linearOffset = 25; * var popupOffsets = { * 'top': [0, 0], * 'top-left': [0,0], * 'top-right': [0,0], * 'bottom': [0, -markerHeight], * 'bottom-left': [linearOffset, (markerHeight - markerRadius + linearOffset) * -1], * 'bottom-right': [-linearOffset, (markerHeight - markerRadius + linearOffset) * -1], * 'left': [markerRadius, (markerHeight - markerRadius) * -1], * 'right': [-markerRadius, (markerHeight - markerRadius) * -1] * }; * var popup = new mapboxgl.Popup({offset:popupOffsets}) * .setLngLat(e.lngLat) * .setHTML("

Hello World!

") * .addTo(map); * @see [Display a popup](https://www.mapbox.com/mapbox-gl-js/example/popup/) * @see [Display a popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/) * @see [Display a popup on click](https://www.mapbox.com/mapbox-gl-js/example/popup-on-click/) */ var Popup = (function (Evented) { function Popup(options ) { Evented.call(this); this.options = util.extend(Object.create(defaultOptions), options); util.bindAll(['_update', '_onClickClose'], this); } if ( Evented ) Popup.__proto__ = Evented; Popup.prototype = Object.create( Evented && Evented.prototype ); Popup.prototype.constructor = Popup; /** * Adds the popup to a map. * * @param {Map} map The Mapbox GL JS map to add the popup to. * @returns {Popup} `this` */ Popup.prototype.addTo = function addTo (map ) { this._map = map; this._map.on('move', this._update); if (this.options.closeOnClick) { this._map.on('click', this._onClickClose); } this._update(); return this; }; /** * @returns {boolean} `true` if the popup is open, `false` if it is closed. */ Popup.prototype.isOpen = function isOpen () { return !!this._map; }; /** * Removes the popup from the map it has been added to. * * @example * var popup = new mapboxgl.Popup().addTo(map); * popup.remove(); * @returns {Popup} `this` */ Popup.prototype.remove = function remove () { if (this._content) { DOM.remove(this._content); } if (this._container) { DOM.remove(this._container); delete this._container; } if (this._map) { this._map.off('move', this._update); this._map.off('click', this._onClickClose); delete this._map; } /** * Fired when the popup is closed manually or programatically. * * @event close * @memberof Popup * @instance * @type {Object} * @property {Popup} popup object that was closed */ this.fire('close'); return this; }; /** * Returns the geographical location of the popup's anchor. * * The longitude of the result may differ by a multiple of 360 degrees from the longitude previously * set by `setLngLat` because `Popup` wraps the anchor longitude across copies of the world to keep * the popup on screen. * * @returns {LngLat} The geographical location of the popup's anchor. */ Popup.prototype.getLngLat = function getLngLat () { return this._lngLat; }; /** * Sets the geographical location of the popup's anchor, and moves the popup to it. * * @param lnglat The geographical location to set as the popup's anchor. * @returns {Popup} `this` */ Popup.prototype.setLngLat = function setLngLat (lnglat ) { this._lngLat = LngLat.convert(lnglat); this._pos = null; this._update(); return this; }; /** * Sets the popup's content to a string of text. * * This function creates a [Text](https://developer.mozilla.org/en-US/docs/Web/API/Text) node in the DOM, * so it cannot insert raw HTML. Use this method for security against XSS * if the popup content is user-provided. * * @param text Textual content for the popup. * @returns {Popup} `this` * @example * var popup = new mapboxgl.Popup() * .setLngLat(e.lngLat) * .setText('Hello, world!') * .addTo(map); */ Popup.prototype.setText = function setText (text ) { return this.setDOMContent(window.document.createTextNode(text)); }; /** * Sets the popup's content to the HTML provided as a string. * * This method does not perform HTML filtering or sanitization, and must be * used only with trusted content. Consider {@link Popup#setText} if * the content is an untrusted text string. * * @param html A string representing HTML content for the popup. * @returns {Popup} `this` */ Popup.prototype.setHTML = function setHTML (html ) { var frag = window.document.createDocumentFragment(); var temp = window.document.createElement('body'); var child; temp.innerHTML = html; while (true) { child = temp.firstChild; if (!child) { break; } frag.appendChild(child); } return this.setDOMContent(frag); }; /** * Sets the popup's content to the element provided as a DOM node. * * @param htmlNode A DOM node to be used as content for the popup. * @returns {Popup} `this` * @example * // create an element with the popup content * var div = window.document.createElement('div'); * div.innerHTML = 'Hello, world!'; * var popup = new mapboxgl.Popup() * .setLngLat(e.lngLat) * .setDOMContent(div) * .addTo(map); */ Popup.prototype.setDOMContent = function setDOMContent (htmlNode ) { this._createContent(); this._content.appendChild(htmlNode); this._update(); return this; }; Popup.prototype._createContent = function _createContent () { if (this._content) { DOM.remove(this._content); } this._content = DOM.create('div', 'mapboxgl-popup-content', this._container); if (this.options.closeButton) { this._closeButton = DOM.create('button', 'mapboxgl-popup-close-button', this._content); this._closeButton.type = 'button'; this._closeButton.setAttribute('aria-label', 'Close popup'); this._closeButton.innerHTML = '×'; this._closeButton.addEventListener('click', this._onClickClose); } }; Popup.prototype._update = function _update () { if (!this._map || !this._lngLat || !this._content) { return; } if (!this._container) { this._container = DOM.create('div', 'mapboxgl-popup', this._map.getContainer()); this._tip = DOM.create('div', 'mapboxgl-popup-tip', this._container); this._container.appendChild(this._content); } if (this._map.transform.renderWorldCopies) { this._lngLat = smartWrap(this._lngLat, this._pos, this._map.transform); } var pos = this._pos = this._map.project(this._lngLat); var anchor = this.options.anchor; var offset = normalizeOffset(this.options.offset); if (!anchor) { var width = this._container.offsetWidth, height = this._container.offsetHeight; if (pos.y + offset.bottom.y < height) { anchor = ['top']; } else if (pos.y > this._map.transform.height - height) { anchor = ['bottom']; } else { anchor = []; } if (pos.x < width / 2) { anchor.push('left'); } else if (pos.x > this._map.transform.width - width / 2) { anchor.push('right'); } if (anchor.length === 0) { anchor = 'bottom'; } else { anchor = anchor.join('-'); } } var offsetedPos = pos.add(offset[anchor]).round(); var anchorTranslate = { 'top': 'translate(-50%,0)', 'top-left': 'translate(0,0)', 'top-right': 'translate(-100%,0)', 'bottom': 'translate(-50%,-100%)', 'bottom-left': 'translate(0,-100%)', 'bottom-right': 'translate(-100%,-100%)', 'left': 'translate(0,-50%)', 'right': 'translate(-100%,-50%)' }; var classList = this._container.classList; for (var key in anchorTranslate) { classList.remove(("mapboxgl-popup-anchor-" + key)); } classList.add(("mapboxgl-popup-anchor-" + anchor)); DOM.setTransform(this._container, ((anchorTranslate[anchor]) + " translate(" + (offsetedPos.x) + "px," + (offsetedPos.y) + "px)")); }; Popup.prototype._onClickClose = function _onClickClose () { this.remove(); }; return Popup; }(Evented)); function normalizeOffset(offset ) { if (!offset) { return normalizeOffset(new Point(0, 0)); } else if (typeof offset === 'number') { // input specifies a radius from which to calculate offsets at all positions var cornerOffset = Math.round(Math.sqrt(0.5 * Math.pow(offset, 2))); return { 'top': new Point(0, offset), 'top-left': new Point(cornerOffset, cornerOffset), 'top-right': new Point(-cornerOffset, cornerOffset), 'bottom': new Point(0, -offset), 'bottom-left': new Point(cornerOffset, -cornerOffset), 'bottom-right': new Point(-cornerOffset, -cornerOffset), 'left': new Point(offset, 0), 'right': new Point(-offset, 0) }; } else if (offset instanceof Point || Array.isArray(offset)) { // input specifies a single offset to be applied to all positions var convertedOffset = Point.convert(offset); return { 'top': convertedOffset, 'top-left': convertedOffset, 'top-right': convertedOffset, 'bottom': convertedOffset, 'bottom-left': convertedOffset, 'bottom-right': convertedOffset, 'left': convertedOffset, 'right': convertedOffset }; } else { // input specifies an offset per position return { 'top': Point.convert(offset['top'] || [0, 0]), 'top-left': Point.convert(offset['top-left'] || [0, 0]), 'top-right': Point.convert(offset['top-right'] || [0, 0]), 'bottom': Point.convert(offset['bottom'] || [0, 0]), 'bottom-left': Point.convert(offset['bottom-left'] || [0, 0]), 'bottom-right': Point.convert(offset['bottom-right'] || [0, 0]), 'left': Point.convert(offset['left'] || [0, 0]), 'right': Point.convert(offset['right'] || [0, 0]) }; } } module.exports = Popup; },{"../geo/lng_lat":67,"../util/dom":264,"../util/evented":265,"../util/smart_wrap":275,"../util/util":280,"../util/window":259,"@mapbox/point-geometry":4}],255:[function(require,module,exports){ 'use strict';// var util = require('./util'); var ref = require('./web_worker_transfer'); var serialize = ref.serialize; var deserialize = ref.deserialize; /** * An implementation of the [Actor design pattern](http://en.wikipedia.org/wiki/Actor_model) * that maintains the relationship between asynchronous tasks and the objects * that spin them off - in this case, tasks like parsing parts of styles, * owned by the styles * * @param {WebWorker} target * @param {WebWorker} parent * @param {string|number} mapId A unique identifier for the Map instance using this Actor. * @private */ var Actor = function Actor(target , parent , mapId ) { this.target = target; this.parent = parent; this.mapId = mapId; this.callbacks = {}; this.callbackID = 0; util.bindAll(['receive'], this); this.target.addEventListener('message', this.receive, false); }; /** * Sends a message from a main-thread map to a Worker or from a Worker back to * a main-thread map instance. * * @param type The name of the target method to invoke or '[source-type].name' for a method on a WorkerSource. * @param targetMapId A particular mapId to which to send this message. * @private */ Actor.prototype.send = function send (type , data , callback , targetMapId ) { var id = callback ? ((this.mapId) + ":" + (this.callbackID++)) : null; if (callback) { this.callbacks[id] = callback; } var buffers = []; this.target.postMessage({ targetMapId: targetMapId, sourceMapId: this.mapId, type: type, id: String(id), data: serialize(data, buffers) }, buffers); }; Actor.prototype.receive = function receive (message ) { var this$1 = this; var data = message.data, id = data.id; var callback; if (data.targetMapId && this.mapId !== data.targetMapId) { return; } var done = function (err, data) { var buffers = []; this$1.target.postMessage({ sourceMapId: this$1.mapId, type: '', id: String(id), error: err ? String(err) : null, data: serialize(data, buffers) }, buffers); }; if (data.type === '') { callback = this.callbacks[data.id]; delete this.callbacks[data.id]; if (callback && data.error) { callback(new Error(data.error)); } else if (callback) { callback(null, deserialize(data.data)); } } else if (typeof data.id !== 'undefined' && this.parent[data.type]) { // data.type == 'loadTile', 'removeTile', etc. this.parent[data.type](data.sourceMapId, deserialize(data.data), done); } else if (typeof data.id !== 'undefined' && this.parent.getWorkerSource) { // data.type == sourcetype.method var keys = data.type.split('.'); var workerSource = (this.parent ).getWorkerSource(data.sourceMapId, keys[0]); workerSource[keys[1]](deserialize(data.data), done); } else { this.parent[data.type](deserialize(data.data)); } }; Actor.prototype.remove = function remove () { this.target.removeEventListener('message', this.receive, false); }; module.exports = Actor; },{"./util":280,"./web_worker_transfer":283}],256:[function(require,module,exports){ 'use strict';// var window = require('./window'); /** * The type of a resource. * @private * @readonly * @enum {string} */ var ResourceType = { Unknown: 'Unknown', Style: 'Style', Source: 'Source', Tile: 'Tile', Glyphs: 'Glyphs', SpriteImage: 'SpriteImage', SpriteJSON: 'SpriteJSON', Image: 'Image' }; exports.ResourceType = ResourceType; if (typeof Object.freeze == 'function') { Object.freeze(ResourceType); } /** * A `RequestParameters` object to be returned from Map.options.transformRequest callbacks. * @typedef {Object} RequestParameters * @property {string} url The URL to be requested. * @property {Object} headers The headers to be sent with the request. * @property {string} credentials `'same-origin'|'include'` Use 'include' to send cookies with cross-origin requests. */ var AJAXError = (function (Error) { function AJAXError(message , status ) { Error.call(this, message); this.status = status; } if ( Error ) AJAXError.__proto__ = Error; AJAXError.prototype = Object.create( Error && Error.prototype ); AJAXError.prototype.constructor = AJAXError; return AJAXError; }(Error)); function makeRequest(requestParameters ) { var xhr = new window.XMLHttpRequest(); xhr.open('GET', requestParameters.url, true); for (var k in requestParameters.headers) { xhr.setRequestHeader(k, requestParameters.headers[k]); } xhr.withCredentials = requestParameters.credentials === 'include'; return xhr; } exports.getJSON = function(requestParameters , callback ) { var xhr = makeRequest(requestParameters); xhr.setRequestHeader('Accept', 'application/json'); xhr.onerror = function() { callback(new Error(xhr.statusText)); }; xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 300 && xhr.response) { var data; try { data = JSON.parse(xhr.response); } catch (err) { return callback(err); } callback(null, data); } else { callback(new AJAXError(xhr.statusText, xhr.status)); } }; xhr.send(); return xhr; }; exports.getArrayBuffer = function(requestParameters , callback ) { var xhr = makeRequest(requestParameters); xhr.responseType = 'arraybuffer'; xhr.onerror = function() { callback(new Error(xhr.statusText)); }; xhr.onload = function() { var response = xhr.response; if (response.byteLength === 0 && xhr.status === 200) { return callback(new Error('http status 200 returned without content.')); } if (xhr.status >= 200 && xhr.status < 300 && xhr.response) { callback(null, { data: response, cacheControl: xhr.getResponseHeader('Cache-Control'), expires: xhr.getResponseHeader('Expires') }); } else { callback(new AJAXError(xhr.statusText, xhr.status)); } }; xhr.send(); return xhr; }; function sameOrigin(url) { var a = window.document.createElement('a'); a.href = url; return a.protocol === window.document.location.protocol && a.host === window.document.location.host; } var transparentPngUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII='; exports.getImage = function(requestParameters , callback ) { // request the image with XHR to work around caching issues // see https://github.com/mapbox/mapbox-gl-js/issues/1470 return exports.getArrayBuffer(requestParameters, function (err, imgData) { if (err) { callback(err); } else if (imgData) { var img = new window.Image(); var URL = window.URL || window.webkitURL; img.onload = function () { callback(null, img); URL.revokeObjectURL(img.src); }; var blob = new window.Blob([new Uint8Array(imgData.data)], { type: 'image/png' }); (img ).cacheControl = imgData.cacheControl; (img ).expires = imgData.expires; img.src = imgData.data.byteLength ? URL.createObjectURL(blob) : transparentPngUrl; } }); }; exports.getVideo = function(urls , callback ) { var video = window.document.createElement('video'); video.onloadstart = function() { callback(null, video); }; for (var i = 0; i < urls.length; i++) { var s = window.document.createElement('source'); if (!sameOrigin(urls[i])) { video.crossOrigin = 'Anonymous'; } s.src = urls[i]; video.appendChild(s); } return video; }; },{"./window":259}],257:[function(require,module,exports){ 'use strict';// var window = require('./window'); var now = window.performance && window.performance.now ? window.performance.now.bind(window.performance) : Date.now.bind(Date); var frame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; var cancel = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.msCancelAnimationFrame; /** * @private */ module.exports = { /** * Provides a function that outputs milliseconds: either performance.now() * or a fallback to Date.now() */ now: now, frame: function frame$1(fn ) { return frame(fn); }, cancelFrame: function cancelFrame(id ) { return cancel(id); }, getImageData: function getImageData(img ) { var canvas = window.document.createElement('canvas'); var context = canvas.getContext('2d'); if (!context) { throw new Error('failed to create canvas 2d context'); } canvas.width = img.width; canvas.height = img.height; context.drawImage(img, 0, 0, img.width, img.height); return context.getImageData(0, 0, img.width, img.height); }, hardwareConcurrency: window.navigator.hardwareConcurrency || 4, get devicePixelRatio() { return window.devicePixelRatio; }, supportsWebp: false }; var webpImgTest = window.document.createElement('img'); webpImgTest.onload = function() { module.exports.supportsWebp = true; }; webpImgTest.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA='; },{"./window":259}],258:[function(require,module,exports){ 'use strict';// var WebWorkify = require('webworkify'); var window = require('../window'); var workerURL = window.URL.createObjectURL(new WebWorkify(require('../../source/worker'), {bare: true})); module.exports = function () { return (new window.Worker(workerURL) ); }; },{"../../source/worker":123,"../window":259,"webworkify":41}],259:[function(require,module,exports){ 'use strict';// /* eslint-env browser */ module.exports = (self ); },{}],260:[function(require,module,exports){ 'use strict';// var quickselect = require('quickselect'); var calculateSignedArea = require('./util').calculateSignedArea; // classifies an array of rings into polygons with outer rings and holes module.exports = function classifyRings(rings , maxRings ) { var len = rings.length; if (len <= 1) { return [rings]; } var polygons = []; var polygon, ccw; for (var i = 0; i < len; i++) { var area = calculateSignedArea(rings[i]); if (area === 0) { continue; } (rings[i] ).area = Math.abs(area); if (ccw === undefined) { ccw = area < 0; } if (ccw === area < 0) { if (polygon) { polygons.push(polygon); } polygon = [rings[i]]; } else { (polygon ).push(rings[i]); } } if (polygon) { polygons.push(polygon); } // Earcut performance degrages with the # of rings in a polygon. For this // reason, we limit strip out all but the `maxRings` largest rings. if (maxRings > 1) { for (var j = 0; j < polygons.length; j++) { if (polygons[j].length <= maxRings) { continue; } quickselect(polygons[j], maxRings, 1, polygons[j].length - 1, compareAreas); polygons[j] = polygons[j].slice(0, maxRings); } } return polygons; }; function compareAreas(a, b) { return b.area - a.area; } },{"./util":280,"quickselect":33}],261:[function(require,module,exports){ 'use strict';// var config = { API_URL: 'https://api.mapbox.com', REQUIRE_ACCESS_TOKEN: true, ACCESS_TOKEN: null }; module.exports = config; },{}],262:[function(require,module,exports){ 'use strict';// var assert = require('assert'); var DictionaryCoder = function DictionaryCoder(strings ) { var this$1 = this; this._stringToNumber = {}; this._numberToString = []; for (var i = 0; i < strings.length; i++) { var string = strings[i]; this$1._stringToNumber[string] = i; this$1._numberToString[i] = string; } }; DictionaryCoder.prototype.encode = function encode (string ) { assert(string in this._stringToNumber); return this._stringToNumber[string]; }; DictionaryCoder.prototype.decode = function decode (n ) { assert(n < this._numberToString.length); return this._numberToString[n]; }; module.exports = DictionaryCoder; },{"assert":13}],263:[function(require,module,exports){ 'use strict';// var util = require('./util'); var Actor = require('./actor'); /** * Responsible for sending messages from a {@link Source} to an associated * {@link WorkerSource}. * * @interface Dispatcher * @private */ var Dispatcher = function Dispatcher(workerPool , parent ) { var this$1 = this; this.workerPool = workerPool; this.actors = []; this.currentActor = 0; this.id = util.uniqueId(); var workers = this.workerPool.acquire(this.id); for (var i = 0; i < workers.length; i++) { var worker = workers[i]; var actor = new Actor(worker, parent, this$1.id); actor.name = "Worker " + i; this$1.actors.push(actor); } }; /** * Broadcast a message to all Workers. */ Dispatcher.prototype.broadcast = function broadcast (type , data , cb ) { cb = cb || function () {}; util.asyncAll(this.actors, function (actor, done) { actor.send(type, data, done); }, cb); }; /** * Send a message to a Worker. * @param targetID The ID of the Worker to which to send this message. Omit to allow the dispatcher to choose. * @returns The ID of the worker to which the message was sent. */ Dispatcher.prototype.send = function send (type , data , callback , targetID ) { if (typeof targetID !== 'number' || isNaN(targetID)) { // Use round robin to send requests to web workers. targetID = this.currentActor = (this.currentActor + 1) % this.actors.length; } this.actors[targetID].send(type, data, callback); return targetID; }; Dispatcher.prototype.remove = function remove () { this.actors.forEach(function (actor) { actor.remove(); }); this.actors = []; this.workerPool.release(this.id); }; module.exports = Dispatcher; },{"./actor":255,"./util":280}],264:[function(require,module,exports){ 'use strict';// var Point = require('@mapbox/point-geometry'); var window = require('./window'); exports.create = function (tagName , className , container ) { var el = window.document.createElement(tagName); if (className) { el.className = className; } if (container) { container.appendChild(el); } return el; }; exports.createNS = function (namespaceURI , tagName ) { var el = window.document.createElementNS(namespaceURI, tagName); return el; }; var docStyle = (window.document.documentElement ).style; function testProp(props) { for (var i = 0; i < props.length; i++) { if (props[i] in docStyle) { return props[i]; } } return props[0]; } var selectProp = testProp(['userSelect', 'MozUserSelect', 'WebkitUserSelect', 'msUserSelect']); var userSelect; exports.disableDrag = function () { if (selectProp) { userSelect = docStyle[selectProp]; docStyle[selectProp] = 'none'; } }; exports.enableDrag = function () { if (selectProp) { docStyle[selectProp] = userSelect; } }; var transformProp = testProp(['transform', 'WebkitTransform']); exports.setTransform = function(el , value ) { (el.style )[transformProp] = value; }; // Suppress the next click, but only if it's immediate. var suppressClick = function (e) { e.preventDefault(); e.stopPropagation(); window.removeEventListener('click', suppressClick, true); }; exports.suppressClick = function() { window.addEventListener('click', suppressClick, true); window.setTimeout(function () { window.removeEventListener('click', suppressClick, true); }, 0); }; exports.mousePos = function (el , e ) { var rect = el.getBoundingClientRect(); e = e.touches ? e.touches[0] : e; return new Point( e.clientX - rect.left - el.clientLeft, e.clientY - rect.top - el.clientTop ); }; exports.touchPos = function (el , e ) { var rect = el.getBoundingClientRect(), points = []; var touches = (e.type === 'touchend') ? e.changedTouches : e.touches; for (var i = 0; i < touches.length; i++) { points.push(new Point( touches[i].clientX - rect.left - el.clientLeft, touches[i].clientY - rect.top - el.clientTop )); } return points; }; exports.remove = function(node ) { if (node.parentNode) { node.parentNode.removeChild(node); } }; },{"./window":259,"@mapbox/point-geometry":4}],265:[function(require,module,exports){ 'use strict';// var util = require('./util'); function _addEventListener(type , listener , listenerList ) { listenerList[type] = listenerList[type] || []; listenerList[type].push(listener); } function _removeEventListener(type , listener , listenerList ) { if (listenerList && listenerList[type]) { var index = listenerList[type].indexOf(listener); if (index !== -1) { listenerList[type].splice(index, 1); } } } /** * Methods mixed in to other classes for event capabilities. * * @mixin Evented */ var Evented = function Evented () {}; Evented.prototype.on = function on (type , listener ) { this._listeners = this._listeners || {}; _addEventListener(type, listener, this._listeners); return this; }; /** * Removes a previously registered event listener. * * @param {string} type The event type to remove listeners for. * @param {Function} listener The listener function to remove. * @returns {Object} `this` */ Evented.prototype.off = function off (type , listener ) { _removeEventListener(type, listener, this._listeners); _removeEventListener(type, listener, this._oneTimeListeners); return this; }; /** * Adds a listener that will be called only once to a specified event type. * * The listener will be called first time the event fires after the listener is registered. * * @param {string} type The event type to listen for. * @param {Function} listener The function to be called when the event is fired the first time. * @returns {Object} `this` */ Evented.prototype.once = function once (type , listener ) { this._oneTimeListeners = this._oneTimeListeners || {}; _addEventListener(type, listener, this._oneTimeListeners); return this; }; /** * Fires an event of the specified type. * * @param {string} type The type of event to fire. * @param {Object} [data] Data to be passed to any listeners. * @returns {Object} `this` */ Evented.prototype.fire = function fire (type , data ) { var this$1 = this; if (this.listens(type)) { data = util.extend({}, data, {type: type, target: this}); // make sure adding or removing listeners inside other listeners won't cause an infinite loop var listeners = this._listeners && this._listeners[type] ? this._listeners[type].slice() : []; for (var i = 0, list = listeners; i < list.length; i += 1) { var listener = list[i]; listener.call(this$1, data); } var oneTimeListeners = this._oneTimeListeners && this._oneTimeListeners[type] ? this._oneTimeListeners[type].slice() : []; for (var i$1 = 0, list$1 = oneTimeListeners; i$1 < list$1.length; i$1 += 1) { var listener$1 = list$1[i$1]; _removeEventListener(type, listener$1, this$1._oneTimeListeners); listener$1.call(this$1, data); } if (this._eventedParent) { this._eventedParent.fire(type, util.extend({}, data, typeof this._eventedParentData === 'function' ? this._eventedParentData() : this._eventedParentData)); } // To ensure that no error events are dropped, print them to the // console if they have no listeners. } else if (util.endsWith(type, 'error')) { console.error((data && data.error) || data || 'Empty error event'); } return this; }; /** * Returns a true if this instance of Evented or any forwardeed instances of Evented have a listener for the specified type. * * @param {string} type The event type * @returns {boolean} `true` if there is at least one registered listener for specified event type, `false` otherwise */ Evented.prototype.listens = function listens (type ) { return ( (this._listeners && this._listeners[type] && this._listeners[type].length > 0) || (this._oneTimeListeners && this._oneTimeListeners[type] && this._oneTimeListeners[type].length > 0) || (this._eventedParent && this._eventedParent.listens(type)) ); }; /** * Bubble all events fired by this instance of Evented to this parent instance of Evented. * * @private * @returns {Object} `this` */ Evented.prototype.setEventedParent = function setEventedParent (parent , data ) { this._eventedParent = parent; this._eventedParentData = data; return this; }; module.exports = Evented; },{"./util":280}],266:[function(require,module,exports){ 'use strict';// var Queue = require('tinyqueue'); var Point = require('@mapbox/point-geometry'); var distToSegmentSquared = require('./intersection_tests').distToSegmentSquared; /** * Finds an approximation of a polygon's Pole Of Inaccessibiliy https://en.wikipedia.org/wiki/Pole_of_inaccessibility * This is a copy of http://github.com/mapbox/polylabel adapted to use Points * * @param polygonRings first item in array is the outer ring followed optionally by the list of holes, should be an element of the result of util/classify_rings * @param precision Specified in input coordinate units. If 0 returns after first run, if > 0 repeatedly narrows the search space until the radius of the area searched for the best pole is less than precision * @param debug Print some statistics to the console during execution * @returns Pole of Inaccessibiliy. * @private */ module.exports = function (polygonRings , precision, debug) { if ( precision === void 0 ) precision = 1; if ( debug === void 0 ) debug = false; // find the bounding box of the outer ring var minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity; var outerRing = polygonRings[0]; for (var i = 0; i < outerRing.length; i++) { var p = outerRing[i]; if (!i || p.x < minX) { minX = p.x; } if (!i || p.y < minY) { minY = p.y; } if (!i || p.x > maxX) { maxX = p.x; } if (!i || p.y > maxY) { maxY = p.y; } } var width = maxX - minX; var height = maxY - minY; var cellSize = Math.min(width, height); var h = cellSize / 2; // a priority queue of cells in order of their "potential" (max distance to polygon) var cellQueue = new Queue(null, compareMax); if (cellSize === 0) { return new Point(minX, minY); } // cover polygon with initial cells for (var x = minX; x < maxX; x += cellSize) { for (var y = minY; y < maxY; y += cellSize) { cellQueue.push(new Cell(x + h, y + h, h, polygonRings)); } } // take centroid as the first best guess var bestCell = getCentroidCell(polygonRings); var numProbes = cellQueue.length; while (cellQueue.length) { // pick the most promising cell from the queue var cell = cellQueue.pop(); // update the best cell if we found a better one if (cell.d > bestCell.d || !bestCell.d) { bestCell = cell; if (debug) { console.log('found best %d after %d probes', Math.round(1e4 * cell.d) / 1e4, numProbes); } } // do not drill down further if there's no chance of a better solution if (cell.max - bestCell.d <= precision) { continue; } // split the cell into four cells h = cell.h / 2; cellQueue.push(new Cell(cell.p.x - h, cell.p.y - h, h, polygonRings)); cellQueue.push(new Cell(cell.p.x + h, cell.p.y - h, h, polygonRings)); cellQueue.push(new Cell(cell.p.x - h, cell.p.y + h, h, polygonRings)); cellQueue.push(new Cell(cell.p.x + h, cell.p.y + h, h, polygonRings)); numProbes += 4; } if (debug) { console.log(("num probes: " + numProbes)); console.log(("best distance: " + (bestCell.d))); } return bestCell.p; }; function compareMax(a, b) { return b.max - a.max; } function Cell(x, y, h, polygon) { this.p = new Point(x, y); this.h = h; // half the cell size this.d = pointToPolygonDist(this.p, polygon); // distance from cell center to polygon this.max = this.d + this.h * Math.SQRT2; // max distance to polygon within a cell } // signed distance from point to polygon outline (negative if point is outside) function pointToPolygonDist(p, polygon) { var inside = false; var minDistSq = Infinity; for (var k = 0; k < polygon.length; k++) { var ring = polygon[k]; for (var i = 0, len = ring.length, j = len - 1; i < len; j = i++) { var a = ring[i]; var b = ring[j]; if ((a.y > p.y !== b.y > p.y) && (p.x < (b.x - a.x) * (p.y - a.y) / (b.y - a.y) + a.x)) { inside = !inside; } minDistSq = Math.min(minDistSq, distToSegmentSquared(p, a, b)); } } return (inside ? 1 : -1) * Math.sqrt(minDistSq); } // get polygon centroid function getCentroidCell(polygon) { var area = 0; var x = 0; var y = 0; var points = polygon[0]; for (var i = 0, len = points.length, j = len - 1; i < len; j = i++) { var a = points[i]; var b = points[j]; var f = a.x * b.y - b.x * a.y; x += (a.x + b.x) * f; y += (a.y + b.y) * f; area += f * 3; } return new Cell(x / area, y / area, 0, polygon); } },{"./intersection_tests":269,"@mapbox/point-geometry":4,"tinyqueue":35}],267:[function(require,module,exports){ 'use strict';// var WorkerPool = require('./worker_pool'); var globalWorkerPool; /** * Creates (if necessary) and returns the single, global WorkerPool instance * to be shared across each Map * @private */ module.exports = function getGlobalWorkerPool () { if (!globalWorkerPool) { globalWorkerPool = new WorkerPool(); } return globalWorkerPool; }; },{"./worker_pool":284}],268:[function(require,module,exports){ 'use strict';// var assert = require('assert'); var ref = require('./web_worker_transfer'); var register = ref.register; function createImage(image , ref , channels , data ) { var width = ref.width; var height = ref.height; if (!data) { data = new Uint8Array(width * height * channels); } else if (data.length !== width * height * channels) { throw new RangeError('mismatched image size'); } image.width = width; image.height = height; image.data = data; return image; } function resizeImage(image , ref , channels ) { var width = ref.width; var height = ref.height; if (width === image.width && height === image.height) { return; } var newImage = createImage({}, {width: width, height: height}, channels); copyImage(image, newImage, {x: 0, y: 0}, {x: 0, y: 0}, { width: Math.min(image.width, width), height: Math.min(image.height, height) }, channels); image.width = width; image.height = height; image.data = newImage.data; } function copyImage(srcImg , dstImg , srcPt , dstPt , size , channels ) { if (size.width === 0 || size.height === 0) { return dstImg; } if (size.width > srcImg.width || size.height > srcImg.height || srcPt.x > srcImg.width - size.width || srcPt.y > srcImg.height - size.height) { throw new RangeError('out of range source coordinates for image copy'); } if (size.width > dstImg.width || size.height > dstImg.height || dstPt.x > dstImg.width - size.width || dstPt.y > dstImg.height - size.height) { throw new RangeError('out of range destination coordinates for image copy'); } var srcData = srcImg.data; var dstData = dstImg.data; assert(srcData !== dstData); for (var y = 0; y < size.height; y++) { var srcOffset = ((srcPt.y + y) * srcImg.width + srcPt.x) * channels; var dstOffset = ((dstPt.y + y) * dstImg.width + dstPt.x) * channels; for (var i = 0; i < size.width * channels; i++) { dstData[dstOffset + i] = srcData[srcOffset + i]; } } return dstImg; } var AlphaImage = function AlphaImage(size , data ) { createImage(this, size, 1, data); }; AlphaImage.prototype.resize = function resize (size ) { resizeImage(this, size, 1); }; AlphaImage.prototype.clone = function clone () { return new AlphaImage({width: this.width, height: this.height}, new Uint8Array(this.data)); }; AlphaImage.copy = function copy (srcImg , dstImg , srcPt , dstPt , size ) { copyImage(srcImg, dstImg, srcPt, dstPt, size, 1); }; // Not premultiplied, because ImageData is not premultiplied. // UNPACK_PREMULTIPLY_ALPHA_WEBGL must be used when uploading to a texture. var RGBAImage = function RGBAImage(size , data ) { createImage(this, size, 4, data); }; RGBAImage.prototype.resize = function resize (size ) { resizeImage(this, size, 4); }; RGBAImage.prototype.clone = function clone () { return new RGBAImage({width: this.width, height: this.height}, new Uint8Array(this.data)); }; RGBAImage.copy = function copy (srcImg , dstImg , srcPt , dstPt , size ) { copyImage(srcImg, dstImg, srcPt, dstPt, size, 4); }; register('AlphaImage', AlphaImage); register('RGBAImage', RGBAImage); module.exports = { AlphaImage: AlphaImage, RGBAImage: RGBAImage }; },{"./web_worker_transfer":283,"assert":13}],269:[function(require,module,exports){ 'use strict';// var ref = require('./util'); var isCounterClockwise = ref.isCounterClockwise; module.exports = { multiPolygonIntersectsBufferedMultiPoint: multiPolygonIntersectsBufferedMultiPoint, multiPolygonIntersectsMultiPolygon: multiPolygonIntersectsMultiPolygon, multiPolygonIntersectsBufferedMultiLine: multiPolygonIntersectsBufferedMultiLine, polygonIntersectsPolygon: polygonIntersectsPolygon, distToSegmentSquared: distToSegmentSquared }; function polygonIntersectsPolygon(polygonA , polygonB ) { for (var i = 0; i < polygonA.length; i++) { if (polygonContainsPoint(polygonB, polygonA[i])) { return true; } } for (var i$1 = 0; i$1 < polygonB.length; i$1++) { if (polygonContainsPoint(polygonA, polygonB[i$1])) { return true; } } if (lineIntersectsLine(polygonA, polygonB)) { return true; } return false; } function multiPolygonIntersectsBufferedMultiPoint(multiPolygon , rings , radius ) { for (var j = 0; j < multiPolygon.length; j++) { var polygon = multiPolygon[j]; for (var i = 0; i < rings.length; i++) { var ring = rings[i]; for (var k = 0; k < ring.length; k++) { var point = ring[k]; if (polygonContainsPoint(polygon, point)) { return true; } if (pointIntersectsBufferedLine(point, polygon, radius)) { return true; } } } } return false; } function multiPolygonIntersectsMultiPolygon(multiPolygonA , multiPolygonB ) { if (multiPolygonA.length === 1 && multiPolygonA[0].length === 1) { return multiPolygonContainsPoint(multiPolygonB, multiPolygonA[0][0]); } for (var m = 0; m < multiPolygonB.length; m++) { var ring = multiPolygonB[m]; for (var n = 0; n < ring.length; n++) { if (multiPolygonContainsPoint(multiPolygonA, ring[n])) { return true; } } } for (var j = 0; j < multiPolygonA.length; j++) { var polygon = multiPolygonA[j]; for (var i = 0; i < polygon.length; i++) { if (multiPolygonContainsPoint(multiPolygonB, polygon[i])) { return true; } } for (var k = 0; k < multiPolygonB.length; k++) { if (lineIntersectsLine(polygon, multiPolygonB[k])) { return true; } } } return false; } function multiPolygonIntersectsBufferedMultiLine(multiPolygon , multiLine , radius ) { for (var i = 0; i < multiLine.length; i++) { var line = multiLine[i]; for (var j = 0; j < multiPolygon.length; j++) { var polygon = multiPolygon[j]; if (polygon.length >= 3) { for (var k = 0; k < line.length; k++) { if (polygonContainsPoint(polygon, line[k])) { return true; } } } if (lineIntersectsBufferedLine(polygon, line, radius)) { return true; } } } return false; } function lineIntersectsBufferedLine(lineA , lineB , radius ) { if (lineA.length > 1) { if (lineIntersectsLine(lineA, lineB)) { return true; } // Check whether any point in either line is within radius of the other line for (var j = 0; j < lineB.length; j++) { if (pointIntersectsBufferedLine(lineB[j], lineA, radius)) { return true; } } } for (var k = 0; k < lineA.length; k++) { if (pointIntersectsBufferedLine(lineA[k], lineB, radius)) { return true; } } return false; } function lineIntersectsLine(lineA , lineB ) { if (lineA.length === 0 || lineB.length === 0) { return false; } for (var i = 0; i < lineA.length - 1; i++) { var a0 = lineA[i]; var a1 = lineA[i + 1]; for (var j = 0; j < lineB.length - 1; j++) { var b0 = lineB[j]; var b1 = lineB[j + 1]; if (lineSegmentIntersectsLineSegment(a0, a1, b0, b1)) { return true; } } } return false; } function lineSegmentIntersectsLineSegment(a0 , a1 , b0 , b1 ) { return isCounterClockwise(a0, b0, b1) !== isCounterClockwise(a1, b0, b1) && isCounterClockwise(a0, a1, b0) !== isCounterClockwise(a0, a1, b1); } function pointIntersectsBufferedLine(p , line , radius ) { var radiusSquared = radius * radius; if (line.length === 1) { return p.distSqr(line[0]) < radiusSquared; } for (var i = 1; i < line.length; i++) { // Find line segments that have a distance <= radius^2 to p // In that case, we treat the line as "containing point p". var v = line[i - 1], w = line[i]; if (distToSegmentSquared(p, v, w) < radiusSquared) { return true; } } return false; } // Code from http://stackoverflow.com/a/1501725/331379. function distToSegmentSquared(p , v , w ) { var l2 = v.distSqr(w); if (l2 === 0) { return p.distSqr(v); } var t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2; if (t < 0) { return p.distSqr(v); } if (t > 1) { return p.distSqr(w); } return p.distSqr(w.sub(v)._mult(t)._add(v)); } // point in polygon ray casting algorithm function multiPolygonContainsPoint(rings , p ) { var c = false, ring, p1, p2; for (var k = 0; k < rings.length; k++) { ring = rings[k]; for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) { p1 = ring[i]; p2 = ring[j]; if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { c = !c; } } } return c; } function polygonContainsPoint(ring , p ) { var c = false; for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) { var p1 = ring[i]; var p2 = ring[j]; if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { c = !c; } } return c; } },{"./util":280}],270:[function(require,module,exports){ 'use strict';// // The following table comes from . // Keep it synchronized with . var unicodeBlockLookup = { // 'Basic Latin': (char) => char >= 0x0000 && char <= 0x007F, 'Latin-1 Supplement': function (char) { return char >= 0x0080 && char <= 0x00FF; }, // 'Latin Extended-A': (char) => char >= 0x0100 && char <= 0x017F, // 'Latin Extended-B': (char) => char >= 0x0180 && char <= 0x024F, // 'IPA Extensions': (char) => char >= 0x0250 && char <= 0x02AF, // 'Spacing Modifier Letters': (char) => char >= 0x02B0 && char <= 0x02FF, // 'Combining Diacritical Marks': (char) => char >= 0x0300 && char <= 0x036F, // 'Greek and Coptic': (char) => char >= 0x0370 && char <= 0x03FF, // 'Cyrillic': (char) => char >= 0x0400 && char <= 0x04FF, // 'Cyrillic Supplement': (char) => char >= 0x0500 && char <= 0x052F, // 'Armenian': (char) => char >= 0x0530 && char <= 0x058F, //'Hebrew': (char) => char >= 0x0590 && char <= 0x05FF, 'Arabic': function (char) { return char >= 0x0600 && char <= 0x06FF; }, //'Syriac': (char) => char >= 0x0700 && char <= 0x074F, 'Arabic Supplement': function (char) { return char >= 0x0750 && char <= 0x077F; }, // 'Thaana': (char) => char >= 0x0780 && char <= 0x07BF, // 'NKo': (char) => char >= 0x07C0 && char <= 0x07FF, // 'Samaritan': (char) => char >= 0x0800 && char <= 0x083F, // 'Mandaic': (char) => char >= 0x0840 && char <= 0x085F, // 'Syriac Supplement': (char) => char >= 0x0860 && char <= 0x086F, 'Arabic Extended-A': function (char) { return char >= 0x08A0 && char <= 0x08FF; }, // 'Devanagari': (char) => char >= 0x0900 && char <= 0x097F, // 'Bengali': (char) => char >= 0x0980 && char <= 0x09FF, // 'Gurmukhi': (char) => char >= 0x0A00 && char <= 0x0A7F, // 'Gujarati': (char) => char >= 0x0A80 && char <= 0x0AFF, // 'Oriya': (char) => char >= 0x0B00 && char <= 0x0B7F, // 'Tamil': (char) => char >= 0x0B80 && char <= 0x0BFF, // 'Telugu': (char) => char >= 0x0C00 && char <= 0x0C7F, // 'Kannada': (char) => char >= 0x0C80 && char <= 0x0CFF, // 'Malayalam': (char) => char >= 0x0D00 && char <= 0x0D7F, // 'Sinhala': (char) => char >= 0x0D80 && char <= 0x0DFF, // 'Thai': (char) => char >= 0x0E00 && char <= 0x0E7F, // 'Lao': (char) => char >= 0x0E80 && char <= 0x0EFF, // 'Tibetan': (char) => char >= 0x0F00 && char <= 0x0FFF, // 'Myanmar': (char) => char >= 0x1000 && char <= 0x109F, // 'Georgian': (char) => char >= 0x10A0 && char <= 0x10FF, 'Hangul Jamo': function (char) { return char >= 0x1100 && char <= 0x11FF; }, // 'Ethiopic': (char) => char >= 0x1200 && char <= 0x137F, // 'Ethiopic Supplement': (char) => char >= 0x1380 && char <= 0x139F, // 'Cherokee': (char) => char >= 0x13A0 && char <= 0x13FF, 'Unified Canadian Aboriginal Syllabics': function (char) { return char >= 0x1400 && char <= 0x167F; }, // 'Ogham': (char) => char >= 0x1680 && char <= 0x169F, // 'Runic': (char) => char >= 0x16A0 && char <= 0x16FF, // 'Tagalog': (char) => char >= 0x1700 && char <= 0x171F, // 'Hanunoo': (char) => char >= 0x1720 && char <= 0x173F, // 'Buhid': (char) => char >= 0x1740 && char <= 0x175F, // 'Tagbanwa': (char) => char >= 0x1760 && char <= 0x177F, // 'Khmer': (char) => char >= 0x1780 && char <= 0x17FF, // 'Mongolian': (char) => char >= 0x1800 && char <= 0x18AF, 'Unified Canadian Aboriginal Syllabics Extended': function (char) { return char >= 0x18B0 && char <= 0x18FF; }, // 'Limbu': (char) => char >= 0x1900 && char <= 0x194F, // 'Tai Le': (char) => char >= 0x1950 && char <= 0x197F, // 'New Tai Lue': (char) => char >= 0x1980 && char <= 0x19DF, // 'Khmer Symbols': (char) => char >= 0x19E0 && char <= 0x19FF, // 'Buginese': (char) => char >= 0x1A00 && char <= 0x1A1F, // 'Tai Tham': (char) => char >= 0x1A20 && char <= 0x1AAF, // 'Combining Diacritical Marks Extended': (char) => char >= 0x1AB0 && char <= 0x1AFF, // 'Balinese': (char) => char >= 0x1B00 && char <= 0x1B7F, // 'Sundanese': (char) => char >= 0x1B80 && char <= 0x1BBF, // 'Batak': (char) => char >= 0x1BC0 && char <= 0x1BFF, // 'Lepcha': (char) => char >= 0x1C00 && char <= 0x1C4F, // 'Ol Chiki': (char) => char >= 0x1C50 && char <= 0x1C7F, // 'Cyrillic Extended-C': (char) => char >= 0x1C80 && char <= 0x1C8F, // 'Sundanese Supplement': (char) => char >= 0x1CC0 && char <= 0x1CCF, // 'Vedic Extensions': (char) => char >= 0x1CD0 && char <= 0x1CFF, // 'Phonetic Extensions': (char) => char >= 0x1D00 && char <= 0x1D7F, // 'Phonetic Extensions Supplement': (char) => char >= 0x1D80 && char <= 0x1DBF, // 'Combining Diacritical Marks Supplement': (char) => char >= 0x1DC0 && char <= 0x1DFF, // 'Latin Extended Additional': (char) => char >= 0x1E00 && char <= 0x1EFF, // 'Greek Extended': (char) => char >= 0x1F00 && char <= 0x1FFF, 'General Punctuation': function (char) { return char >= 0x2000 && char <= 0x206F; }, // 'Superscripts and Subscripts': (char) => char >= 0x2070 && char <= 0x209F, // 'Currency Symbols': (char) => char >= 0x20A0 && char <= 0x20CF, // 'Combining Diacritical Marks for Symbols': (char) => char >= 0x20D0 && char <= 0x20FF, 'Letterlike Symbols': function (char) { return char >= 0x2100 && char <= 0x214F; }, 'Number Forms': function (char) { return char >= 0x2150 && char <= 0x218F; }, // 'Arrows': (char) => char >= 0x2190 && char <= 0x21FF, // 'Mathematical Operators': (char) => char >= 0x2200 && char <= 0x22FF, 'Miscellaneous Technical': function (char) { return char >= 0x2300 && char <= 0x23FF; }, 'Control Pictures': function (char) { return char >= 0x2400 && char <= 0x243F; }, 'Optical Character Recognition': function (char) { return char >= 0x2440 && char <= 0x245F; }, 'Enclosed Alphanumerics': function (char) { return char >= 0x2460 && char <= 0x24FF; }, // 'Box Drawing': (char) => char >= 0x2500 && char <= 0x257F, // 'Block Elements': (char) => char >= 0x2580 && char <= 0x259F, 'Geometric Shapes': function (char) { return char >= 0x25A0 && char <= 0x25FF; }, 'Miscellaneous Symbols': function (char) { return char >= 0x2600 && char <= 0x26FF; }, // 'Dingbats': (char) => char >= 0x2700 && char <= 0x27BF, // 'Miscellaneous Mathematical Symbols-A': (char) => char >= 0x27C0 && char <= 0x27EF, // 'Supplemental Arrows-A': (char) => char >= 0x27F0 && char <= 0x27FF, // 'Braille Patterns': (char) => char >= 0x2800 && char <= 0x28FF, // 'Supplemental Arrows-B': (char) => char >= 0x2900 && char <= 0x297F, // 'Miscellaneous Mathematical Symbols-B': (char) => char >= 0x2980 && char <= 0x29FF, // 'Supplemental Mathematical Operators': (char) => char >= 0x2A00 && char <= 0x2AFF, 'Miscellaneous Symbols and Arrows': function (char) { return char >= 0x2B00 && char <= 0x2BFF; }, // 'Glagolitic': (char) => char >= 0x2C00 && char <= 0x2C5F, // 'Latin Extended-C': (char) => char >= 0x2C60 && char <= 0x2C7F, // 'Coptic': (char) => char >= 0x2C80 && char <= 0x2CFF, // 'Georgian Supplement': (char) => char >= 0x2D00 && char <= 0x2D2F, // 'Tifinagh': (char) => char >= 0x2D30 && char <= 0x2D7F, // 'Ethiopic Extended': (char) => char >= 0x2D80 && char <= 0x2DDF, // 'Cyrillic Extended-A': (char) => char >= 0x2DE0 && char <= 0x2DFF, // 'Supplemental Punctuation': (char) => char >= 0x2E00 && char <= 0x2E7F, 'CJK Radicals Supplement': function (char) { return char >= 0x2E80 && char <= 0x2EFF; }, 'Kangxi Radicals': function (char) { return char >= 0x2F00 && char <= 0x2FDF; }, 'Ideographic Description Characters': function (char) { return char >= 0x2FF0 && char <= 0x2FFF; }, 'CJK Symbols and Punctuation': function (char) { return char >= 0x3000 && char <= 0x303F; }, 'Hiragana': function (char) { return char >= 0x3040 && char <= 0x309F; }, 'Katakana': function (char) { return char >= 0x30A0 && char <= 0x30FF; }, 'Bopomofo': function (char) { return char >= 0x3100 && char <= 0x312F; }, 'Hangul Compatibility Jamo': function (char) { return char >= 0x3130 && char <= 0x318F; }, 'Kanbun': function (char) { return char >= 0x3190 && char <= 0x319F; }, 'Bopomofo Extended': function (char) { return char >= 0x31A0 && char <= 0x31BF; }, 'CJK Strokes': function (char) { return char >= 0x31C0 && char <= 0x31EF; }, 'Katakana Phonetic Extensions': function (char) { return char >= 0x31F0 && char <= 0x31FF; }, 'Enclosed CJK Letters and Months': function (char) { return char >= 0x3200 && char <= 0x32FF; }, 'CJK Compatibility': function (char) { return char >= 0x3300 && char <= 0x33FF; }, 'CJK Unified Ideographs Extension A': function (char) { return char >= 0x3400 && char <= 0x4DBF; }, 'Yijing Hexagram Symbols': function (char) { return char >= 0x4DC0 && char <= 0x4DFF; }, 'CJK Unified Ideographs': function (char) { return char >= 0x4E00 && char <= 0x9FFF; }, 'Yi Syllables': function (char) { return char >= 0xA000 && char <= 0xA48F; }, 'Yi Radicals': function (char) { return char >= 0xA490 && char <= 0xA4CF; }, // 'Lisu': (char) => char >= 0xA4D0 && char <= 0xA4FF, // 'Vai': (char) => char >= 0xA500 && char <= 0xA63F, // 'Cyrillic Extended-B': (char) => char >= 0xA640 && char <= 0xA69F, // 'Bamum': (char) => char >= 0xA6A0 && char <= 0xA6FF, // 'Modifier Tone Letters': (char) => char >= 0xA700 && char <= 0xA71F, // 'Latin Extended-D': (char) => char >= 0xA720 && char <= 0xA7FF, // 'Syloti Nagri': (char) => char >= 0xA800 && char <= 0xA82F, // 'Common Indic Number Forms': (char) => char >= 0xA830 && char <= 0xA83F, // 'Phags-pa': (char) => char >= 0xA840 && char <= 0xA87F, // 'Saurashtra': (char) => char >= 0xA880 && char <= 0xA8DF, // 'Devanagari Extended': (char) => char >= 0xA8E0 && char <= 0xA8FF, // 'Kayah Li': (char) => char >= 0xA900 && char <= 0xA92F, // 'Rejang': (char) => char >= 0xA930 && char <= 0xA95F, 'Hangul Jamo Extended-A': function (char) { return char >= 0xA960 && char <= 0xA97F; }, // 'Javanese': (char) => char >= 0xA980 && char <= 0xA9DF, // 'Myanmar Extended-B': (char) => char >= 0xA9E0 && char <= 0xA9FF, // 'Cham': (char) => char >= 0xAA00 && char <= 0xAA5F, // 'Myanmar Extended-A': (char) => char >= 0xAA60 && char <= 0xAA7F, // 'Tai Viet': (char) => char >= 0xAA80 && char <= 0xAADF, // 'Meetei Mayek Extensions': (char) => char >= 0xAAE0 && char <= 0xAAFF, // 'Ethiopic Extended-A': (char) => char >= 0xAB00 && char <= 0xAB2F, // 'Latin Extended-E': (char) => char >= 0xAB30 && char <= 0xAB6F, // 'Cherokee Supplement': (char) => char >= 0xAB70 && char <= 0xABBF, // 'Meetei Mayek': (char) => char >= 0xABC0 && char <= 0xABFF, 'Hangul Syllables': function (char) { return char >= 0xAC00 && char <= 0xD7AF; }, 'Hangul Jamo Extended-B': function (char) { return char >= 0xD7B0 && char <= 0xD7FF; }, // 'High Surrogates': (char) => char >= 0xD800 && char <= 0xDB7F, // 'High Private Use Surrogates': (char) => char >= 0xDB80 && char <= 0xDBFF, // 'Low Surrogates': (char) => char >= 0xDC00 && char <= 0xDFFF, 'Private Use Area': function (char) { return char >= 0xE000 && char <= 0xF8FF; }, 'CJK Compatibility Ideographs': function (char) { return char >= 0xF900 && char <= 0xFAFF; }, // 'Alphabetic Presentation Forms': (char) => char >= 0xFB00 && char <= 0xFB4F, 'Arabic Presentation Forms-A': function (char) { return char >= 0xFB50 && char <= 0xFDFF; }, // 'Variation Selectors': (char) => char >= 0xFE00 && char <= 0xFE0F, 'Vertical Forms': function (char) { return char >= 0xFE10 && char <= 0xFE1F; }, // 'Combining Half Marks': (char) => char >= 0xFE20 && char <= 0xFE2F, 'CJK Compatibility Forms': function (char) { return char >= 0xFE30 && char <= 0xFE4F; }, 'Small Form Variants': function (char) { return char >= 0xFE50 && char <= 0xFE6F; }, 'Arabic Presentation Forms-B': function (char) { return char >= 0xFE70 && char <= 0xFEFF; }, 'Halfwidth and Fullwidth Forms': function (char) { return char >= 0xFF00 && char <= 0xFFEF; } // 'Specials': (char) => char >= 0xFFF0 && char <= 0xFFFF, // 'Linear B Syllabary': (char) => char >= 0x10000 && char <= 0x1007F, // 'Linear B Ideograms': (char) => char >= 0x10080 && char <= 0x100FF, // 'Aegean Numbers': (char) => char >= 0x10100 && char <= 0x1013F, // 'Ancient Greek Numbers': (char) => char >= 0x10140 && char <= 0x1018F, // 'Ancient Symbols': (char) => char >= 0x10190 && char <= 0x101CF, // 'Phaistos Disc': (char) => char >= 0x101D0 && char <= 0x101FF, // 'Lycian': (char) => char >= 0x10280 && char <= 0x1029F, // 'Carian': (char) => char >= 0x102A0 && char <= 0x102DF, // 'Coptic Epact Numbers': (char) => char >= 0x102E0 && char <= 0x102FF, // 'Old Italic': (char) => char >= 0x10300 && char <= 0x1032F, // 'Gothic': (char) => char >= 0x10330 && char <= 0x1034F, // 'Old Permic': (char) => char >= 0x10350 && char <= 0x1037F, // 'Ugaritic': (char) => char >= 0x10380 && char <= 0x1039F, // 'Old Persian': (char) => char >= 0x103A0 && char <= 0x103DF, // 'Deseret': (char) => char >= 0x10400 && char <= 0x1044F, // 'Shavian': (char) => char >= 0x10450 && char <= 0x1047F, // 'Osmanya': (char) => char >= 0x10480 && char <= 0x104AF, // 'Osage': (char) => char >= 0x104B0 && char <= 0x104FF, // 'Elbasan': (char) => char >= 0x10500 && char <= 0x1052F, // 'Caucasian Albanian': (char) => char >= 0x10530 && char <= 0x1056F, // 'Linear A': (char) => char >= 0x10600 && char <= 0x1077F, // 'Cypriot Syllabary': (char) => char >= 0x10800 && char <= 0x1083F, // 'Imperial Aramaic': (char) => char >= 0x10840 && char <= 0x1085F, // 'Palmyrene': (char) => char >= 0x10860 && char <= 0x1087F, // 'Nabataean': (char) => char >= 0x10880 && char <= 0x108AF, // 'Hatran': (char) => char >= 0x108E0 && char <= 0x108FF, // 'Phoenician': (char) => char >= 0x10900 && char <= 0x1091F, // 'Lydian': (char) => char >= 0x10920 && char <= 0x1093F, // 'Meroitic Hieroglyphs': (char) => char >= 0x10980 && char <= 0x1099F, // 'Meroitic Cursive': (char) => char >= 0x109A0 && char <= 0x109FF, // 'Kharoshthi': (char) => char >= 0x10A00 && char <= 0x10A5F, // 'Old South Arabian': (char) => char >= 0x10A60 && char <= 0x10A7F, // 'Old North Arabian': (char) => char >= 0x10A80 && char <= 0x10A9F, // 'Manichaean': (char) => char >= 0x10AC0 && char <= 0x10AFF, // 'Avestan': (char) => char >= 0x10B00 && char <= 0x10B3F, // 'Inscriptional Parthian': (char) => char >= 0x10B40 && char <= 0x10B5F, // 'Inscriptional Pahlavi': (char) => char >= 0x10B60 && char <= 0x10B7F, // 'Psalter Pahlavi': (char) => char >= 0x10B80 && char <= 0x10BAF, // 'Old Turkic': (char) => char >= 0x10C00 && char <= 0x10C4F, // 'Old Hungarian': (char) => char >= 0x10C80 && char <= 0x10CFF, // 'Rumi Numeral Symbols': (char) => char >= 0x10E60 && char <= 0x10E7F, // 'Brahmi': (char) => char >= 0x11000 && char <= 0x1107F, // 'Kaithi': (char) => char >= 0x11080 && char <= 0x110CF, // 'Sora Sompeng': (char) => char >= 0x110D0 && char <= 0x110FF, // 'Chakma': (char) => char >= 0x11100 && char <= 0x1114F, // 'Mahajani': (char) => char >= 0x11150 && char <= 0x1117F, // 'Sharada': (char) => char >= 0x11180 && char <= 0x111DF, // 'Sinhala Archaic Numbers': (char) => char >= 0x111E0 && char <= 0x111FF, // 'Khojki': (char) => char >= 0x11200 && char <= 0x1124F, // 'Multani': (char) => char >= 0x11280 && char <= 0x112AF, // 'Khudawadi': (char) => char >= 0x112B0 && char <= 0x112FF, // 'Grantha': (char) => char >= 0x11300 && char <= 0x1137F, // 'Newa': (char) => char >= 0x11400 && char <= 0x1147F, // 'Tirhuta': (char) => char >= 0x11480 && char <= 0x114DF, // 'Siddham': (char) => char >= 0x11580 && char <= 0x115FF, // 'Modi': (char) => char >= 0x11600 && char <= 0x1165F, // 'Mongolian Supplement': (char) => char >= 0x11660 && char <= 0x1167F, // 'Takri': (char) => char >= 0x11680 && char <= 0x116CF, // 'Ahom': (char) => char >= 0x11700 && char <= 0x1173F, // 'Warang Citi': (char) => char >= 0x118A0 && char <= 0x118FF, // 'Zanabazar Square': (char) => char >= 0x11A00 && char <= 0x11A4F, // 'Soyombo': (char) => char >= 0x11A50 && char <= 0x11AAF, // 'Pau Cin Hau': (char) => char >= 0x11AC0 && char <= 0x11AFF, // 'Bhaiksuki': (char) => char >= 0x11C00 && char <= 0x11C6F, // 'Marchen': (char) => char >= 0x11C70 && char <= 0x11CBF, // 'Masaram Gondi': (char) => char >= 0x11D00 && char <= 0x11D5F, // 'Cuneiform': (char) => char >= 0x12000 && char <= 0x123FF, // 'Cuneiform Numbers and Punctuation': (char) => char >= 0x12400 && char <= 0x1247F, // 'Early Dynastic Cuneiform': (char) => char >= 0x12480 && char <= 0x1254F, // 'Egyptian Hieroglyphs': (char) => char >= 0x13000 && char <= 0x1342F, // 'Anatolian Hieroglyphs': (char) => char >= 0x14400 && char <= 0x1467F, // 'Bamum Supplement': (char) => char >= 0x16800 && char <= 0x16A3F, // 'Mro': (char) => char >= 0x16A40 && char <= 0x16A6F, // 'Bassa Vah': (char) => char >= 0x16AD0 && char <= 0x16AFF, // 'Pahawh Hmong': (char) => char >= 0x16B00 && char <= 0x16B8F, // 'Miao': (char) => char >= 0x16F00 && char <= 0x16F9F, // 'Ideographic Symbols and Punctuation': (char) => char >= 0x16FE0 && char <= 0x16FFF, // 'Tangut': (char) => char >= 0x17000 && char <= 0x187FF, // 'Tangut Components': (char) => char >= 0x18800 && char <= 0x18AFF, // 'Kana Supplement': (char) => char >= 0x1B000 && char <= 0x1B0FF, // 'Kana Extended-A': (char) => char >= 0x1B100 && char <= 0x1B12F, // 'Nushu': (char) => char >= 0x1B170 && char <= 0x1B2FF, // 'Duployan': (char) => char >= 0x1BC00 && char <= 0x1BC9F, // 'Shorthand Format Controls': (char) => char >= 0x1BCA0 && char <= 0x1BCAF, // 'Byzantine Musical Symbols': (char) => char >= 0x1D000 && char <= 0x1D0FF, // 'Musical Symbols': (char) => char >= 0x1D100 && char <= 0x1D1FF, // 'Ancient Greek Musical Notation': (char) => char >= 0x1D200 && char <= 0x1D24F, // 'Tai Xuan Jing Symbols': (char) => char >= 0x1D300 && char <= 0x1D35F, // 'Counting Rod Numerals': (char) => char >= 0x1D360 && char <= 0x1D37F, // 'Mathematical Alphanumeric Symbols': (char) => char >= 0x1D400 && char <= 0x1D7FF, // 'Sutton SignWriting': (char) => char >= 0x1D800 && char <= 0x1DAAF, // 'Glagolitic Supplement': (char) => char >= 0x1E000 && char <= 0x1E02F, // 'Mende Kikakui': (char) => char >= 0x1E800 && char <= 0x1E8DF, // 'Adlam': (char) => char >= 0x1E900 && char <= 0x1E95F, // 'Arabic Mathematical Alphabetic Symbols': (char) => char >= 0x1EE00 && char <= 0x1EEFF, // 'Mahjong Tiles': (char) => char >= 0x1F000 && char <= 0x1F02F, // 'Domino Tiles': (char) => char >= 0x1F030 && char <= 0x1F09F, // 'Playing Cards': (char) => char >= 0x1F0A0 && char <= 0x1F0FF, // 'Enclosed Alphanumeric Supplement': (char) => char >= 0x1F100 && char <= 0x1F1FF, // 'Enclosed Ideographic Supplement': (char) => char >= 0x1F200 && char <= 0x1F2FF, // 'Miscellaneous Symbols and Pictographs': (char) => char >= 0x1F300 && char <= 0x1F5FF, // 'Emoticons': (char) => char >= 0x1F600 && char <= 0x1F64F, // 'Ornamental Dingbats': (char) => char >= 0x1F650 && char <= 0x1F67F, // 'Transport and Map Symbols': (char) => char >= 0x1F680 && char <= 0x1F6FF, // 'Alchemical Symbols': (char) => char >= 0x1F700 && char <= 0x1F77F, // 'Geometric Shapes Extended': (char) => char >= 0x1F780 && char <= 0x1F7FF, // 'Supplemental Arrows-C': (char) => char >= 0x1F800 && char <= 0x1F8FF, // 'Supplemental Symbols and Pictographs': (char) => char >= 0x1F900 && char <= 0x1F9FF, // 'CJK Unified Ideographs Extension B': (char) => char >= 0x20000 && char <= 0x2A6DF, // 'CJK Unified Ideographs Extension C': (char) => char >= 0x2A700 && char <= 0x2B73F, // 'CJK Unified Ideographs Extension D': (char) => char >= 0x2B740 && char <= 0x2B81F, // 'CJK Unified Ideographs Extension E': (char) => char >= 0x2B820 && char <= 0x2CEAF, // 'CJK Unified Ideographs Extension F': (char) => char >= 0x2CEB0 && char <= 0x2EBEF, // 'CJK Compatibility Ideographs Supplement': (char) => char >= 0x2F800 && char <= 0x2FA1F, // 'Tags': (char) => char >= 0xE0000 && char <= 0xE007F, // 'Variation Selectors Supplement': (char) => char >= 0xE0100 && char <= 0xE01EF, // 'Supplementary Private Use Area-A': (char) => char >= 0xF0000 && char <= 0xFFFFF, // 'Supplementary Private Use Area-B': (char) => char >= 0x100000 && char <= 0x10FFFF, }; module.exports = unicodeBlockLookup; },{}],271:[function(require,module,exports){ 'use strict';// /** * A [least-recently-used cache](http://en.wikipedia.org/wiki/Cache_algorithms) * with hash lookup made possible by keeping a list of keys in parallel to * an array of dictionary of values * * @private */ var LRUCache = function LRUCache(max , onRemove ) { this.max = max; this.onRemove = onRemove; this.reset(); }; /** * Clear the cache * * @returns {LRUCache} this cache * @private */ LRUCache.prototype.reset = function reset () { var this$1 = this; for (var key in this$1.data) { this$1.onRemove(this$1.data[key]); } this.data = {}; this.order = []; return this; }; /** * Add a key, value combination to the cache, trimming its size if this pushes * it over max length. * * @param {string} key lookup key for the item * @param {*} data any value * * @returns {LRUCache} this cache * @private */ LRUCache.prototype.add = function add (key , data ) { if (this.has(key)) { this.order.splice(this.order.indexOf(key), 1); this.data[key] = data; this.order.push(key); } else { this.data[key] = data; this.order.push(key); if (this.order.length > this.max) { var removedData = this.getAndRemove(this.order[0]); if (removedData) { this.onRemove(removedData); } } } return this; }; /** * Determine whether the value attached to `key` is present * * @param {string} key the key to be looked-up * @returns {boolean} whether the cache has this value * @private */ LRUCache.prototype.has = function has (key ) { return key in this.data; }; /** * List all keys in the cache * * @returns {Array} an array of keys in this cache. * @private */ LRUCache.prototype.keys = function keys () { return this.order; }; /** * Get the value attached to a specific key and remove data from cache. * If the key is not found, returns `null` * * @param {string} key the key to look up * @returns {*} the data, or null if it isn't found * @private */ LRUCache.prototype.getAndRemove = function getAndRemove (key ) { if (!this.has(key)) { return null; } var data = this.data[key]; delete this.data[key]; this.order.splice(this.order.indexOf(key), 1); return data; }; /** * Get the value attached to a specific key without removing data * from the cache. If the key is not found, returns `null` * * @param {string} key the key to look up * @returns {*} the data, or null if it isn't found * @private */ LRUCache.prototype.get = function get (key ) { if (!this.has(key)) { return null; } var data = this.data[key]; return data; }; /** * Remove a key/value combination from the cache. * * @param {string} key the key for the pair to delete * @returns {LRUCache} this cache * @private */ LRUCache.prototype.remove = function remove (key ) { if (!this.has(key)) { return this; } var data = this.data[key]; delete this.data[key]; this.onRemove(data); this.order.splice(this.order.indexOf(key), 1); return this; }; /** * Change the max size of the cache. * * @param {number} max the max size of the cache * @returns {LRUCache} this cache * @private */ LRUCache.prototype.setMaxSize = function setMaxSize (max ) { var this$1 = this; this.max = max; while (this.order.length > this.max) { var removedData = this$1.getAndRemove(this$1.order[0]); if (removedData) { this$1.onRemove(removedData); } } return this; }; module.exports = LRUCache; },{}],272:[function(require,module,exports){ 'use strict';// var config = require('./config'); var browser = require('./browser'); var help = 'See https://www.mapbox.com/api-documentation/#access-tokens'; function makeAPIURL(urlObject , accessToken ) { var apiUrlObject = parseUrl(config.API_URL); urlObject.protocol = apiUrlObject.protocol; urlObject.authority = apiUrlObject.authority; if (apiUrlObject.path !== '/') { urlObject.path = "" + (apiUrlObject.path) + (urlObject.path); } if (!config.REQUIRE_ACCESS_TOKEN) { return formatUrl(urlObject); } accessToken = accessToken || config.ACCESS_TOKEN; if (!accessToken) { throw new Error(("An API access token is required to use Mapbox GL. " + help)); } if (accessToken[0] === 's') { throw new Error(("Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). " + help)); } urlObject.params.push(("access_token=" + accessToken)); return formatUrl(urlObject); } function isMapboxURL(url ) { return url.indexOf('mapbox:') === 0; } exports.isMapboxURL = isMapboxURL; exports.normalizeStyleURL = function(url , accessToken ) { if (!isMapboxURL(url)) { return url; } var urlObject = parseUrl(url); urlObject.path = "/styles/v1" + (urlObject.path); return makeAPIURL(urlObject, accessToken); }; exports.normalizeGlyphsURL = function(url , accessToken ) { if (!isMapboxURL(url)) { return url; } var urlObject = parseUrl(url); urlObject.path = "/fonts/v1" + (urlObject.path); return makeAPIURL(urlObject, accessToken); }; exports.normalizeSourceURL = function(url , accessToken ) { if (!isMapboxURL(url)) { return url; } var urlObject = parseUrl(url); urlObject.path = "/v4/" + (urlObject.authority) + ".json"; // TileJSON requests need a secure flag appended to their URLs so // that the server knows to send SSL-ified resource references. urlObject.params.push('secure'); return makeAPIURL(urlObject, accessToken); }; exports.normalizeSpriteURL = function(url , format , extension , accessToken ) { var urlObject = parseUrl(url); if (!isMapboxURL(url)) { urlObject.path += "" + format + extension; return formatUrl(urlObject); } urlObject.path = "/styles/v1" + (urlObject.path) + "/sprite" + format + extension; return makeAPIURL(urlObject, accessToken); }; var imageExtensionRe = /(\.(png|jpg)\d*)(?=$)/; exports.normalizeTileURL = function(tileURL , sourceURL , tileSize ) { if (!sourceURL || !isMapboxURL(sourceURL)) { return tileURL; } var urlObject = parseUrl(tileURL); // The v4 mapbox tile API supports 512x512 image tiles only when @2x // is appended to the tile URL. If `tileSize: 512` is specified for // a Mapbox raster source force the @2x suffix even if a non hidpi device. var suffix = browser.devicePixelRatio >= 2 || tileSize === 512 ? '@2x' : ''; var extension = browser.supportsWebp ? '.webp' : '$1'; urlObject.path = urlObject.path.replace(imageExtensionRe, ("" + suffix + extension)); replaceTempAccessToken(urlObject.params); return formatUrl(urlObject); }; function replaceTempAccessToken(params ) { for (var i = 0; i < params.length; i++) { if (params[i].indexOf('access_token=tk.') === 0) { params[i] = "access_token=" + (config.ACCESS_TOKEN || ''); } } } var urlRe = /^(\w+):\/\/([^/?]*)(\/[^?]+)?\??(.+)?/; function parseUrl(url ) { var parts = url.match(urlRe); if (!parts) { throw new Error('Unable to parse URL object'); } return { protocol: parts[1], authority: parts[2], path: parts[3] || '/', params: parts[4] ? parts[4].split('&') : [] }; } function formatUrl(obj ) { var params = obj.params.length ? ("?" + (obj.params.join('&'))) : ''; return ((obj.protocol) + "://" + (obj.authority) + (obj.path) + params); } },{"./browser":257,"./config":261}],273:[function(require,module,exports){ 'use strict';// // Wraps performance.getEntriesByName to facilitate testing // Not incorporated into browser.js because the latter is poisonous when used outside the main thread module.exports = { getEntriesByName: function (url ) { if (performance && performance.getEntriesByName) { return performance.getEntriesByName(url); } else { return false; } } }; },{}],274:[function(require,module,exports){ 'use strict';// /* eslint-disable new-cap */ var isChar = require('./is_char_in_unicode_block'); module.exports.allowsIdeographicBreaking = function(chars ) { for (var i = 0, list = chars; i < list.length; i += 1) { var char = list[i]; if (!exports.charAllowsIdeographicBreaking(char.charCodeAt(0))) { return false; } } return true; }; module.exports.allowsVerticalWritingMode = function(chars ) { for (var i = 0, list = chars; i < list.length; i += 1) { var char = list[i]; if (exports.charHasUprightVerticalOrientation(char.charCodeAt(0))) { return true; } } return false; }; module.exports.allowsLetterSpacing = function(chars ) { for (var i = 0, list = chars; i < list.length; i += 1) { var char = list[i]; if (!exports.charAllowsLetterSpacing(char.charCodeAt(0))) { return false; } } return true; }; module.exports.charAllowsLetterSpacing = function(char ) { if (isChar['Arabic'](char)) { return false; } if (isChar['Arabic Supplement'](char)) { return false; } if (isChar['Arabic Extended-A'](char)) { return false; } if (isChar['Arabic Presentation Forms-A'](char)) { return false; } if (isChar['Arabic Presentation Forms-B'](char)) { return false; } return true; }; module.exports.charAllowsIdeographicBreaking = function(char ) { // Return early for characters outside all ideographic ranges. if (char < 0x2E80) { return false; } if (isChar['Bopomofo Extended'](char)) { return true; } if (isChar['Bopomofo'](char)) { return true; } if (isChar['CJK Compatibility Forms'](char)) { return true; } if (isChar['CJK Compatibility Ideographs'](char)) { return true; } if (isChar['CJK Compatibility'](char)) { return true; } if (isChar['CJK Radicals Supplement'](char)) { return true; } if (isChar['CJK Strokes'](char)) { return true; } if (isChar['CJK Symbols and Punctuation'](char)) { return true; } if (isChar['CJK Unified Ideographs Extension A'](char)) { return true; } if (isChar['CJK Unified Ideographs'](char)) { return true; } if (isChar['Enclosed CJK Letters and Months'](char)) { return true; } if (isChar['Halfwidth and Fullwidth Forms'](char)) { return true; } if (isChar['Hiragana'](char)) { return true; } if (isChar['Ideographic Description Characters'](char)) { return true; } if (isChar['Kangxi Radicals'](char)) { return true; } if (isChar['Katakana Phonetic Extensions'](char)) { return true; } if (isChar['Katakana'](char)) { return true; } if (isChar['Vertical Forms'](char)) { return true; } if (isChar['Yi Radicals'](char)) { return true; } if (isChar['Yi Syllables'](char)) { return true; } return false; }; // The following logic comes from // . // The data file denotes with “U” or “Tu” any codepoint that may be drawn // upright in vertical text but does not distinguish between upright and // “neutral” characters. // Blocks in the Unicode supplementary planes are excluded from this module due // to . /** * Returns true if the given Unicode codepoint identifies a character with * upright orientation. * * A character has upright orientation if it is drawn upright (unrotated) * whether the line is oriented horizontally or vertically, even if both * adjacent characters can be rotated. For example, a Chinese character is * always drawn upright. An uprightly oriented character causes an adjacent * “neutral” character to be drawn upright as well. * @private */ exports.charHasUprightVerticalOrientation = function(char ) { if (char === 0x02EA /* modifier letter yin departing tone mark */ || char === 0x02EB /* modifier letter yang departing tone mark */) { return true; } // Return early for characters outside all ranges whose characters remain // upright in vertical writing mode. if (char < 0x1100) { return false; } if (isChar['Bopomofo Extended'](char)) { return true; } if (isChar['Bopomofo'](char)) { return true; } if (isChar['CJK Compatibility Forms'](char)) { if (!(char >= 0xFE49 /* dashed overline */ && char <= 0xFE4F /* wavy low line */)) { return true; } } if (isChar['CJK Compatibility Ideographs'](char)) { return true; } if (isChar['CJK Compatibility'](char)) { return true; } if (isChar['CJK Radicals Supplement'](char)) { return true; } if (isChar['CJK Strokes'](char)) { return true; } if (isChar['CJK Symbols and Punctuation'](char)) { if (!(char >= 0x3008 /* left angle bracket */ && char <= 0x3011 /* right black lenticular bracket */) && !(char >= 0x3014 /* left tortoise shell bracket */ && char <= 0x301F /* low double prime quotation mark */) && char !== 0x3030 /* wavy dash */) { return true; } } if (isChar['CJK Unified Ideographs Extension A'](char)) { return true; } if (isChar['CJK Unified Ideographs'](char)) { return true; } if (isChar['Enclosed CJK Letters and Months'](char)) { return true; } if (isChar['Hangul Compatibility Jamo'](char)) { return true; } if (isChar['Hangul Jamo Extended-A'](char)) { return true; } if (isChar['Hangul Jamo Extended-B'](char)) { return true; } if (isChar['Hangul Jamo'](char)) { return true; } if (isChar['Hangul Syllables'](char)) { return true; } if (isChar['Hiragana'](char)) { return true; } if (isChar['Ideographic Description Characters'](char)) { return true; } if (isChar['Kanbun'](char)) { return true; } if (isChar['Kangxi Radicals'](char)) { return true; } if (isChar['Katakana Phonetic Extensions'](char)) { return true; } if (isChar['Katakana'](char)) { if (char !== 0x30FC /* katakana-hiragana prolonged sound mark */) { return true; } } if (isChar['Halfwidth and Fullwidth Forms'](char)) { if (char !== 0xFF08 /* fullwidth left parenthesis */ && char !== 0xFF09 /* fullwidth right parenthesis */ && char !== 0xFF0D /* fullwidth hyphen-minus */ && !(char >= 0xFF1A /* fullwidth colon */ && char <= 0xFF1E /* fullwidth greater-than sign */) && char !== 0xFF3B /* fullwidth left square bracket */ && char !== 0xFF3D /* fullwidth right square bracket */ && char !== 0xFF3F /* fullwidth low line */ && !(char >= 0xFF5B /* fullwidth left curly bracket */ && char <= 0xFFDF) && char !== 0xFFE3 /* fullwidth macron */ && !(char >= 0xFFE8 /* halfwidth forms light vertical */ && char <= 0xFFEF)) { return true; } } if (isChar['Small Form Variants'](char)) { if (!(char >= 0xFE58 /* small em dash */ && char <= 0xFE5E /* small right tortoise shell bracket */) && !(char >= 0xFE63 /* small hyphen-minus */ && char <= 0xFE66 /* small equals sign */)) { return true; } } if (isChar['Unified Canadian Aboriginal Syllabics'](char)) { return true; } if (isChar['Unified Canadian Aboriginal Syllabics Extended'](char)) { return true; } if (isChar['Vertical Forms'](char)) { return true; } if (isChar['Yijing Hexagram Symbols'](char)) { return true; } if (isChar['Yi Syllables'](char)) { return true; } if (isChar['Yi Radicals'](char)) { return true; } return false; }; /** * Returns true if the given Unicode codepoint identifies a character with * neutral orientation. * * A character has neutral orientation if it may be drawn rotated or unrotated * when the line is oriented vertically, depending on the orientation of the * adjacent characters. For example, along a verticlly oriented line, the vulgar * fraction ½ is drawn upright among Chinese characters but rotated among Latin * letters. A neutrally oriented character does not influence whether an * adjacent character is drawn upright or rotated. * @private */ exports.charHasNeutralVerticalOrientation = function(char ) { if (isChar['Latin-1 Supplement'](char)) { if (char === 0x00A7 /* section sign */ || char === 0x00A9 /* copyright sign */ || char === 0x00AE /* registered sign */ || char === 0x00B1 /* plus-minus sign */ || char === 0x00BC /* vulgar fraction one quarter */ || char === 0x00BD /* vulgar fraction one half */ || char === 0x00BE /* vulgar fraction three quarters */ || char === 0x00D7 /* multiplication sign */ || char === 0x00F7 /* division sign */) { return true; } } if (isChar['General Punctuation'](char)) { if (char === 0x2016 /* double vertical line */ || char === 0x2020 /* dagger */ || char === 0x2021 /* double dagger */ || char === 0x2030 /* per mille sign */ || char === 0x2031 /* per ten thousand sign */ || char === 0x203B /* reference mark */ || char === 0x203C /* double exclamation mark */ || char === 0x2042 /* asterism */ || char === 0x2047 /* double question mark */ || char === 0x2048 /* question exclamation mark */ || char === 0x2049 /* exclamation question mark */ || char === 0x2051 /* two asterisks aligned vertically */) { return true; } } if (isChar['Letterlike Symbols'](char)) { return true; } if (isChar['Number Forms'](char)) { return true; } if (isChar['Miscellaneous Technical'](char)) { if ((char >= 0x2300 /* diameter sign */ && char <= 0x2307 /* wavy line */) || (char >= 0x230C /* bottom right crop */ && char <= 0x231F /* bottom right corner */) || (char >= 0x2324 /* up arrowhead between two horizontal bars */ && char <= 0x2328 /* keyboard */) || char === 0x232B /* erase to the left */ || (char >= 0x237D /* shouldered open box */ && char <= 0x239A /* clear screen symbol */) || (char >= 0x23BE /* dentistry symbol light vertical and top right */ && char <= 0x23CD /* square foot */) || char === 0x23CF /* eject symbol */ || (char >= 0x23D1 /* metrical breve */ && char <= 0x23DB /* fuse */) || (char >= 0x23E2 /* white trapezium */ && char <= 0x23FF)) { return true; } } if (isChar['Control Pictures'](char) && char !== 0x2423 /* open box */) { return true; } if (isChar['Optical Character Recognition'](char)) { return true; } if (isChar['Enclosed Alphanumerics'](char)) { return true; } if (isChar['Geometric Shapes'](char)) { return true; } if (isChar['Miscellaneous Symbols'](char)) { if (!(char >= 0x261A /* black left pointing index */ && char <= 0x261F /* white down pointing index */)) { return true; } } if (isChar['Miscellaneous Symbols and Arrows'](char)) { if ((char >= 0x2B12 /* square with top half black */ && char <= 0x2B2F /* white vertical ellipse */) || (char >= 0x2B50 /* white medium star */ && char <= 0x2B59 /* heavy circled saltire */) || (char >= 0x2BB8 /* upwards white arrow from bar with horizontal bar */ && char <= 0x2BEB)) { return true; } } if (isChar['CJK Symbols and Punctuation'](char)) { return true; } if (isChar['Katakana'](char)) { return true; } if (isChar['Private Use Area'](char)) { return true; } if (isChar['CJK Compatibility Forms'](char)) { return true; } if (isChar['Small Form Variants'](char)) { return true; } if (isChar['Halfwidth and Fullwidth Forms'](char)) { return true; } if (char === 0x221E /* infinity */ || char === 0x2234 /* therefore */ || char === 0x2235 /* because */ || (char >= 0x2700 /* black safety scissors */ && char <= 0x2767 /* rotated floral heart bullet */) || (char >= 0x2776 /* dingbat negative circled digit one */ && char <= 0x2793 /* dingbat negative circled sans-serif number ten */) || char === 0xFFFC /* object replacement character */ || char === 0xFFFD /* replacement character */) { return true; } return false; }; /** * Returns true if the given Unicode codepoint identifies a character with * rotated orientation. * * A character has rotated orientation if it is drawn rotated when the line is * oriented vertically, even if both adjacent characters are upright. For * example, a Latin letter is drawn rotated along a vertical line. A rotated * character causes an adjacent “neutral” character to be drawn rotated as well. * @private */ exports.charHasRotatedVerticalOrientation = function(char ) { return !(exports.charHasUprightVerticalOrientation(char) || exports.charHasNeutralVerticalOrientation(char)); }; },{"./is_char_in_unicode_block":270}],275:[function(require,module,exports){ 'use strict';// var LngLat = require('../geo/lng_lat'); /** * Given a LngLat, prior projected position, and a transform, return a new LngLat shifted * n × 360° east or west for some n ≥ 0 such that: * * * the projected location of the result is on screen, if possible, and secondarily: * * the difference between the projected location of the result and the prior position * is minimized. * * The object is to preserve perceived object constancy for Popups and Markers as much as * possible; they should avoid shifting large distances across the screen, even when the * map center changes by ±360° due to automatic wrapping, and when about to go off screen, * should wrap just enough to avoid doing so. * * @private */ module.exports = function(lngLat , priorPos , transform ) { lngLat = new LngLat(lngLat.lng, lngLat.lat); // First, try shifting one world in either direction, and see if either is closer to the // prior position. This preserves object constancy when the map center is auto-wrapped // during animations. if (priorPos) { var left = new LngLat(lngLat.lng - 360, lngLat.lat); var right = new LngLat(lngLat.lng + 360, lngLat.lat); var delta = transform.locationPoint(lngLat).distSqr(priorPos); if (transform.locationPoint(left).distSqr(priorPos) < delta) { lngLat = left; } else if (transform.locationPoint(right).distSqr(priorPos) < delta) { lngLat = right; } } // Second, wrap toward the center until the new position is on screen, or we can't get // any closer. while (Math.abs(lngLat.lng - transform.center.lng) > 180) { var pos = transform.locationPoint(lngLat); if (pos.x >= 0 && pos.y >= 0 && pos.x <= transform.width && pos.y <= transform.height) { break; } if (lngLat.lng > transform.center.lng) { lngLat.lng -= 360; } else { lngLat.lng += 360; } } return lngLat; }; },{"../geo/lng_lat":67}],276:[function(require,module,exports){ 'use strict';// // Note: all "sizes" are measured in bytes var assert = require('assert'); var viewTypes = { 'Int8': Int8Array, 'Uint8': Uint8Array, 'Int16': Int16Array, 'Uint16': Uint16Array, 'Int32': Int32Array, 'Uint32': Uint32Array, 'Float32': Float32Array }; /** * @private */ var Struct = function Struct(structArray , index ) { (this )._structArray = structArray; this._pos1 = index * this.size; this._pos2 = this._pos1 / 2; this._pos4 = this._pos1 / 4; this._pos8 = this._pos1 / 8; }; var DEFAULT_CAPACITY = 128; var RESIZE_MULTIPLIER = 5; /** * `StructArray` provides an abstraction over `ArrayBuffer` and `TypedArray` * making it behave like an array of typed structs. * * Conceptually, a StructArray is comprised of elements, i.e., instances of its * associated struct type. Each particular struct type, together with an * alignment size, determines the memory layout of a StructArray whose elements * are of that type. Thus, for each such layout that we need, we have * a corrseponding StructArrayLayout class, inheriting from StructArray and * implementing `emplaceBack()` and `_refreshViews()`. * * In some cases, where we need to access particular elements of a StructArray, * we implement a more specific subclass that inherits from one of the * StructArrayLayouts and adds a `get(i): T` accessor that returns a structured * object whose properties are proxies into the underlying memory space for the * i-th element. This affords the convience of working with (seemingly) plain * Javascript objects without the overhead of serializing/deserializing them * into ArrayBuffers for efficient web worker transfer. * * @private */ var StructArray = function StructArray() { this.isTransferred = false; this.capacity = -1; this.resize(0); }; /** * Serialize a StructArray instance.Serializes both the raw data and the * metadata needed to reconstruct the StructArray base class during * deserialization. */ StructArray.serialize = function serialize (array , transferables ) { assert(!array.isTransferred); array._trim(); if (transferables) { array.isTransferred = true; transferables.push(array.arrayBuffer); } return { length: array.length, arrayBuffer: array.arrayBuffer, }; }; StructArray.deserialize = function deserialize (input ) { var structArray = Object.create(this.prototype); structArray.arrayBuffer = input.arrayBuffer; structArray.length = input.length; structArray.capacity = input.arrayBuffer.byteLength / structArray.bytesPerElement; structArray._refreshViews(); return structArray; }; /** * Resize the array to discard unused capacity. */ StructArray.prototype._trim = function _trim () { if (this.length !== this.capacity) { this.capacity = this.length; this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement); this._refreshViews(); } }; /** * Resets the the length of the array to 0 without de-allocating capcacity. */ StructArray.prototype.clear = function clear () { this.length = 0; }; /** * Resize the array. * If `n` is greater than the current length then additional elements with undefined values are added. * If `n` is less than the current length then the array will be reduced to the first `n` elements. * @param {number} n The new size of the array. */ StructArray.prototype.resize = function resize (n ) { assert(!this.isTransferred); this.reserve(n); this.length = n; }; /** * Indicate a planned increase in size, so that any necessary allocation may * be done once, ahead of time. * @param {number} n The expected size of the array. */ StructArray.prototype.reserve = function reserve (n ) { if (n > this.capacity) { this.capacity = Math.max(n, Math.floor(this.capacity * RESIZE_MULTIPLIER), DEFAULT_CAPACITY); this.arrayBuffer = new ArrayBuffer(this.capacity * this.bytesPerElement); var oldUint8Array = this.uint8; this._refreshViews(); if (oldUint8Array) { this.uint8.set(oldUint8Array); } } }; /** * Create TypedArray views for the current ArrayBuffer. */ StructArray.prototype._refreshViews = function _refreshViews () { throw new Error('_refreshViews() must be implemented by each concrete StructArray layout'); }; /** * Given a list of member fields, create a full StructArrayLayout, in * particular calculating the correct byte offset for each field. This data * is used at build time to generate StructArrayLayout_*#emplaceBack() and * other accessors, and at runtime for binding vertex buffer attributes. * * @private */ function createLayout( members , alignment ) { if ( alignment === void 0 ) alignment = 1; var offset = 0; var maxSize = 0; var layoutMembers = members.map(function (member) { assert(member.name.length); var typeSize = sizeOf(member.type); var memberOffset = offset = align(offset, Math.max(alignment, typeSize)); var components = member.components || 1; maxSize = Math.max(maxSize, typeSize); offset += typeSize * components; return { name: member.name, type: member.type, components: components, offset: memberOffset, }; }); var size = align(offset, Math.max(maxSize, alignment)); return { members: layoutMembers, size: size, alignment: alignment }; } function sizeOf(type ) { return viewTypes[type].BYTES_PER_ELEMENT; } function align(offset , size ) { return Math.ceil(offset / size) * size; } module.exports.StructArray = StructArray; module.exports.Struct = Struct; module.exports.viewTypes = viewTypes; module.exports.createLayout = createLayout; },{"assert":13}],277:[function(require,module,exports){ 'use strict';// /** * Throttle the given function to run at most every `period` milliseconds. Throttle the given function to run at most every period milliseconds. * @private */ module.exports = function throttle(fn , time ) { var pending = false; var timerId = 0; var later = function () { timerId = 0; if (pending) { fn(); timerId = setTimeout(later, time); pending = false; } }; return function () { pending = true; if (!timerId) { later(); } return timerId; }; }; },{}],278:[function(require,module,exports){ 'use strict';// var Coordinate = require('../geo/coordinate'); var ref = require('../source/tile_id'); var OverscaledTileID = ref.OverscaledTileID; module.exports = tileCover; function tileCover(z , bounds , actualZ , renderWorldCopies ) { if (renderWorldCopies === undefined) { renderWorldCopies = true; } var tiles = 1 << z; var t = {}; function scanLine(x0, x1, y) { var x, w, wx, coord; if (y >= 0 && y <= tiles) { for (x = x0; x < x1; x++) { w = Math.floor(x / tiles); wx = (x % tiles + tiles) % tiles; if (w === 0 || renderWorldCopies === true) { coord = new OverscaledTileID(actualZ, w, z, wx, y); t[coord.key] = coord; } } } } // Divide the screen up in two triangles and scan each of them: // +---/ // | / | // /---+ scanTriangle(bounds[0], bounds[1], bounds[2], 0, tiles, scanLine); scanTriangle(bounds[2], bounds[3], bounds[0], 0, tiles, scanLine); return Object.keys(t).map(function (id) { return t[id]; }); } // Taken from polymaps src/Layer.js // https://github.com/simplegeo/polymaps/blob/master/src/Layer.js#L333-L383 function edge(a , b ) { if (a.row > b.row) { var t = a; a = b; b = t; } return { x0: a.column, y0: a.row, x1: b.column, y1: b.row, dx: b.column - a.column, dy: b.row - a.row }; } function scanSpans(e0, e1, ymin, ymax, scanLine) { var y0 = Math.max(ymin, Math.floor(e1.y0)); var y1 = Math.min(ymax, Math.ceil(e1.y1)); // sort edges by x-coordinate if ((e0.x0 === e1.x0 && e0.y0 === e1.y0) ? (e0.x0 + e1.dy / e0.dy * e0.dx < e1.x1) : (e0.x1 - e1.dy / e0.dy * e0.dx < e1.x0)) { var t = e0; e0 = e1; e1 = t; } // scan lines! var m0 = e0.dx / e0.dy; var m1 = e1.dx / e1.dy; var d0 = e0.dx > 0; // use y + 1 to compute x0 var d1 = e1.dx < 0; // use y + 1 to compute x1 for (var y = y0; y < y1; y++) { var x0 = m0 * Math.max(0, Math.min(e0.dy, y + d0 - e0.y0)) + e0.x0; var x1 = m1 * Math.max(0, Math.min(e1.dy, y + d1 - e1.y0)) + e1.x0; scanLine(Math.floor(x1), Math.ceil(x0), y); } } function scanTriangle(a , b , c , ymin, ymax, scanLine) { var ab = edge(a, b), bc = edge(b, c), ca = edge(c, a); var t; // sort edges by y-length if (ab.dy > bc.dy) { t = ab; ab = bc; bc = t; } if (ab.dy > ca.dy) { t = ab; ab = ca; ca = t; } if (bc.dy > ca.dy) { t = bc; bc = ca; ca = t; } // scan span! scan span! if (ab.dy) { scanSpans(ca, ab, ymin, ymax, scanLine); } if (bc.dy) { scanSpans(ca, bc, ymin, ymax, scanLine); } } },{"../geo/coordinate":66,"../source/tile_id":119}],279:[function(require,module,exports){ 'use strict';// module.exports = resolveTokens; /** * Replace tokens in a string template with values in an object * * @param properties a key/value relationship between tokens and replacements * @param text the template string * @returns the template with tokens replaced * @private */ function resolveTokens(properties , text ) { return text.replace(/{([^{}]+)}/g, function (match, key ) { return key in properties ? String(properties[key]) : ''; }); } },{}],280:[function(require,module,exports){ 'use strict';// var UnitBezier = require('@mapbox/unitbezier'); var Coordinate = require('../geo/coordinate'); var Point = require('@mapbox/point-geometry'); /** * @module util * @private */ /** * Given a value `t` that varies between 0 and 1, return * an interpolation function that eases between 0 and 1 in a pleasing * cubic in-out fashion. * * @private */ exports.easeCubicInOut = function(t ) { if (t <= 0) { return 0; } if (t >= 1) { return 1; } var t2 = t * t, t3 = t2 * t; return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75); }; /** * Given given (x, y), (x1, y1) control points for a bezier curve, * return a function that interpolates along that curve. * * @param p1x control point 1 x coordinate * @param p1y control point 1 y coordinate * @param p2x control point 2 x coordinate * @param p2y control point 2 y coordinate * @private */ exports.bezier = function(p1x , p1y , p2x , p2y ) { var bezier = new UnitBezier(p1x, p1y, p2x, p2y); return function(t ) { return bezier.solve(t); }; }; /** * A default bezier-curve powered easing function with * control points (0.25, 0.1) and (0.25, 1) * * @private */ exports.ease = exports.bezier(0.25, 0.1, 0.25, 1); /** * constrain n to the given range via min + max * * @param n value * @param min the minimum value to be returned * @param max the maximum value to be returned * @returns the clamped value * @private */ exports.clamp = function (n , min , max ) { return Math.min(max, Math.max(min, n)); }; /** * constrain n to the given range, excluding the minimum, via modular arithmetic * * @param n value * @param min the minimum value to be returned, exclusive * @param max the maximum value to be returned, inclusive * @returns constrained number * @private */ exports.wrap = function (n , min , max ) { var d = max - min; var w = ((n - min) % d + d) % d + min; return (w === min) ? max : w; }; /* * Call an asynchronous function on an array of arguments, * calling `callback` with the completed results of all calls. * * @param array input to each call of the async function. * @param fn an async function with signature (data, callback) * @param callback a callback run after all async work is done. * called with an array, containing the results of each async call. * @private */ exports.asyncAll = function ( array , fn , callback ) { if (!array.length) { return callback(null, []); } var remaining = array.length; var results = new Array(array.length); var error = null; array.forEach(function (item, i) { fn(item, function (err, result) { if (err) { error = err; } results[i] = ((result ) ); // https://github.com/facebook/flow/issues/2123 if (--remaining === 0) { callback(error, results); } }); }); }; /* * Polyfill for Object.values. Not fully spec compliant, but we don't * need it to be. * * @private */ exports.values = function (obj ) { var result = []; for (var k in obj) { result.push(obj[k]); } return result; }; /* * Compute the difference between the keys in one object and the keys * in another object. * * @returns keys difference * @private */ exports.keysDifference = function (obj , other ) { var difference = []; for (var i in obj) { if (!(i in other)) { difference.push(i); } } return difference; }; /** * Given a destination object and optionally many source objects, * copy all properties from the source objects into the destination. * The last source object given overrides properties from previous * source objects. * * @param dest destination object * @param sources sources from which properties are pulled * @private */ exports.extend = function (dest ) { var sources = [], len = arguments.length - 1; while ( len-- > 0 ) sources[ len ] = arguments[ len + 1 ]; for (var i = 0, list = sources; i < list.length; i += 1) { var src = list[i]; for (var k in src) { dest[k] = src[k]; } } return dest; }; /** * Given an object and a number of properties as strings, return version * of that object with only those properties. * * @param src the object * @param properties an array of property names chosen * to appear on the resulting object. * @returns object with limited properties. * @example * var foo = { name: 'Charlie', age: 10 }; * var justName = pick(foo, ['name']); * // justName = { name: 'Charlie' } * @private */ exports.pick = function (src , properties ) { var result = {}; for (var i = 0; i < properties.length; i++) { var k = properties[i]; if (k in src) { result[k] = src[k]; } } return result; }; var id = 1; /** * Return a unique numeric id, starting at 1 and incrementing with * each call. * * @returns unique numeric id. * @private */ exports.uniqueId = function () { return id++; }; /** * Given an array of member function names as strings, replace all of them * with bound versions that will always refer to `context` as `this`. This * is useful for classes where otherwise event bindings would reassign * `this` to the evented object or some other value: this lets you ensure * the `this` value always. * * @param fns list of member function names * @param context the context value * @example * function MyClass() { * bindAll(['ontimer'], this); * this.name = 'Tom'; * } * MyClass.prototype.ontimer = function() { * alert(this.name); * }; * var myClass = new MyClass(); * setTimeout(myClass.ontimer, 100); * @private */ exports.bindAll = function(fns , context ) { fns.forEach(function (fn) { if (!context[fn]) { return; } context[fn] = context[fn].bind(context); }); }; /** * Given a list of coordinates, get their center as a coordinate. * * @returns centerpoint * @private */ exports.getCoordinatesCenter = function(coords ) { var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; for (var i = 0; i < coords.length; i++) { minX = Math.min(minX, coords[i].column); minY = Math.min(minY, coords[i].row); maxX = Math.max(maxX, coords[i].column); maxY = Math.max(maxY, coords[i].row); } var dx = maxX - minX; var dy = maxY - minY; var dMax = Math.max(dx, dy); var zoom = Math.max(0, Math.floor(-Math.log(dMax) / Math.LN2)); return new Coordinate((minX + maxX) / 2, (minY + maxY) / 2, 0) .zoomTo(zoom); }; /** * Determine if a string ends with a particular substring * * @private */ exports.endsWith = function(string , suffix ) { return string.indexOf(suffix, string.length - suffix.length) !== -1; }; /** * Create an object by mapping all the values of an existing object while * preserving their keys. * * @private */ exports.mapObject = function(input , iterator , context ) { var this$1 = this; var output = {}; for (var key in input) { output[key] = iterator.call(context || this$1, input[key], key, input); } return output; }; /** * Create an object by filtering out values of an existing object. * * @private */ exports.filterObject = function(input , iterator , context ) { var this$1 = this; var output = {}; for (var key in input) { if (iterator.call(context || this$1, input[key], key, input)) { output[key] = input[key]; } } return output; }; exports.deepEqual = require('../style-spec/util/deep_equal'); /** * Deeply clones two objects. * * @private */ exports.clone = function (input ) { if (Array.isArray(input)) { return input.map(exports.clone); } else if (typeof input === 'object' && input) { return ((exports.mapObject(input, exports.clone) ) ); } else { return input; } }; /** * Check if two arrays have at least one common element. * * @private */ exports.arraysIntersect = function (a , b ) { for (var l = 0; l < a.length; l++) { if (b.indexOf(a[l]) >= 0) { return true; } } return false; }; /** * Print a warning message to the console and ensure duplicate warning messages * are not printed. * * @private */ var warnOnceHistory = {}; exports.warnOnce = function(message ) { if (!warnOnceHistory[message]) { // console isn't defined in some WebWorkers, see #2558 if (typeof console !== "undefined") { console.warn(message); } warnOnceHistory[message] = true; } }; /** * Indicates if the provided Points are in a counter clockwise (true) or clockwise (false) order * * @private * @returns true for a counter clockwise set of points */ // http://bryceboe.com/2006/10/23/line-segment-intersection-algorithm/ exports.isCounterClockwise = function(a , b , c ) { return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x); }; /** * Returns the signed area for the polygon ring. Postive areas are exterior rings and * have a clockwise winding. Negative areas are interior rings and have a counter clockwise * ordering. * * @private * @param ring Exterior or interior ring */ exports.calculateSignedArea = function(ring ) { var sum = 0; for (var i = 0, len = ring.length, j = len - 1, p1 = (void 0), p2 = (void 0); i < len; j = i++) { p1 = ring[i]; p2 = ring[j]; sum += (p2.x - p1.x) * (p1.y + p2.y); } return sum; }; /** * Detects closed polygons, first + last point are equal * * @private * @param points array of points * @return true if the points are a closed polygon */ exports.isClosedPolygon = function(points ) { // If it is 2 points that are the same then it is a point // If it is 3 points with start and end the same then it is a line if (points.length < 4) { return false; } var p1 = points[0]; var p2 = points[points.length - 1]; if (Math.abs(p1.x - p2.x) > 0 || Math.abs(p1.y - p2.y) > 0) { return false; } // polygon simplification can produce polygons with zero area and more than 3 points return (Math.abs(exports.calculateSignedArea(points)) > 0.01); }; /** * Converts spherical coordinates to cartesian coordinates. * * @private * @param spherical Spherical coordinates, in [radial, azimuthal, polar] * @return cartesian coordinates in [x, y, z] */ exports.sphericalToCartesian = function(ref ) { var r = ref[0]; var azimuthal = ref[1]; var polar = ref[2]; // We abstract "north"/"up" (compass-wise) to be 0° when really this is 90° (π/2): // correct for that here azimuthal += 90; // Convert azimuthal and polar angles to radians azimuthal *= Math.PI / 180; polar *= Math.PI / 180; return { x: r * Math.cos(azimuthal) * Math.sin(polar), y: r * Math.sin(azimuthal) * Math.sin(polar), z: r * Math.cos(polar) }; }; /** * Parses data from 'Cache-Control' headers. * * @private * @param cacheControl Value of 'Cache-Control' header * @return object containing parsed header info. */ exports.parseCacheControl = function(cacheControl ) { // Taken from [Wreck](https://github.com/hapijs/wreck) var re = /(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g; var header = {}; cacheControl.replace(re, function ($0, $1, $2, $3) { var value = $2 || $3; header[$1] = value ? value.toLowerCase() : true; return ''; }); if (header['max-age']) { var maxAge = parseInt(header['max-age'], 10); if (isNaN(maxAge)) { delete header['max-age']; } else { header['max-age'] = maxAge; } } return header; }; },{"../geo/coordinate":66,"../style-spec/util/deep_equal":160,"@mapbox/point-geometry":4,"@mapbox/unitbezier":7}],281:[function(require,module,exports){ 'use strict';// var Feature = function Feature(vectorTileFeature , z , x , y ) { this.type = 'Feature'; this._vectorTileFeature = vectorTileFeature; (vectorTileFeature )._z = z; (vectorTileFeature )._x = x; (vectorTileFeature )._y = y; this.properties = vectorTileFeature.properties; if (vectorTileFeature.id != null) { this.id = vectorTileFeature.id; } }; var prototypeAccessors = { geometry: {} }; prototypeAccessors.geometry.get = function () { if (this._geometry === undefined) { this._geometry = this._vectorTileFeature.toGeoJSON( (this._vectorTileFeature )._x, (this._vectorTileFeature )._y, (this._vectorTileFeature )._z).geometry; } return this._geometry; }; prototypeAccessors.geometry.set = function (g ) { this._geometry = g; }; Feature.prototype.toJSON = function toJSON () { var this$1 = this; var json = { geometry: this.geometry }; for (var i in this$1) { if (i === '_geometry' || i === '_vectorTileFeature') { continue; } json[i] = (this$1 )[i]; } return json; }; Object.defineProperties( Feature.prototype, prototypeAccessors ); module.exports = Feature; },{}],282:[function(require,module,exports){ 'use strict';// var scriptDetection = require('./script_detection'); module.exports = function verticalizePunctuation(input ) { var output = ''; for (var i = 0; i < input.length; i++) { var nextCharCode = input.charCodeAt(i + 1) || null; var prevCharCode = input.charCodeAt(i - 1) || null; var canReplacePunctuation = ( (!nextCharCode || !scriptDetection.charHasRotatedVerticalOrientation(nextCharCode) || module.exports.lookup[input[i + 1]]) && (!prevCharCode || !scriptDetection.charHasRotatedVerticalOrientation(prevCharCode) || module.exports.lookup[input[i - 1]]) ); if (canReplacePunctuation && module.exports.lookup[input[i]]) { output += module.exports.lookup[input[i]]; } else { output += input[i]; } } return output; }; module.exports.lookup = { '!': '︕', '#': '#', '$': '$', '%': '%', '&': '&', '(': '︵', ')': '︶', '*': '*', '+': '+', ',': '︐', '-': '︲', '.': '・', '/': '/', ':': '︓', ';': '︔', '<': '︿', '=': '=', '>': '﹀', '?': '︖', '@': '@', '[': '﹇', '\\': '\', ']': '﹈', '^': '^', '_': '︳', '`': '`', '{': '︷', '|': '―', '}': '︸', '~': '~', '¢': '¢', '£': '£', '¥': '¥', '¦': '¦', '¬': '¬', '¯': ' ̄', '–': '︲', '—': '︱', '‘': '﹃', '’': '﹄', '“': '﹁', '”': '﹂', '…': '︙', '‧': '・', '₩': '₩', '、': '︑', '。': '︒', '〈': '︿', '〉': '﹀', '《': '︽', '》': '︾', '「': '﹁', '」': '﹂', '『': '﹃', '』': '﹄', '【': '︻', '】': '︼', '〔': '︹', '〕': '︺', '〖': '︗', '〗': '︘', '!': '︕', '(': '︵', ')': '︶', ',': '︐', '-': '︲', '.': '・', ':': '︓', ';': '︔', '<': '︿', '>': '﹀', '?': '︖', '[': '﹇', ']': '﹈', '_': '︳', '{': '︷', '|': '―', '}': '︸', '⦅': '︵', '⦆': '︶', '。': '︒', '「': '﹁', '」': '﹂' }; },{"./script_detection":274}],283:[function(require,module,exports){ 'use strict';// var assert = require('assert'); var Grid = require('grid-index'); var Color = require('../style-spec/util/color'); var ref = require('../style-spec/expression'); var StylePropertyFunction = ref.StylePropertyFunction; var StyleExpression = ref.StyleExpression; var StyleExpressionWithErrorHandling = ref.StyleExpressionWithErrorHandling; var ZoomDependentExpression = ref.ZoomDependentExpression; var ZoomConstantExpression = ref.ZoomConstantExpression; var ref$1 = require('../style-spec/expression/compound_expression'); var CompoundExpression = ref$1.CompoundExpression; var expressions = require('../style-spec/expression/definitions'); var ref$2 = require('./window'); var ImageData = ref$2.ImageData; var registry = {}; /** * Register the given class as serializable. * * @param options * @param options.omit List of properties to omit from serialization (e.g., cached/computed properties) * @param options.shallow List of properties that should be serialized by a simple shallow copy, rather than by a recursive call to serialize(). * * @private */ function register (name , klass , options) { if ( options === void 0 ) options = {}; assert(!registry[name], (name + " is already registered.")); (Object.defineProperty )(klass, '_classRegistryKey', { value: name, writeable: false }); registry[name] = { klass: klass, omit: options.omit || [], shallow: options.shallow || [] }; } register('Object', Object); Grid.serialize = function serializeGrid(grid , transferables ) { var ab = grid.toArrayBuffer(); if (transferables) { transferables.push(ab); } return ab; }; Grid.deserialize = function deserializeGrid(serialized ) { return new Grid(serialized); }; register('Grid', Grid); register('Color', Color); register('StylePropertyFunction', StylePropertyFunction); register('StyleExpression', StyleExpression, {omit: ['_evaluator']}); register( 'StyleExpressionWithErrorHandling', StyleExpressionWithErrorHandling, {omit: ['_evaluator']} ); register('ZoomDependentExpression', ZoomDependentExpression); register('ZoomConstantExpression', ZoomConstantExpression); register('CompoundExpression', CompoundExpression, {omit: ['_evaluate']}); for (var name in expressions) { if ((expressions[name] )._classRegistryKey) { continue; } register(("Expression_" + name), expressions[name]); } /** * Serialize the given object for transfer to or from a web worker. * * For non-builtin types, recursively serialize each property (possibly * omitting certain properties - see register()), and package the result along * with the constructor's `name` so that the appropriate constructor can be * looked up in `deserialize()`. * * If a `transferables` array is provided, add any transferable objects (i.e., * any ArrayBuffers or ArrayBuffer views) to the list. (If a copy is needed, * this should happen in the client code, before using serialize().) * * @private */ function serialize(input , transferables ) { if (input === null || input === undefined || typeof input === 'boolean' || typeof input === 'number' || typeof input === 'string' || input instanceof Boolean || input instanceof Number || input instanceof String || input instanceof Date || input instanceof RegExp) { return input; } if (input instanceof ArrayBuffer) { if (transferables) { transferables.push(input); } return input; } if (ArrayBuffer.isView(input)) { var view = (input ); if (transferables) { transferables.push(view.buffer); } return view; } if (input instanceof ImageData) { if (transferables) { transferables.push(input.data.buffer); } return input; } if (Array.isArray(input)) { var serialized = []; for (var i = 0, list = input; i < list.length; i += 1) { var item = list[i]; serialized.push(serialize(item, transferables)); } return serialized; } if (typeof input === 'object') { var klass = (input.constructor ); var name = klass._classRegistryKey; if (!name) { throw new Error("can't serialize object of unregistered class"); } assert(registry[name]); var properties = {}; if (klass.serialize) { // (Temporary workaround) allow a class to provide static // `serialize()` and `deserialize()` methods to bypass the generic // approach. // This temporary workaround lets us use the generic serialization // approach for objects whose members include instances of dynamic // StructArray types. Once we refactor StructArray to be static, // we can remove this complexity. properties._serialized = (klass.serialize )(input, transferables); } else { for (var key in input) { // any cast due to https://github.com/facebook/flow/issues/5393 if (!(input ).hasOwnProperty(key)) { continue; } if (registry[name].omit.indexOf(key) >= 0) { continue; } var property = (input )[key]; properties[key] = registry[name].shallow.indexOf(key) >= 0 ? property : serialize(property, transferables); } } return {name: name, properties: properties}; } throw new Error(("can't serialize object of type " + (typeof input))); } function deserialize(input ) { if (input === null || input === undefined || typeof input === 'boolean' || typeof input === 'number' || typeof input === 'string' || input instanceof Boolean || input instanceof Number || input instanceof String || input instanceof Date || input instanceof RegExp || input instanceof ArrayBuffer || ArrayBuffer.isView(input) || input instanceof ImageData) { return input; } if (Array.isArray(input)) { return input.map(function (i) { return deserialize(i); }); } if (typeof input === 'object') { var ref = (input ); var name = ref.name; var properties = ref.properties; if (!name) { throw new Error("can't deserialize object of anonymous class"); } var ref$1 = registry[name]; var klass = ref$1.klass; if (!klass) { throw new Error(("can't deserialize unregistered class " + name)); } if (klass.deserialize) { return (klass.deserialize )(properties._serialized); } var result = Object.create(klass.prototype); for (var i = 0, list = Object.keys(properties); i < list.length; i += 1) { var key = list[i]; result[key] = registry[name].shallow.indexOf(key) >= 0 ? properties[key] : deserialize(properties[key]); } return result; } throw new Error(("can't deserialize object of type " + (typeof input))); } module.exports = { register: register, serialize: serialize, deserialize: deserialize }; },{"../style-spec/expression":144,"../style-spec/expression/compound_expression":128,"../style-spec/expression/definitions":136,"../style-spec/util/color":158,"./window":259,"assert":13,"grid-index":25}],284:[function(require,module,exports){ 'use strict';// var assert = require('assert'); var WebWorker = require('./web_worker'); /** * Constructs a worker pool. * @private */ var WorkerPool = function WorkerPool() { this.active = {}; }; WorkerPool.prototype.acquire = function acquire (mapId ) { var this$1 = this; if (!this.workers) { // Lazily look up the value of mapboxgl.workerCount. This allows // client code a chance to set it while circumventing cyclic // dependency problems var workerCount = require('../').workerCount; assert(typeof workerCount === 'number' && workerCount < Infinity); this.workers = []; while (this.workers.length < workerCount) { this$1.workers.push(new WebWorker()); } } this.active[mapId] = true; return this.workers.slice(); }; WorkerPool.prototype.release = function release (mapId ) { delete this.active[mapId]; if (Object.keys(this.active).length === 0) { this.workers.forEach(function (w) { w.terminate(); }); this.workers = (null ); } }; module.exports = WorkerPool; },{"../":78,"./web_worker":258,"assert":13}]},{},[78])(78) }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvQG1hcGJveC9nZW9qc29uLWFyZWEvaW5kZXguanMiLCJub2RlX21vZHVsZXMvQG1hcGJveC9nbC1tYXRyaXgvZGlzdC9nbC1tYXRyaXguanMiLCJub2RlX21vZHVsZXMvQG1hcGJveC9tYXBib3gtZ2wtc3VwcG9ydGVkL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0BtYXBib3gvcG9pbnQtZ2VvbWV0cnkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvQG1hcGJveC9zaGVsZi1wYWNrL2luZGV4LnVtZC5qcyIsIm5vZGVfbW9kdWxlcy9AbWFwYm94L3Rpbnktc2RmL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0BtYXBib3gvdW5pdGJlemllci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9AbWFwYm94L3ZlY3Rvci10aWxlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL0BtYXBib3gvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGUuanMiLCJub2RlX21vZHVsZXMvQG1hcGJveC92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMiLCJub2RlX21vZHVsZXMvQG1hcGJveC92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWxheWVyLmpzIiwibm9kZV9tb2R1bGVzL0BtYXBib3gvd2hvb3RzLWpzL2luZGV4LnVtZC5qcyIsIm5vZGVfbW9kdWxlcy9hc3NlcnQvYXNzZXJ0LmpzIiwibm9kZV9tb2R1bGVzL2Nzc2NvbG9ycGFyc2VyL2Nzc2NvbG9ycGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL2VhcmN1dC9zcmMvZWFyY3V0LmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tcmV3aW5kL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2NsaXAuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvY29udmVydC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9mZWF0dXJlLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3NpbXBsaWZ5LmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3RpbGUuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvdHJhbnNmb3JtLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3dyYXAuanMiLCJub2RlX21vZHVsZXMvZ3JpZC1pbmRleC9ncmlkLWluZGV4LmpzIiwibm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCJub2RlX21vZHVsZXMva2RidXNoL3NyYy9rZGJ1c2guanMiLCJub2RlX21vZHVsZXMva2RidXNoL3NyYy9yYW5nZS5qcyIsIm5vZGVfbW9kdWxlcy9rZGJ1c2gvc3JjL3NvcnQuanMiLCJub2RlX21vZHVsZXMva2RidXNoL3NyYy93aXRoaW4uanMiLCJub2RlX21vZHVsZXMvcGJmL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9xdWlja3NlbGVjdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zdXBlcmNsdXN0ZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdGlueXF1ZXVlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3V0aWwvbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvdXRpbC9zdXBwb3J0L2lzQnVmZmVyQnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiLCJub2RlX21vZHVsZXMvdnQtcGJmL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3Z0LXBiZi9saWIvZ2VvanNvbl93cmFwcGVyLmpzIiwibm9kZV9tb2R1bGVzL3dlYndvcmtpZnkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvd2dzODQvaW5kZXguanMiLCJwYWNrYWdlLmpzb24iLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL2RhdGEvYXJyYXlfdHlwZXMuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL2RhdGEvYnVja2V0LmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9kYXRhL2J1Y2tldC9jaXJjbGVfYXR0cmlidXRlcy5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvZGF0YS9idWNrZXQvY2lyY2xlX2J1Y2tldC5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvZGF0YS9idWNrZXQvZmlsbF9hdHRyaWJ1dGVzLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9kYXRhL2J1Y2tldC9maWxsX2J1Y2tldC5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvZGF0YS9idWNrZXQvZmlsbF9leHRydXNpb25fYXR0cmlidXRlcy5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvZGF0YS9idWNrZXQvZmlsbF9leHRydXNpb25fYnVja2V0LmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9kYXRhL2J1Y2tldC9oZWF0bWFwX2J1Y2tldC5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvZGF0YS9idWNrZXQvbGluZV9hdHRyaWJ1dGVzLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9kYXRhL2J1Y2tldC9saW5lX2J1Y2tldC5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvZGF0YS9idWNrZXQvc3ltYm9sX2F0dHJpYnV0ZXMuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL2RhdGEvZGVtX2RhdGEuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL2RhdGEvZXh0ZW50LmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9kYXRhL2ZlYXR1cmVfaW5kZXguanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL2RhdGEvaW5kZXhfYXJyYXlfdHlwZS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvZGF0YS9sb2FkX2dlb21ldHJ5LmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9kYXRhL3Bvc19hdHRyaWJ1dGVzLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9kYXRhL3Byb2dyYW1fY29uZmlndXJhdGlvbi5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvZGF0YS9yYXN0ZXJfYm91bmRzX2F0dHJpYnV0ZXMuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL2RhdGEvc2VnbWVudC5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvZ2VvL2Nvb3JkaW5hdGUuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL2dlby9sbmdfbGF0LmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9nZW8vbG5nX2xhdF9ib3VuZHMuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL2dlby90cmFuc2Zvcm0uanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL2dsL2NvbG9yX21vZGUuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL2dsL2NvbnRleHQuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL2dsL2RlcHRoX21vZGUuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL2dsL2ZyYW1lYnVmZmVyLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9nbC9pbmRleF9idWZmZXIuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL2dsL3N0ZW5jaWxfbW9kZS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvZ2wvdmFsdWUuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL2dsL3ZlcnRleF9idWZmZXIuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL2luZGV4LmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9yZW5kZXIvZHJhd19iYWNrZ3JvdW5kLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9yZW5kZXIvZHJhd19jaXJjbGUuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3JlbmRlci9kcmF3X2NvbGxpc2lvbl9kZWJ1Zy5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvcmVuZGVyL2RyYXdfZGVidWcuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3JlbmRlci9kcmF3X2ZpbGwuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3JlbmRlci9kcmF3X2ZpbGxfZXh0cnVzaW9uLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9yZW5kZXIvZHJhd19oZWF0bWFwLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9yZW5kZXIvZHJhd19oaWxsc2hhZGUuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3JlbmRlci9kcmF3X2xpbmUuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3JlbmRlci9kcmF3X3Jhc3Rlci5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvcmVuZGVyL2RyYXdfc3ltYm9sLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9yZW5kZXIvZ2x5cGhfYXRsYXMuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3JlbmRlci9nbHlwaF9tYW5hZ2VyLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9yZW5kZXIvaW1hZ2VfYXRsYXMuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3JlbmRlci9pbWFnZV9tYW5hZ2VyLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9yZW5kZXIvbGluZV9hdGxhcy5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvcmVuZGVyL3BhaW50ZXIuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3JlbmRlci9wYXR0ZXJuLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9yZW5kZXIvcHJvZ3JhbS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvcmVuZGVyL3RleHR1cmUuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3JlbmRlci90aWxlX21hc2suanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3JlbmRlci92ZXJ0ZXhfYXJyYXlfb2JqZWN0LmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zaGFkZXJzL2VuY29kZV9hdHRyaWJ1dGUuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3NoYWRlcnMvaW5kZXguanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3NvdXJjZS9jYW52YXNfc291cmNlLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zb3VyY2UvZ2VvanNvbl9zb3VyY2UuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3NvdXJjZS9nZW9qc29uX3dvcmtlcl9zb3VyY2UuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3NvdXJjZS9nZW9qc29uX3dyYXBwZXIuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3NvdXJjZS9pbWFnZV9zb3VyY2UuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3NvdXJjZS9sb2FkX3RpbGVqc29uLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3NvdXJjZS9xdWVyeV9mZWF0dXJlcy5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc291cmNlL3Jhc3Rlcl9kZW1fdGlsZV9zb3VyY2UuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3NvdXJjZS9yYXN0ZXJfZGVtX3RpbGVfd29ya2VyX3NvdXJjZS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc291cmNlL3Jhc3Rlcl90aWxlX3NvdXJjZS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc291cmNlL3J0bF90ZXh0X3BsdWdpbi5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc291cmNlL3NvdXJjZS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc291cmNlL3NvdXJjZV9jYWNoZS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc291cmNlL3RpbGUuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3NvdXJjZS90aWxlX2JvdW5kcy5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc291cmNlL3RpbGVfaWQuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3NvdXJjZS92ZWN0b3JfdGlsZV9zb3VyY2UuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3NvdXJjZS92ZWN0b3JfdGlsZV93b3JrZXJfc291cmNlLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zb3VyY2UvdmlkZW9fc291cmNlLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zb3VyY2Uvd29ya2VyLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zb3VyY2Uvd29ya2VyX3RpbGUuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvZGVyZWYuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvZGlmZi5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUtc3BlYy9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vY29tcG91bmRfZXhwcmVzc2lvbi5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2FycmF5LmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvYXNzZXJ0aW9uLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvYXQuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9jYXNlLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvY29hbGVzY2UuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9jb2VyY2lvbi5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2VxdWFscy5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2luZGV4LmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW50ZXJwb2xhdGUuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9sZXQuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9saXRlcmFsLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvbWF0Y2guanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9zdGVwLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvdmFyLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZXZhbHVhdGlvbl9jb250ZXh0LmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vaW5kZXguanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9pc19jb25zdGFudC5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3BhcnNpbmdfY29udGV4dC5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3BhcnNpbmdfZXJyb3IuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9ydW50aW1lX2Vycm9yLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vc2NvcGUuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9zdG9wcy5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdmFsdWVzLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL2ZlYXR1cmVfZmlsdGVyL2luZGV4LmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL2Z1bmN0aW9uL2luZGV4LmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL2dyb3VwX2J5X2xheW91dC5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0LmpzIiwic3JjL3N0eWxlLXNwZWMvcmVmZXJlbmNlL3Y4Lmpzb24iLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvdXRpbC9jb2xvci5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUtc3BlYy91dGlsL2NvbG9yX3NwYWNlcy5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUtc3BlYy91dGlsL2RlZXBfZXF1YWwuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvdXRpbC9leHRlbmQuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvdXRpbC9nZXRfdHlwZS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL3V0aWwvcmVmX3Byb3BlcnRpZXMuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvdXRpbC9yZXN1bHQuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvdXRpbC91bmJ1bmRsZV9qc29ubGludC5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9hcnJheS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9ib29sZWFuLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2NvbG9yLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2NvbnN0YW50cy5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9lbnVtLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2V4cHJlc3Npb24uanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfZmlsdGVyLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2Z1bmN0aW9uLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2dseXBoc191cmwuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfbGF5ZXIuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfbGF5b3V0X3Byb3BlcnR5LmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2xpZ2h0LmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX251bWJlci5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9vYmplY3QuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfcGFpbnRfcHJvcGVydHkuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfcHJvcGVydHkuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfc291cmNlLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX3N0cmluZy5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZV9zdHlsZS5taW4uanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycy5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUvbGlnaHQuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlL2xvYWRfZ2x5cGhfcmFuZ2UuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlL2xvYWRfc3ByaXRlLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS9wYXJzZV9nbHlwaF9wYmYuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlL3BhdXNlYWJsZV9wbGFjZW1lbnQuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlL3Byb3BlcnRpZXMuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlL3F1ZXJ5X3V0aWxzLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS9zdHlsZS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlL3N0eWxlX2xheWVyL2JhY2tncm91bmRfc3R5bGVfbGF5ZXIuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlL3N0eWxlX2xheWVyL2JhY2tncm91bmRfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvY2lyY2xlX3N0eWxlX2xheWVyLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS9zdHlsZV9sYXllci9jaXJjbGVfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXIuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfZXh0cnVzaW9uX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfc3R5bGVfbGF5ZXIuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvaGVhdG1hcF9zdHlsZV9sYXllci5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvaGVhdG1hcF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS9zdHlsZV9sYXllci9oaWxsc2hhZGVfc3R5bGVfbGF5ZXIuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlL3N0eWxlX2xheWVyL2hpbGxzaGFkZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS9zdHlsZV9sYXllci9saW5lX3N0eWxlX2xheWVyLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS9zdHlsZV9sYXllci9saW5lX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlL3N0eWxlX2xheWVyL3Jhc3Rlcl9zdHlsZV9sYXllci5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvcmFzdGVyX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllci5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvc3ltYm9sX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N0eWxlL3N0eWxlX2xheWVyX2luZGV4LmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zdHlsZS92YWxpZGF0ZV9zdHlsZS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3R5bGUvem9vbV9oaXN0b3J5LmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zeW1ib2wvYW5jaG9yLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zeW1ib2wvY2hlY2tfbWF4X2FuZ2xlLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zeW1ib2wvY2xpcF9saW5lLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zeW1ib2wvY29sbGlzaW9uX2ZlYXR1cmUuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N5bWJvbC9jb2xsaXNpb25faW5kZXguanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N5bWJvbC9jcm9zc190aWxlX3N5bWJvbF9pbmRleC5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3ltYm9sL2dldF9hbmNob3JzLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zeW1ib2wvZ3JpZF9pbmRleC5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3ltYm9sL21lcmdlbGluZXMuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N5bWJvbC9vcGFjaXR5X3N0YXRlLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zeW1ib2wvcGxhY2VtZW50LmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zeW1ib2wvcHJvamVjdGlvbi5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3ltYm9sL3F1YWRzLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy9zeW1ib2wvc2hhcGluZy5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3ltYm9sL3N5bWJvbF9sYXlvdXQuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3N5bWJvbC9zeW1ib2xfc2l6ZS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvc3ltYm9sL3RyYW5zZm9ybV90ZXh0LmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy91aS9iaW5kX2hhbmRsZXJzLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy91aS9jYW1lcmEuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3VpL2NvbnRyb2wvYXR0cmlidXRpb25fY29udHJvbC5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvdWkvY29udHJvbC9mdWxsc2NyZWVuX2NvbnRyb2wuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3VpL2NvbnRyb2wvZ2VvbG9jYXRlX2NvbnRyb2wuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3VpL2NvbnRyb2wvbG9nb19jb250cm9sLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy91aS9jb250cm9sL25hdmlnYXRpb25fY29udHJvbC5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvdWkvY29udHJvbC9zY2FsZV9jb250cm9sLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy91aS9ldmVudHMuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3VpL2hhbmRsZXIvYm94X3pvb20uanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3VpL2hhbmRsZXIvZGJsY2xpY2tfem9vbS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvdWkvaGFuZGxlci9kcmFnX3Bhbi5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvdWkvaGFuZGxlci9kcmFnX3JvdGF0ZS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvdWkvaGFuZGxlci9rZXlib2FyZC5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvdWkvaGFuZGxlci9zY3JvbGxfem9vbS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvdWkvaGFuZGxlci90b3VjaF96b29tX3JvdGF0ZS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvdWkvaGFzaC5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvdWkvbWFwLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy91aS9tYXJrZXIuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3VpL3BvcHVwLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy91dGlsL2FjdG9yLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy91dGlsL2FqYXguanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3V0aWwvYnJvd3Nlci5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvdXRpbC9icm93c2VyL3dlYl93b3JrZXIuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3V0aWwvYnJvd3Nlci93aW5kb3cuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3V0aWwvY2xhc3NpZnlfcmluZ3MuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3V0aWwvY29uZmlnLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy91dGlsL2RpY3Rpb25hcnlfY29kZXIuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3V0aWwvZGlzcGF0Y2hlci5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvdXRpbC9kb20uanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3V0aWwvZXZlbnRlZC5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvdXRpbC9maW5kX3BvbGVfb2ZfaW5hY2Nlc3NpYmlsaXR5LmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy91dGlsL2dsb2JhbF93b3JrZXJfcG9vbC5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvdXRpbC9pbWFnZS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvdXRpbC9pbnRlcnNlY3Rpb25fdGVzdHMuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3V0aWwvaXNfY2hhcl9pbl91bmljb2RlX2Jsb2NrLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy91dGlsL2xydV9jYWNoZS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvdXRpbC9tYXBib3guanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3V0aWwvcGVyZm9ybWFuY2UuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3V0aWwvc2NyaXB0X2RldGVjdGlvbi5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvdXRpbC9zbWFydF93cmFwLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy91dGlsL3N0cnVjdF9hcnJheS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvdXRpbC90aHJvdHRsZS5qcyIsIi9yb290L21hcGJveC1nbC1qcy9zcmMvdXRpbC90aWxlX2NvdmVyLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy91dGlsL3Rva2VuLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy91dGlsL3V0aWwuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3V0aWwvdmVjdG9ydGlsZV90b19nZW9qc29uLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy91dGlsL3ZlcnRpY2FsaXplX3B1bmN0dWF0aW9uLmpzIiwiL3Jvb3QvbWFwYm94LWdsLWpzL3NyYy91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXIuanMiLCIvcm9vdC9tYXBib3gtZ2wtanMvc3JjL3V0aWwvd29ya2VyX3Bvb2wuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaGdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pHQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN6RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzFlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxbUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDMWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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MEJBQUEsR0FBRztRQUNaLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0tBQ25ELENBQUE7O0lBRUQsd0NBQUEsV0FBVyx3QkFBQSxDQUFDLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxHQUFHLFVBQVU7UUFDN0ksR0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25CLEdBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNsQixHQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FB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QUFDLEVBQUUsQ0FBQTtJQUMxRCxtQkFBQSxBQUFJLEVBQUUsZ0JBQUEsR0FBRyxFQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDNUQsbUJBQUEsQUFBSSxFQUFFLGdCQUFBLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQzFELG1CQUFBLEFBQUksRUFBRSxnQkFBQSxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUM1RCxtQkFBQSxBQUFJLEVBQUUsZ0JBQUEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDMUQsbUJBQUEsQUFBSSxFQUFFLGdCQUFBLEdBQUcsRUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQzVELG1CQUFBLEFBQUksRUFBRSxnQkFBQSxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUMxRCxtQkFBQSxBQUFJLFlBQVksZ0JBQUEsR0FBRyxFQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDdkUsbUJBQUEsQUFB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d0JBRUwsQUFBSSxHQUFLLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQzVDLEFBQUksR0FBSyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUM3QixBQUFJLElBQUksWUFBWSxHQUFHLElBQUksR0FBRyxLQUFLLEVBQUUsRUFBQSxZQUFZLEdBQUcsQ0FBQyxDQUFDLEVBQUE7O3dCQUV0RCxBQUFJLFNBQVMsQ0FBQyxNQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO3dCQUN0RixBQUFJLFNBQVMsQ0FBQyxNQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDOzt3QkFFdEYsQUFBSSxZQUFZLElBQUksSUFBSSxDQUFDOzt3QkFFekIsQUFBSSxTQUFTLENBQUMsTUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQzt3QkFDdEYsQUFBSSxTQUFTLENBQUMsTUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZ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LFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUEsT0FBTyxFQUFBOztNQUV6RixBQUFFO01BQ0YsQUFBRTtNQUNGLEFBQUU7O01BRUYsQUFBRTtNQUNGLEFBQUUsR0FBSyxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztNQUNuQyxBQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1VBQ3BELEFBQUUscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ3BDLEFBQUUsQ0FBQzs7TUFFSCxBQUFFLEdBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7VUFDekIsQUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7TUFFNUIsQUFBRSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsU0FBQSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQUFBRztVQUM3QyxBQUFFLEdBQUssQ0FBQyxDQUFDLEdBQUcsTUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztVQUN6QyxBQUFFLEdBQUssQ0FBQyxDQUFDLEdBQUcsTUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztVQUN6QyxBQUFFLEdBQUssQ0FBQyxRQUFRLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1VBQzdELEFBQUUsR0FBSyxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7VUFDN0QsQUFB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Q0FBQyxHQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxBQUFJO1FBQ0osQUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RCxBQUFJLENBQUM7SUFDTCxBQUFJO0lBQ0osQUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkMsQUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFELEFBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRCxBQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdFLEFBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7QUFDM0IsQUFBSSxDQUFDLENBQUE7O0FBRUwsQUFBSSxrQkFBQSxTQUFTLHNCQUFBLEdBQUc7SUFDWixBQUFJLE9BQU8sSUFBSSxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ3RLLEFBQUksQ0FBQyxDQUFBOztBQUVMLEFBQUksa0JBQUEsY0FBYywyQkFBQSxDQUFDLFVBQVUsS0FBSyxBQUFJLEVBQUUsRUFBRSxJQUFJLEFBQUksRUFBRSxFQUFFLElBQUksQUFBSSxFQUFFO0lBQzVELEFBQUksR0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3pCLEFBQUksR0FBSyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDOztJQUUvQixBQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUEsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLEVBQUE7O0lBRTNFLEFBQUksR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUc7UUFDdEIsQUFBSSxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUc7UUFDOUIsQUFBSSxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHO1FBQ3RCLEFBQUksS0FBSyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7O0lBRW5DLEFBQUksUUFBUSxFQUFFO0lBQ2QsQUFBSSxLQUFLLENBQUMsQ0FBQztRQUNQLEFBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDdEIsQUFBSSxNQUFNO0lBQ2QsQUFBSSxLQUFLLENBQUM7UUFDTixBQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLEFBQUksTUFBTTtJQUNkLEFBQUksQ0FBQzs7SUFFTCxBQUFJLFFBQVEsRUFBRTtJQUNkLEFBQUksS0FBSyxDQUFDLENBQUM7UUFDUCxBQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLEFBQUksTUFBTTtJQUNkLEFBQUksS0FBSyxDQUFDO1FBQ04sQUFBSSxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUN0QixBQUFJLE1BQU07SUFDZCxBQUFJLENBQUM7O0lBRUwsQUFBSSxHQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRSxBQUFJLEdBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hFLEFBQUksR0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEUsQUFBSSxHQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7SUFFaEUsQUFBSSxHQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDM0IsQUFBSSxHQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxH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QUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQUFBSSxHQUFLLENBQUMsV0FBVyxHQUFHLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDbkYsQUFBSSxHQUFLLENBQUMsWUFBWSxHQUFHO1FBQ3JCLEFBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLEFBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRCxBQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELEFBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxRCxBQUFJLENBQUMsQ0FBQztJQUNOLEFBQUksT0FBTyxTQUFTLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDbkcsQUFBSSxDQUFDLElBQUksQ0FBQyxTQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxBQUFHLFNBQUEsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUEsQ0FBQyxDQUFDO0FBQzNGLEFBQUksQ0FBQyxDQUFBOztBQUVMLEFB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Q0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7Q0FDdEQ7Ozs7QUFJRCxHQUFLLENBQUMsV0FBVyxHQUFHO0lBQ2hCLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDYixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUQsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5RixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0TSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3TyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL1AsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVELEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakYsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0RSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0MsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUQsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEIsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkgsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNySCxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RCxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoTCxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDaEQsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDeE4sR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0ssR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9CLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxSixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeFosR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RMLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEksR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEgsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0YsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0RSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JLLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkIsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVGLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5SixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckwsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckksR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEosR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUYsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9DLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RixJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0YsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEYsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM1RCxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEksR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xJLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDcEUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6SyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25FLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuSixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hJLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25JLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25JLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDakUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUYsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9DLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25SLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwUixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFD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QUUsR0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztNQUM1QixBQUFFLEdBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7TUFDNUIsQUFBRSxHQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7TUFDdEIsQUFBRSxHQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7O01BRXZCLEFBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFBLENBQUMsRUFBRSxHQUFBLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7TUFFOUUsQUFBRTtNQUNGLEFBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztNQUM1RixBQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEFBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO01BQzVGLEFBQUUsU0FBUyxDQUFDLElBQUksQ0FB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QUksQ0FBQyxDQUFBOztBQUVMLEFBQUk7QUFDSixBQUFJLDBCQUFBLEdBQUcsZ0JBQUEsQ0FBQyxJQUFJLFdBQVcsQUFBSSxFQUFFLE1BQU0sS0FBSyxBQUFJLEVBQUU7SUFDMUMsQUFBSSxHQUFLLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxBQUFJLEdBQUssQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O0lBRXZELEFBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzVDLEFBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqRixBQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLEFBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsQUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sS0FBSyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxD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QyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdEU7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3pDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzVFO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNyQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN4RTtRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDdkMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDMUU7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3ZDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzFFO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUMvQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FB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R0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNsQzs7O1FBR0QsR0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOzs7Ozs7OztRQVF2QixTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDVixHQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDdkcsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM3Qzs7UUFFRCxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtRQUM3RCxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtRQUM3RCxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTs7O1FBRzlDLEdBQUssQ0FBQyxF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QUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0IsQUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0IsQUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7SUFFcEMsQUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQSxZQUFXLEdBQUUsSUFBSSxRQUFJLEdBQUUsSUFBSSxRQUFJLENBQUMsQ0FBQyxDQUFDOztJQUVsRSxBQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFHLElBQUksR0FBRyxJQUFJLENBQUEsT0FBRyxBQUFDLENBQUM7SUFDL0MsQUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFBLE9BQUcsQUFBQyxDQUFDO0FBQ3BELEFBQUksQ0FBQyxDQUFBOztBQUVMLEFBQUkseUJBQUEsVUFBVSx1QkFBQSxDQUFDLENBQUMsUUFBUSxBQUFJLEVBQUU7SUFDMUIsQUFBSSxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLEVBQUEsT0FBTyxFQUFBOztJQUUvQixBQUFJLEdBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVM7UUFDekIsQUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNsQyxBQUFJLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBRTtZQUMzQixBQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLEFBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFD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LFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztRQUV0RSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFO1lBQzlDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDcEY7O1FBRUQsT0FBTyxNQUFNLENBQUM7S0FDakIsQ0FBQTs7Ozs7Ozs7O0lBU0QsY0FBQSxZQUFZLEFBQUMseUJBQUEsR0FBRztRQUNaLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDL0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNqRSxPQUFPLElBQUksWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2pFLE1BQU07WUFDSCxPQUFPLElBQUksQ0FB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QUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBQSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBO1FBQ2pDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBQSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBO1FBQ2pDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBQSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBO1FBQ2pDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBQSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBO0tBQ3BDOztJQUVELEdBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztJQUMxQixHQUFLLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7SUFDM0IsR0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6QyxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7OztJQUdyQixHQUFLLENBQUMsU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQzs7SUFFOUMsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFLEVBQUEsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBQTs7O0lBR2pELEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLElBQUksUUFBUSxFQUFFO1FBQ3hDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FB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QyxDQUFDLE1BQU07UUFDdkIsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUc7S0FDcEIsQ0FBQztDQUNMOztBQUVELFNBQVMsU0FBUyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7SUFDN0MsR0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdDLEdBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs7O0lBRzVDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3BDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDekMsR0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztLQUNqQzs7O0lBR0QsR0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDekIsR0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FB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LEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsSUFBSSxFQUFFLEdBQUc7SUFDVCxHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNS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QUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQzNDLEFBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBQSxDQUFDLENBQUMsRUFBRSxBQUFHO1lBQzVCLEFBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3RCLEFBQUksQ0FBQyxDQUFDLENBQUM7UUFDUCxBQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsQUFBSSxDQUFDLENBQUM7SUFDbkMsQUFBSSxDQUFDO0FBQ1QsQUFBSSxDQUFDLENBQUEsQUFDSjs7QUFFRCxNQUFNLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJ2YXIgd2dzODQgPSByZXF1aXJlKCd3Z3M4NCcpO1xuXG5tb2R1bGUuZXhwb3J0cy5nZW9tZXRyeSA9IGdlb21ldHJ5O1xubW9kdWxlLmV4cG9ydHMucmluZyA9IHJpbmdBcmVhO1xuXG5mdW5jdGlvbiBnZW9tZXRyeShfKSB7XG4gICAgdmFyIGFyZWEgPSAwLCBpO1xuICAgIHN3aXRjaCAoXy50eXBlKSB7XG4gICAgICAgIGNhc2UgJ1BvbHlnb24nOlxuICAgICAgICAgICAgcmV0dXJuIHBvbHlnb25BcmVhKF8uY29vcmRpbmF0ZXMpO1xuICAgICAgICBjYXNlICdNdWx0aVBvbHlnb24nOlxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IF8uY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBhcmVhICs9IHBvbHlnb25BcmVhKF8uY29vcmRpbmF0ZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFyZWE7XG4gICAgICAgIGNhc2UgJ1BvaW50JzpcbiAgICAgICAgY2FzZSAnTXVsdGlQb2ludCc6XG4gICAgICAgIGNhc2UgJ0xpbmVTdHJpbmcnOlxuICAgICAgICBjYXNlICdNdWx0aUxpbmVTdHJpbmcnOlxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGNhc2UgJ0dlb21ldHJ5Q29sbGVjdGlvbic6XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgXy5nZW9tZXRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJlYSArPSBnZW9tZXRyeShfLmdlb21ldHJpZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFyZWE7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwb2x5Z29uQXJlYShjb29yZHMpIHtcbiAgICB2YXIgYXJlYSA9IDA7XG4gICAgaWYgKGNvb3JkcyAmJiBjb29yZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBhcmVhICs9IE1hdGguYWJzKHJpbmdBcmVhKGNvb3Jkc1swXSkpO1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJlYSAtPSBNYXRoLmFicyhyaW5nQXJlYShjb29yZHNbaV0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJlYTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIGFwcHJveGltYXRlIGFyZWEgb2YgdGhlIHBvbHlnb24gd2VyZSBpdCBwcm9qZWN0ZWQgb250b1xuICogICAgIHRoZSBlYXJ0aC4gIE5vdGUgdGhhdCB0aGlzIGFyZWEgd2lsbCBiZSBwb3NpdGl2ZSBpZiByaW5nIGlzIG9yaWVudGVkXG4gKiAgICAgY2xvY2t3aXNlLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBuZWdhdGl2ZS5cbiAqXG4gKiBSZWZlcmVuY2U6XG4gKiBSb2JlcnQuIEcuIENoYW1iZXJsYWluIGFuZCBXaWxsaWFtIEguIER1cXVldHRlLCBcIlNvbWUgQWxnb3JpdGhtcyBmb3JcbiAqICAgICBQb2x5Z29ucyBvbiBhIFNwaGVyZVwiLCBKUEwgUHVibGljYXRpb24gMDctMDMsIEpldCBQcm9wdWxzaW9uXG4gKiAgICAgTGFib3JhdG9yeSwgUGFzYWRlbmEsIENBLCBKdW5lIDIwMDcgaHR0cDovL3Rycy1uZXcuanBsLm5hc2EuZ292L2RzcGFjZS9oYW5kbGUvMjAxNC80MDQwOVxuICpcbiAqIFJldHVybnM6XG4gKiB7ZmxvYXR9IFRoZSBhcHByb3hpbWF0ZSBzaWduZWQgZ2VvZGVzaWMgYXJlYSBvZiB0aGUgcG9seWdvbiBpbiBzcXVhcmVcbiAqICAgICBtZXRlcnMuXG4gKi9cblxuZnVuY3Rpb24gcmluZ0FyZWEoY29vcmRzKSB7XG4gICAgdmFyIHAxLCBwMiwgcDMsIGxvd2VySW5kZXgsIG1pZGRsZUluZGV4LCB1cHBlckluZGV4LCBpLFxuICAgIGFyZWEgPSAwLFxuICAgIGNvb3Jkc0xlbmd0aCA9IGNvb3Jkcy5sZW5ndGg7XG5cbiAgICBpZiAoY29vcmRzTGVuZ3RoID4gMikge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID09PSBjb29yZHNMZW5ndGggLSAyKSB7Ly8gaSA9IE4tMlxuICAgICAgICAgICAgICAgIGxvd2VySW5kZXggPSBjb29yZHNMZW5ndGggLSAyO1xuICAgICAgICAgICAgICAgIG1pZGRsZUluZGV4ID0gY29vcmRzTGVuZ3RoIC0xO1xuICAgICAgICAgICAgICAgIHVwcGVySW5kZXggPSAwO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpID09PSBjb29yZHNMZW5ndGggLSAxKSB7Ly8gaSA9IE4tMVxuICAgICAgICAgICAgICAgIGxvd2VySW5kZXggPSBjb29yZHNMZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIG1pZGRsZUluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB1cHBlckluZGV4ID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIGkgPSAwIHRvIE4tM1xuICAgICAgICAgICAgICAgIGxvd2VySW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIG1pZGRsZUluZGV4ID0gaSsxO1xuICAgICAgICAgICAgICAgIHVwcGVySW5kZXggPSBpKzI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwMSA9IGNvb3Jkc1tsb3dlckluZGV4XTtcbiAgICAgICAgICAgIHAyID0gY29vcmRzW21pZGRsZUluZGV4XTtcbiAgICAgICAgICAgIHAzID0gY29vcmRzW3VwcGVySW5kZXhdO1xuICAgICAgICAgICAgYXJlYSArPSAoIHJhZChwM1swXSkgLSByYWQocDFbMF0pICkgKiBNYXRoLnNpbiggcmFkKHAyWzFdKSk7XG4gICAgICAgIH1cblxuICAgICAgICBhcmVhID0gYXJlYSAqIHdnczg0LlJBRElVUyAqIHdnczg0LlJBRElVUyAvIDI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZWE7XG59XG5cbmZ1bmN0aW9uIHJhZChfKSB7XG4gICAgcmV0dXJuIF8gKiBNYXRoLlBJIC8gMTgwO1xufSIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG4gICAgKGdsb2JhbC5nbE1hdHJpeCA9IGZhY3RvcnkoKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgIHZhciBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KDMpO1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIHJldHVybiBvdXQ7XG59XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuZnVuY3Rpb24gdHJhbnNmb3JtTWF0MyhvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLCB6ID0gYVsyXTtcbiAgICBvdXRbMF0gPSB4ICogbVswXSArIHkgKiBtWzNdICsgeiAqIG1bNl07XG4gICAgb3V0WzFdID0geCAqIG1bMV0gKyB5ICogbVs0XSArIHogKiBtWzddO1xuICAgIG91dFsyXSA9IHggKiBtWzJdICsgeSAqIG1bNV0gKyB6ICogbVs4XTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG5cblxuXG52YXIgdmVjID0gY3JlYXRlKCk7XG5cbmZ1bmN0aW9uIGNyZWF0ZSQxKCkge1xuICAgIHZhciBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KDQpO1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuZnVuY3Rpb24gc2NhbGUkMShvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICogYjtcbiAgICBvdXRbMV0gPSBhWzFdICogYjtcbiAgICBvdXRbMl0gPSBhWzJdICogYjtcbiAgICBvdXRbM10gPSBhWzNdICogYjtcbiAgICByZXR1cm4gb3V0O1xufVxuXG5cblxuXG5cblxuXG5mdW5jdGlvbiBub3JtYWxpemUkMShvdXQsIGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXSxcbiAgICAgICAgdyA9IGFbM107XG4gICAgdmFyIGxlbiA9IHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3O1xuICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICAgICAgb3V0WzBdID0geCAqIGxlbjtcbiAgICAgICAgb3V0WzFdID0geSAqIGxlbjtcbiAgICAgICAgb3V0WzJdID0geiAqIGxlbjtcbiAgICAgICAgb3V0WzNdID0gdyAqIGxlbjtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cblxuXG5cbmZ1bmN0aW9uIHRyYW5zZm9ybU1hdDQkMShvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLCB6ID0gYVsyXSwgdyA9IGFbM107XG4gICAgb3V0WzBdID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl0gKiB3O1xuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVs1XSAqIHkgKyBtWzldICogeiArIG1bMTNdICogdztcbiAgICBvdXRbMl0gPSBtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF0gKiB3O1xuICAgIG91dFszXSA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzExXSAqIHogKyBtWzE1XSAqIHc7XG4gICAgcmV0dXJuIG91dDtcbn1cblxudmFyIHZlYyQxID0gY3JlYXRlJDEoKTtcblxuZnVuY3Rpb24gY3JlYXRlJDIoKSB7XG4gICAgdmFyIG91dCA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG5cblxuXG5cblxuXG5cblxuXG5mdW5jdGlvbiByb3RhdGUob3V0LCBhLCByYWQpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLFxuICAgICAgICBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgICAgYyA9IE1hdGguY29zKHJhZCk7XG4gICAgb3V0WzBdID0gYTAgKiAgYyArIGEyICogcztcbiAgICBvdXRbMV0gPSBhMSAqICBjICsgYTMgKiBzO1xuICAgIG91dFsyXSA9IGEwICogLXMgKyBhMiAqIGM7XG4gICAgb3V0WzNdID0gYTEgKiAtcyArIGEzICogYztcbiAgICByZXR1cm4gb3V0O1xufVxuZnVuY3Rpb24gc2NhbGUkMihvdXQsIGEsIHYpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLFxuICAgICAgICB2MCA9IHZbMF0sIHYxID0gdlsxXTtcbiAgICBvdXRbMF0gPSBhMCAqIHYwO1xuICAgIG91dFsxXSA9IGExICogdjA7XG4gICAgb3V0WzJdID0gYTIgKiB2MTtcbiAgICBvdXRbM10gPSBhMyAqIHYxO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZSQzKCkge1xuICAgIHZhciBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMTtcbiAgICBvdXRbNV0gPSAwO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5mdW5jdGlvbiBmcm9tUm90YXRpb24kMShvdXQsIHJhZCkge1xuICAgIHZhciBzID0gTWF0aC5zaW4ocmFkKSwgYyA9IE1hdGguY29zKHJhZCk7XG4gICAgb3V0WzBdID0gYztcbiAgICBvdXRbMV0gPSBzO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gLXM7XG4gICAgb3V0WzRdID0gYztcbiAgICBvdXRbNV0gPSAwO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZSQ0KCkge1xuICAgIHZhciBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMTtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSAxO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAwO1xuICAgIG91dFsxNV0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59XG5cblxuXG5cbmZ1bmN0aW9uIGlkZW50aXR5JDIob3V0KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDE7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBpbnZlcnQkMihvdXQsIGEpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXSxcbiAgICAgICAgYTEwID0gYVs0XSwgYTExID0gYVs1XSwgYTEyID0gYVs2XSwgYTEzID0gYVs3XSxcbiAgICAgICAgYTIwID0gYVs4XSwgYTIxID0gYVs5XSwgYTIyID0gYVsxMF0sIGEyMyA9IGFbMTFdLFxuICAgICAgICBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdLCBhMzMgPSBhWzE1XSxcbiAgICAgICAgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwLFxuICAgICAgICBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTAsXG4gICAgICAgIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMCxcbiAgICAgICAgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExLFxuICAgICAgICBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTEsXG4gICAgICAgIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMixcbiAgICAgICAgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwLFxuICAgICAgICBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzAsXG4gICAgICAgIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMCxcbiAgICAgICAgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxLFxuICAgICAgICBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzEsXG4gICAgICAgIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMixcbiAgICAgICAgZGV0ID0gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xuICAgIGlmICghZGV0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBkZXQgPSAxLjAgLyBkZXQ7XG4gICAgb3V0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXQ7XG4gICAgb3V0WzFdID0gKGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSkgKiBkZXQ7XG4gICAgb3V0WzJdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXQ7XG4gICAgb3V0WzNdID0gKGEyMiAqIGIwNCAtIGEyMSAqIGIwNSAtIGEyMyAqIGIwMykgKiBkZXQ7XG4gICAgb3V0WzRdID0gKGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNykgKiBkZXQ7XG4gICAgb3V0WzVdID0gKGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNykgKiBkZXQ7XG4gICAgb3V0WzZdID0gKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgKiBkZXQ7XG4gICAgb3V0WzddID0gKGEyMCAqIGIwNSAtIGEyMiAqIGIwMiArIGEyMyAqIGIwMSkgKiBkZXQ7XG4gICAgb3V0WzhdID0gKGExMCAqIGIxMCAtIGExMSAqIGIwOCArIGExMyAqIGIwNikgKiBkZXQ7XG4gICAgb3V0WzldID0gKGEwMSAqIGIwOCAtIGEwMCAqIGIxMCAtIGEwMyAqIGIwNikgKiBkZXQ7XG4gICAgb3V0WzEwXSA9IChhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApICogZGV0O1xuICAgIG91dFsxMV0gPSAoYTIxICogYjAyIC0gYTIwICogYjA0IC0gYTIzICogYjAwKSAqIGRldDtcbiAgICBvdXRbMTJdID0gKGExMSAqIGIwNyAtIGExMCAqIGIwOSAtIGExMiAqIGIwNikgKiBkZXQ7XG4gICAgb3V0WzEzXSA9IChhMDAgKiBiMDkgLSBhMDEgKiBiMDcgKyBhMDIgKiBiMDYpICogZGV0O1xuICAgIG91dFsxNF0gPSAoYTMxICogYjAxIC0gYTMwICogYjAzIC0gYTMyICogYjAwKSAqIGRldDtcbiAgICBvdXRbMTVdID0gKGEyMCAqIGIwMyAtIGEyMSAqIGIwMSArIGEyMiAqIGIwMCkgKiBkZXQ7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuXG5mdW5jdGlvbiBtdWx0aXBseSQ0KG91dCwgYSwgYikge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdO1xuICAgIHZhciBiMCAgPSBiWzBdLCBiMSA9IGJbMV0sIGIyID0gYlsyXSwgYjMgPSBiWzNdO1xuICAgIG91dFswXSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICAgIG91dFsxXSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxO1xuICAgIG91dFsyXSA9IGIwICogYTAyICsgYjEgKiBhMTIgKyBiMiAqIGEyMiArIGIzICogYTMyO1xuICAgIG91dFszXSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xuICAgIGIwID0gYls0XTsgYjEgPSBiWzVdOyBiMiA9IGJbNl07IGIzID0gYls3XTtcbiAgICBvdXRbNF0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDtcbiAgICBvdXRbNV0gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTtcbiAgICBvdXRbNl0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjtcbiAgICBvdXRbN10gPSBiMCAqIGEwMyArIGIxICogYTEzICsgYjIgKiBhMjMgKyBiMyAqIGEzMztcbiAgICBiMCA9IGJbOF07IGIxID0gYls5XTsgYjIgPSBiWzEwXTsgYjMgPSBiWzExXTtcbiAgICBvdXRbOF0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDtcbiAgICBvdXRbOV0gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTtcbiAgICBvdXRbMTBdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XG4gICAgb3V0WzExXSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xuICAgIGIwID0gYlsxMl07IGIxID0gYlsxM107IGIyID0gYlsxNF07IGIzID0gYlsxNV07XG4gICAgb3V0WzEyXSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICAgIG91dFsxM10gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTtcbiAgICBvdXRbMTRdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XG4gICAgb3V0WzE1XSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xuICAgIHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiB0cmFuc2xhdGUkMShvdXQsIGEsIHYpIHtcbiAgICB2YXIgeCA9IHZbMF0sIHkgPSB2WzFdLCB6ID0gdlsyXSxcbiAgICAgICAgYTAwLCBhMDEsIGEwMiwgYTAzLFxuICAgICAgICBhMTAsIGExMSwgYTEyLCBhMTMsXG4gICAgICAgIGEyMCwgYTIxLCBhMjIsIGEyMztcbiAgICBpZiAoYSA9PT0gb3V0KSB7XG4gICAgICAgIG91dFsxMl0gPSBhWzBdICogeCArIGFbNF0gKiB5ICsgYVs4XSAqIHogKyBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbMV0gKiB4ICsgYVs1XSAqIHkgKyBhWzldICogeiArIGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYVsyXSAqIHggKyBhWzZdICogeSArIGFbMTBdICogeiArIGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYVszXSAqIHggKyBhWzddICogeSArIGFbMTFdICogeiArIGFbMTVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGEwMCA9IGFbMF07IGEwMSA9IGFbMV07IGEwMiA9IGFbMl07IGEwMyA9IGFbM107XG4gICAgICAgIGExMCA9IGFbNF07IGExMSA9IGFbNV07IGExMiA9IGFbNl07IGExMyA9IGFbN107XG4gICAgICAgIGEyMCA9IGFbOF07IGEyMSA9IGFbOV07IGEyMiA9IGFbMTBdOyBhMjMgPSBhWzExXTtcbiAgICAgICAgb3V0WzBdID0gYTAwOyBvdXRbMV0gPSBhMDE7IG91dFsyXSA9IGEwMjsgb3V0WzNdID0gYTAzO1xuICAgICAgICBvdXRbNF0gPSBhMTA7IG91dFs1XSA9IGExMTsgb3V0WzZdID0gYTEyOyBvdXRbN10gPSBhMTM7XG4gICAgICAgIG91dFs4XSA9IGEyMDsgb3V0WzldID0gYTIxOyBvdXRbMTBdID0gYTIyOyBvdXRbMTFdID0gYTIzO1xuICAgICAgICBvdXRbMTJdID0gYTAwICogeCArIGExMCAqIHkgKyBhMjAgKiB6ICsgYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhMDEgKiB4ICsgYTExICogeSArIGEyMSAqIHogKyBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGEwMiAqIHggKyBhMTIgKiB5ICsgYTIyICogeiArIGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYTAzICogeCArIGExMyAqIHkgKyBhMjMgKiB6ICsgYVsxNV07XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiBzY2FsZSQ0KG91dCwgYSwgdikge1xuICAgIHZhciB4ID0gdlswXSwgeSA9IHZbMV0sIHogPSB2WzJdO1xuICAgIG91dFswXSA9IGFbMF0gKiB4O1xuICAgIG91dFsxXSA9IGFbMV0gKiB4O1xuICAgIG91dFsyXSA9IGFbMl0gKiB4O1xuICAgIG91dFszXSA9IGFbM10gKiB4O1xuICAgIG91dFs0XSA9IGFbNF0gKiB5O1xuICAgIG91dFs1XSA9IGFbNV0gKiB5O1xuICAgIG91dFs2XSA9IGFbNl0gKiB5O1xuICAgIG91dFs3XSA9IGFbN10gKiB5O1xuICAgIG91dFs4XSA9IGFbOF0gKiB6O1xuICAgIG91dFs5XSA9IGFbOV0gKiB6O1xuICAgIG91dFsxMF0gPSBhWzEwXSAqIHo7XG4gICAgb3V0WzExXSA9IGFbMTFdICogejtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gcm90YXRlWCQxKG91dCwgYSwgcmFkKSB7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKSxcbiAgICAgICAgYTEwID0gYVs0XSxcbiAgICAgICAgYTExID0gYVs1XSxcbiAgICAgICAgYTEyID0gYVs2XSxcbiAgICAgICAgYTEzID0gYVs3XSxcbiAgICAgICAgYTIwID0gYVs4XSxcbiAgICAgICAgYTIxID0gYVs5XSxcbiAgICAgICAgYTIyID0gYVsxMF0sXG4gICAgICAgIGEyMyA9IGFbMTFdO1xuICAgIGlmIChhICE9PSBvdXQpIHtcbiAgICAgICAgb3V0WzBdICA9IGFbMF07XG4gICAgICAgIG91dFsxXSAgPSBhWzFdO1xuICAgICAgICBvdXRbMl0gID0gYVsyXTtcbiAgICAgICAgb3V0WzNdICA9IGFbM107XG4gICAgICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICB9XG4gICAgb3V0WzRdID0gYTEwICogYyArIGEyMCAqIHM7XG4gICAgb3V0WzVdID0gYTExICogYyArIGEyMSAqIHM7XG4gICAgb3V0WzZdID0gYTEyICogYyArIGEyMiAqIHM7XG4gICAgb3V0WzddID0gYTEzICogYyArIGEyMyAqIHM7XG4gICAgb3V0WzhdID0gYTIwICogYyAtIGExMCAqIHM7XG4gICAgb3V0WzldID0gYTIxICogYyAtIGExMSAqIHM7XG4gICAgb3V0WzEwXSA9IGEyMiAqIGMgLSBhMTIgKiBzO1xuICAgIG91dFsxMV0gPSBhMjMgKiBjIC0gYTEzICogcztcbiAgICByZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiByb3RhdGVaJDEob3V0LCBhLCByYWQpIHtcbiAgICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpLFxuICAgICAgICBhMDAgPSBhWzBdLFxuICAgICAgICBhMDEgPSBhWzFdLFxuICAgICAgICBhMDIgPSBhWzJdLFxuICAgICAgICBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLFxuICAgICAgICBhMTEgPSBhWzVdLFxuICAgICAgICBhMTIgPSBhWzZdLFxuICAgICAgICBhMTMgPSBhWzddO1xuICAgIGlmIChhICE9PSBvdXQpIHtcbiAgICAgICAgb3V0WzhdICA9IGFbOF07XG4gICAgICAgIG91dFs5XSAgPSBhWzldO1xuICAgICAgICBvdXRbMTBdID0gYVsxMF07XG4gICAgICAgIG91dFsxMV0gPSBhWzExXTtcbiAgICAgICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIH1cbiAgICBvdXRbMF0gPSBhMDAgKiBjICsgYTEwICogcztcbiAgICBvdXRbMV0gPSBhMDEgKiBjICsgYTExICogcztcbiAgICBvdXRbMl0gPSBhMDIgKiBjICsgYTEyICogcztcbiAgICBvdXRbM10gPSBhMDMgKiBjICsgYTEzICogcztcbiAgICBvdXRbNF0gPSBhMTAgKiBjIC0gYTAwICogcztcbiAgICBvdXRbNV0gPSBhMTEgKiBjIC0gYTAxICogcztcbiAgICBvdXRbNl0gPSBhMTIgKiBjIC0gYTAyICogcztcbiAgICBvdXRbN10gPSBhMTMgKiBjIC0gYTAzICogcztcbiAgICByZXR1cm4gb3V0O1xufVxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmZ1bmN0aW9uIHBlcnNwZWN0aXZlKG91dCwgZm92eSwgYXNwZWN0LCBuZWFyLCBmYXIpIHtcbiAgICB2YXIgZiA9IDEuMCAvIE1hdGgudGFuKGZvdnkgLyAyKSxcbiAgICAgICAgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICAgIG91dFswXSA9IGYgLyBhc3BlY3Q7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSBmO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzEwXSA9IChmYXIgKyBuZWFyKSAqIG5mO1xuICAgIG91dFsxMV0gPSAtMTtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gKDIgKiBmYXIgKiBuZWFyKSAqIG5mO1xuICAgIG91dFsxNV0gPSAwO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIG9ydGhvKG91dCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpIHtcbiAgICB2YXIgbHIgPSAxIC8gKGxlZnQgLSByaWdodCksXG4gICAgICAgIGJ0ID0gMSAvIChib3R0b20gLSB0b3ApLFxuICAgICAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzBdID0gLTIgKiBscjtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IC0yICogYnQ7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMiAqIG5mO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAobGVmdCArIHJpZ2h0KSAqIGxyO1xuICAgIG91dFsxM10gPSAodG9wICsgYm90dG9tKSAqIGJ0O1xuICAgIG91dFsxNF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG52YXIgbWFwYm94QnVpbGQgPSB7XG4gICAgdmVjMzoge1xuICAgICAgICB0cmFuc2Zvcm1NYXQzOiB0cmFuc2Zvcm1NYXQzXG4gICAgfSxcbiAgICB2ZWM0OiB7XG4gICAgICAgIHRyYW5zZm9ybU1hdDQ6IHRyYW5zZm9ybU1hdDQkMVxuICAgIH0sXG4gICAgbWF0Mjoge1xuICAgICAgICBjcmVhdGU6IGNyZWF0ZSQyLFxuICAgICAgICByb3RhdGU6IHJvdGF0ZSxcbiAgICAgICAgc2NhbGU6IHNjYWxlJDJcbiAgICB9LFxuICAgIG1hdDM6IHtcbiAgICAgICAgY3JlYXRlOiBjcmVhdGUkMyxcbiAgICAgICAgZnJvbVJvdGF0aW9uOiBmcm9tUm90YXRpb24kMVxuICAgIH0sXG4gICAgbWF0NDoge1xuICAgICAgICBjcmVhdGU6IGNyZWF0ZSQ0LFxuICAgICAgICBpZGVudGl0eTogaWRlbnRpdHkkMixcbiAgICAgICAgdHJhbnNsYXRlOiB0cmFuc2xhdGUkMSxcbiAgICAgICAgc2NhbGU6IHNjYWxlJDQsXG4gICAgICAgIG11bHRpcGx5OiBtdWx0aXBseSQ0LFxuICAgICAgICBwZXJzcGVjdGl2ZTogcGVyc3BlY3RpdmUsXG4gICAgICAgIHJvdGF0ZVg6IHJvdGF0ZVgkMSxcbiAgICAgICAgcm90YXRlWjogcm90YXRlWiQxLFxuICAgICAgICBpbnZlcnQ6IGludmVydCQyLFxuICAgICAgICBvcnRobzogb3J0aG9cbiAgICB9XG59O1xuXG5yZXR1cm4gbWFwYm94QnVpbGQ7XG5cbn0pKSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gaXNTdXBwb3J0ZWQ7XG59IGVsc2UgaWYgKHdpbmRvdykge1xuICAgIHdpbmRvdy5tYXBib3hnbCA9IHdpbmRvdy5tYXBib3hnbCB8fCB7fTtcbiAgICB3aW5kb3cubWFwYm94Z2wuc3VwcG9ydGVkID0gaXNTdXBwb3J0ZWQ7XG59XG5cbi8qKlxuICogVGVzdCB3aGV0aGVyIHRoZSBjdXJyZW50IGJyb3dzZXIgc3VwcG9ydHMgTWFwYm94IEdMIEpTXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PWZhbHNlXSBSZXR1cm4gYGZhbHNlYFxuICogICBpZiB0aGUgcGVyZm9ybWFuY2Ugb2YgTWFwYm94IEdMIEpTIHdvdWxkIGJlIGRyYW1hdGljYWxseSB3b3JzZSB0aGFuXG4gKiAgIGV4cGVjdGVkIChpLmUuIGEgc29mdHdhcmUgcmVuZGVyZXIgaXMgd291bGQgYmUgdXNlZClcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzU3VwcG9ydGVkKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gISEoXG4gICAgICAgIGlzQnJvd3NlcigpICYmXG4gICAgICAgIGlzQXJyYXlTdXBwb3J0ZWQoKSAmJlxuICAgICAgICBpc0Z1bmN0aW9uU3VwcG9ydGVkKCkgJiZcbiAgICAgICAgaXNPYmplY3RTdXBwb3J0ZWQoKSAmJlxuICAgICAgICBpc0pTT05TdXBwb3J0ZWQoKSAmJlxuICAgICAgICBpc1dvcmtlclN1cHBvcnRlZCgpICYmXG4gICAgICAgIGlzVWludDhDbGFtcGVkQXJyYXlTdXBwb3J0ZWQoKSAmJlxuICAgICAgICBpc1dlYkdMU3VwcG9ydGVkQ2FjaGVkKG9wdGlvbnMgJiYgb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGlzQnJvd3NlcigpIHtcbiAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcbn1cblxuZnVuY3Rpb24gaXNBcnJheVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICBBcnJheS5wcm90b3R5cGUgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmV2ZXJ5ICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5maWx0ZXIgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2ggJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5tYXAgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnNvbWUgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZSAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb25TdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZSAmJiBGdW5jdGlvbi5wcm90b3R5cGUuYmluZDtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3RTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgT2JqZWN0LmtleXMgJiZcbiAgICAgICAgT2JqZWN0LmNyZWF0ZSAmJlxuICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiZcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgJiZcbiAgICAgICAgT2JqZWN0LmlzU2VhbGVkICYmXG4gICAgICAgIE9iamVjdC5pc0Zyb3plbiAmJlxuICAgICAgICBPYmplY3QuaXNFeHRlbnNpYmxlICYmXG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiZcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzICYmXG4gICAgICAgIE9iamVjdC5zZWFsICYmXG4gICAgICAgIE9iamVjdC5mcmVlemUgJiZcbiAgICAgICAgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gaXNKU09OU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiAnSlNPTicgaW4gd2luZG93ICYmICdwYXJzZScgaW4gSlNPTiAmJiAnc3RyaW5naWZ5JyBpbiBKU09OO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtlclN1cHBvcnRlZCgpIHtcbiAgICBpZiAoISgnV29ya2VyJyBpbiB3aW5kb3cgJiYgJ0Jsb2InIGluIHdpbmRvdykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBibG9iID0gbmV3IEJsb2IoWycnXSwgeyB0eXBlOiAndGV4dC9qYXZhc2NyaXB0JyB9KTtcbiAgICB2YXIgd29ya2VyVVJMID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICB2YXIgc3VwcG9ydGVkO1xuICAgIHZhciB3b3JrZXI7XG5cbiAgICB0cnkge1xuICAgICAgICB3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclVSTCk7XG4gICAgICAgIHN1cHBvcnRlZCA9IHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAod29ya2VyKSB7XG4gICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICB9XG4gICAgVVJMLnJldm9rZU9iamVjdFVSTCh3b3JrZXJVUkwpO1xuXG4gICAgcmV0dXJuIHN1cHBvcnRlZDtcbn1cblxuLy8gSUUxMSBvbmx5IHN1cHBvcnRzIGBVaW50OENsYW1wZWRBcnJheWAgYXMgb2YgdmVyc2lvblxuLy8gW0tCMjkyOTQzN10oaHR0cHM6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vZW4tdXMva2IvMjkyOTQzNylcbmZ1bmN0aW9uIGlzVWludDhDbGFtcGVkQXJyYXlTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuICdVaW50OENsYW1wZWRBcnJheScgaW4gd2luZG93O1xufVxuXG52YXIgaXNXZWJHTFN1cHBvcnRlZENhY2hlID0ge307XG5mdW5jdGlvbiBpc1dlYkdMU3VwcG9ydGVkQ2FjaGVkKGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpIHtcblxuICAgIGlmIChpc1dlYkdMU3VwcG9ydGVkQ2FjaGVbZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpc1dlYkdMU3VwcG9ydGVkQ2FjaGVbZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdF0gPSBpc1dlYkdMU3VwcG9ydGVkKGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpO1xuICAgIH1cblxuICAgIHJldHVybiBpc1dlYkdMU3VwcG9ydGVkQ2FjaGVbZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdF07XG59XG5cbmlzU3VwcG9ydGVkLndlYkdMQ29udGV4dEF0dHJpYnV0ZXMgPSB7XG4gICAgYW50aWFsaWFzOiBmYWxzZSxcbiAgICBhbHBoYTogdHJ1ZSxcbiAgICBzdGVuY2lsOiB0cnVlLFxuICAgIGRlcHRoOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBpc1dlYkdMU3VwcG9ydGVkKGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpIHtcblxuICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcblxuICAgIHZhciBhdHRyaWJ1dGVzID0gT2JqZWN0LmNyZWF0ZShpc1N1cHBvcnRlZC53ZWJHTENvbnRleHRBdHRyaWJ1dGVzKTtcbiAgICBhdHRyaWJ1dGVzLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQgPSBmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0O1xuXG4gICAgaWYgKGNhbnZhcy5wcm9iYWJseVN1cHBvcnRzQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY2FudmFzLnByb2JhYmx5U3VwcG9ydHNDb250ZXh0KCd3ZWJnbCcsIGF0dHJpYnV0ZXMpIHx8XG4gICAgICAgICAgICBjYW52YXMucHJvYmFibHlTdXBwb3J0c0NvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGF0dHJpYnV0ZXMpXG4gICAgICAgICk7XG5cbiAgICB9IGVsc2UgaWYgKGNhbnZhcy5zdXBwb3J0c0NvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNhbnZhcy5zdXBwb3J0c0NvbnRleHQoJ3dlYmdsJywgYXR0cmlidXRlcykgfHxcbiAgICAgICAgICAgIGNhbnZhcy5zdXBwb3J0c0NvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGF0dHJpYnV0ZXMpXG4gICAgICAgICk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgYXR0cmlidXRlcykgfHxcbiAgICAgICAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnLCBhdHRyaWJ1dGVzKVxuICAgICAgICApO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQb2ludDtcblxuLyoqXG4gKiBBIHN0YW5kYWxvbmUgcG9pbnQgZ2VvbWV0cnkgd2l0aCB1c2VmdWwgYWNjZXNzb3IsIGNvbXBhcmlzb24sIGFuZFxuICogbW9kaWZpY2F0aW9uIG1ldGhvZHMuXG4gKlxuICogQGNsYXNzIFBvaW50XG4gKiBAcGFyYW0ge051bWJlcn0geCB0aGUgeC1jb29yZGluYXRlLiB0aGlzIGNvdWxkIGJlIGxvbmdpdHVkZSBvciBzY3JlZW5cbiAqIHBpeGVscywgb3IgYW55IG90aGVyIHNvcnQgb2YgdW5pdC5cbiAqIEBwYXJhbSB7TnVtYmVyfSB5IHRoZSB5LWNvb3JkaW5hdGUuIHRoaXMgY291bGQgYmUgbGF0aXR1ZGUgb3Igc2NyZWVuXG4gKiBwaXhlbHMsIG9yIGFueSBvdGhlciBzb3J0IG9mIHVuaXQuXG4gKiBAZXhhbXBsZVxuICogdmFyIHBvaW50ID0gbmV3IFBvaW50KC03NywgMzgpO1xuICovXG5mdW5jdGlvbiBQb2ludCh4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xufVxuXG5Qb2ludC5wcm90b3R5cGUgPSB7XG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSB0aGlzIHBvaW50LCByZXR1cm5pbmcgYSBuZXcgcG9pbnQgdGhhdCBjYW4gYmUgbW9kaWZpZWRcbiAgICAgKiB3aXRob3V0IGFmZmVjdGluZyB0aGUgb2xkIG9uZS5cbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gdGhlIGNsb25lXG4gICAgICovXG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IFBvaW50KHRoaXMueCwgdGhpcy55KTsgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCB0aGlzIHBvaW50J3MgeCAmIHkgY29vcmRpbmF0ZXMgdG8gYW5vdGhlciBwb2ludCxcbiAgICAgKiB5aWVsZGluZyBhIG5ldyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBhZGQ6ICAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX2FkZChwKTsgfSxcblxuICAgIC8qKlxuICAgICAqIFN1YnRyYWN0IHRoaXMgcG9pbnQncyB4ICYgeSBjb29yZGluYXRlcyB0byBmcm9tIHBvaW50LFxuICAgICAqIHlpZWxkaW5nIGEgbmV3IHBvaW50LlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgdGhlIG90aGVyIHBvaW50XG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIHN1YjogICAgIGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHApOyB9LFxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgdGhpcyBwb2ludCdzIHggJiB5IGNvb3JkaW5hdGVzIGJ5IHBvaW50LFxuICAgICAqIHlpZWxkaW5nIGEgbmV3IHBvaW50LlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgdGhlIG90aGVyIHBvaW50XG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIG11bHRCeVBvaW50OiAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX211bHRCeVBvaW50KHApOyB9LFxuXG4gICAgLyoqXG4gICAgICogRGl2aWRlIHRoaXMgcG9pbnQncyB4ICYgeSBjb29yZGluYXRlcyBieSBwb2ludCxcbiAgICAgKiB5aWVsZGluZyBhIG5ldyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBkaXZCeVBvaW50OiAgICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXZCeVBvaW50KHApOyB9LFxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgdGhpcyBwb2ludCdzIHggJiB5IGNvb3JkaW5hdGVzIGJ5IGEgZmFjdG9yLFxuICAgICAqIHlpZWxkaW5nIGEgbmV3IHBvaW50LlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IGsgZmFjdG9yXG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIG11bHQ6ICAgIGZ1bmN0aW9uKGspIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fbXVsdChrKTsgfSxcblxuICAgIC8qKlxuICAgICAqIERpdmlkZSB0aGlzIHBvaW50J3MgeCAmIHkgY29vcmRpbmF0ZXMgYnkgYSBmYWN0b3IsXG4gICAgICogeWllbGRpbmcgYSBuZXcgcG9pbnQuXG4gICAgICogQHBhcmFtIHtQb2ludH0gayBmYWN0b3JcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgZGl2OiAgICAgZnVuY3Rpb24oaykgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYoayk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgdGhpcyBwb2ludCBhcm91bmQgdGhlIDAsIDAgb3JpZ2luIGJ5IGFuIGFuZ2xlIGEsXG4gICAgICogZ2l2ZW4gaW4gcmFkaWFuc1xuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBhIGFuZ2xlIHRvIHJvdGF0ZSBhcm91bmQsIGluIHJhZGlhbnNcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgcm90YXRlOiAgZnVuY3Rpb24oYSkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGUoYSk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgdGhpcyBwb2ludCBhcm91bmQgcCBwb2ludCBieSBhbiBhbmdsZSBhLFxuICAgICAqIGdpdmVuIGluIHJhZGlhbnNcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYSBhbmdsZSB0byByb3RhdGUgYXJvdW5kLCBpbiByYWRpYW5zXG4gICAgICogQHBhcmFtIHtQb2ludH0gcCBQb2ludCB0byByb3RhdGUgYXJvdW5kXG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIHJvdGF0ZUFyb3VuZDogIGZ1bmN0aW9uKGEscCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGVBcm91bmQoYSxwKTsgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHRoaXMgcG9pbnQgYnkgYSA0eDEgdHJhbnNmb3JtYXRpb24gbWF0cml4XG4gICAgICogQHBhcmFtIHtBcnJheTxOdW1iZXI+fSBtIHRyYW5zZm9ybWF0aW9uIG1hdHJpeFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBtYXRNdWx0OiBmdW5jdGlvbihtKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX21hdE11bHQobSk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhpcyBwb2ludCBidXQgYXMgYSB1bml0IHZlY3RvciBmcm9tIDAsIDAsIG1lYW5pbmdcbiAgICAgKiB0aGF0IHRoZSBkaXN0YW5jZSBmcm9tIHRoZSByZXN1bHRpbmcgcG9pbnQgdG8gdGhlIDAsIDBcbiAgICAgKiBjb29yZGluYXRlIHdpbGwgYmUgZXF1YWwgdG8gMSBhbmQgdGhlIGFuZ2xlIGZyb20gdGhlIHJlc3VsdGluZ1xuICAgICAqIHBvaW50IHRvIHRoZSAwLCAwIGNvb3JkaW5hdGUgd2lsbCBiZSB0aGUgc2FtZSBhcyBiZWZvcmUuXG4gICAgICogQHJldHVybiB7UG9pbnR9IHVuaXQgdmVjdG9yIHBvaW50XG4gICAgICovXG4gICAgdW5pdDogICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3VuaXQoKTsgfSxcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGUgYSBwZXJwZW5kaWN1bGFyIHBvaW50LCB3aGVyZSB0aGUgbmV3IHkgY29vcmRpbmF0ZVxuICAgICAqIGlzIHRoZSBvbGQgeCBjb29yZGluYXRlIGFuZCB0aGUgbmV3IHggY29vcmRpbmF0ZSBpcyB0aGUgb2xkIHlcbiAgICAgKiBjb29yZGluYXRlIG11bHRpcGxpZWQgYnkgLTFcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gcGVycGVuZGljdWxhciBwb2ludFxuICAgICAqL1xuICAgIHBlcnA6ICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9wZXJwKCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB2ZXJzaW9uIG9mIHRoaXMgcG9pbnQgd2l0aCB0aGUgeCAmIHkgY29vcmRpbmF0ZXNcbiAgICAgKiByb3VuZGVkIHRvIGludGVnZXJzLlxuICAgICAqIEByZXR1cm4ge1BvaW50fSByb3VuZGVkIHBvaW50XG4gICAgICovXG4gICAgcm91bmQ6ICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3JvdW5kKCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIG1hZ2l0dWRlIG9mIHRoaXMgcG9pbnQ6IHRoaXMgaXMgdGhlIEV1Y2xpZGVhblxuICAgICAqIGRpc3RhbmNlIGZyb20gdGhlIDAsIDAgY29vcmRpbmF0ZSB0byB0aGlzIHBvaW50J3MgeCBhbmQgeVxuICAgICAqIGNvb3JkaW5hdGVzLlxuICAgICAqIEByZXR1cm4ge051bWJlcn0gbWFnbml0dWRlXG4gICAgICovXG4gICAgbWFnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBKdWRnZSB3aGV0aGVyIHRoaXMgcG9pbnQgaXMgZXF1YWwgdG8gYW5vdGhlciBwb2ludCwgcmV0dXJuaW5nXG4gICAgICogdHJ1ZSBvciBmYWxzZS5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBvdGhlciB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB3aGV0aGVyIHRoZSBwb2ludHMgYXJlIGVxdWFsXG4gICAgICovXG4gICAgZXF1YWxzOiBmdW5jdGlvbihvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy54ID09PSBvdGhlci54ICYmXG4gICAgICAgICAgICAgICB0aGlzLnkgPT09IG90aGVyLnk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIHBvaW50IHRvIGFub3RoZXIgcG9pbnRcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge051bWJlcn0gZGlzdGFuY2VcbiAgICAgKi9cbiAgICBkaXN0OiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0U3FyKHApKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBmcm9tIHRoaXMgcG9pbnQgdG8gYW5vdGhlciBwb2ludCxcbiAgICAgKiB3aXRob3V0IHRoZSBzcXVhcmUgcm9vdCBzdGVwLiBVc2VmdWwgaWYgeW91J3JlIGNvbXBhcmluZ1xuICAgICAqIHJlbGF0aXZlIGRpc3RhbmNlcy5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge051bWJlcn0gZGlzdGFuY2VcbiAgICAgKi9cbiAgICBkaXN0U3FyOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHZhciBkeCA9IHAueCAtIHRoaXMueCxcbiAgICAgICAgICAgIGR5ID0gcC55IC0gdGhpcy55O1xuICAgICAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYW5nbGUgZnJvbSB0aGUgMCwgMCBjb29yZGluYXRlIHRvIHRoaXMgcG9pbnQsIGluIHJhZGlhbnNcbiAgICAgKiBjb29yZGluYXRlcy5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGFuZ2xlXG4gICAgICovXG4gICAgYW5nbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLnksIHRoaXMueCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYW5nbGUgZnJvbSB0aGlzIHBvaW50IHRvIGFub3RoZXIgcG9pbnQsIGluIHJhZGlhbnNcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBiIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge051bWJlcn0gYW5nbGVcbiAgICAgKi9cbiAgICBhbmdsZVRvOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMueSAtIGIueSwgdGhpcy54IC0gYi54KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBhbmdsZSBiZXR3ZWVuIHRoaXMgcG9pbnQgYW5kIGFub3RoZXIgcG9pbnQsIGluIHJhZGlhbnNcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBiIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge051bWJlcn0gYW5nbGVcbiAgICAgKi9cbiAgICBhbmdsZVdpdGg6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5nbGVXaXRoU2VwKGIueCwgYi55KTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAgKiBGaW5kIHRoZSBhbmdsZSBvZiB0aGUgdHdvIHZlY3RvcnMsIHNvbHZpbmcgdGhlIGZvcm11bGEgZm9yXG4gICAgICogdGhlIGNyb3NzIHByb2R1Y3QgYSB4IGIgPSB8YXx8YnxzaW4ozrgpIGZvciDOuC5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0geCB0aGUgeC1jb29yZGluYXRlXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHkgdGhlIHktY29vcmRpbmF0ZVxuICAgICAqIEByZXR1cm4ge051bWJlcn0gdGhlIGFuZ2xlIGluIHJhZGlhbnNcbiAgICAgKi9cbiAgICBhbmdsZVdpdGhTZXA6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIoXG4gICAgICAgICAgICB0aGlzLnggKiB5IC0gdGhpcy55ICogeCxcbiAgICAgICAgICAgIHRoaXMueCAqIHggKyB0aGlzLnkgKiB5KTtcbiAgICB9LFxuXG4gICAgX21hdE11bHQ6IGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgdmFyIHggPSBtWzBdICogdGhpcy54ICsgbVsxXSAqIHRoaXMueSxcbiAgICAgICAgICAgIHkgPSBtWzJdICogdGhpcy54ICsgbVszXSAqIHRoaXMueTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9hZGQ6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdGhpcy54ICs9IHAueDtcbiAgICAgICAgdGhpcy55ICs9IHAueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9zdWI6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdGhpcy54IC09IHAueDtcbiAgICAgICAgdGhpcy55IC09IHAueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9tdWx0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHRoaXMueCAqPSBrO1xuICAgICAgICB0aGlzLnkgKj0gaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9kaXY6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgdGhpcy54IC89IGs7XG4gICAgICAgIHRoaXMueSAvPSBrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX211bHRCeVBvaW50OiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHRoaXMueCAqPSBwLng7XG4gICAgICAgIHRoaXMueSAqPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfZGl2QnlQb2ludDogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggLz0gcC54O1xuICAgICAgICB0aGlzLnkgLz0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3VuaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9kaXYodGhpcy5tYWcoKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcGVycDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB5ID0gdGhpcy55O1xuICAgICAgICB0aGlzLnkgPSB0aGlzLng7XG4gICAgICAgIHRoaXMueCA9IC15O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3JvdGF0ZTogZnVuY3Rpb24oYW5nbGUpIHtcbiAgICAgICAgdmFyIGNvcyA9IE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgICAgIHNpbiA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgIHggPSBjb3MgKiB0aGlzLnggLSBzaW4gKiB0aGlzLnksXG4gICAgICAgICAgICB5ID0gc2luICogdGhpcy54ICsgY29zICogdGhpcy55O1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3JvdGF0ZUFyb3VuZDogZnVuY3Rpb24oYW5nbGUsIHApIHtcbiAgICAgICAgdmFyIGNvcyA9IE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgICAgIHNpbiA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgIHggPSBwLnggKyBjb3MgKiAodGhpcy54IC0gcC54KSAtIHNpbiAqICh0aGlzLnkgLSBwLnkpLFxuICAgICAgICAgICAgeSA9IHAueSArIHNpbiAqICh0aGlzLnggLSBwLngpICsgY29zICogKHRoaXMueSAtIHAueSk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcm91bmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnggPSBNYXRoLnJvdW5kKHRoaXMueCk7XG4gICAgICAgIHRoaXMueSA9IE1hdGgucm91bmQodGhpcy55KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufTtcblxuLyoqXG4gKiBDb25zdHJ1Y3QgYSBwb2ludCBmcm9tIGFuIGFycmF5IGlmIG5lY2Vzc2FyeSwgb3RoZXJ3aXNlIGlmIHRoZSBpbnB1dFxuICogaXMgYWxyZWFkeSBhIFBvaW50LCBvciBhbiB1bmtub3duIHR5cGUsIHJldHVybiBpdCB1bmNoYW5nZWRcbiAqIEBwYXJhbSB7QXJyYXk8TnVtYmVyPnxQb2ludHwqfSBhIGFueSBraW5kIG9mIGlucHV0IHZhbHVlXG4gKiBAcmV0dXJuIHtQb2ludH0gY29uc3RydWN0ZWQgcG9pbnQsIG9yIHBhc3NlZC10aHJvdWdoIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqIC8vIHRoaXNcbiAqIHZhciBwb2ludCA9IFBvaW50LmNvbnZlcnQoWzAsIDFdKTtcbiAqIC8vIGlzIGVxdWl2YWxlbnQgdG9cbiAqIHZhciBwb2ludCA9IG5ldyBQb2ludCgwLCAxKTtcbiAqL1xuUG9pbnQuY29udmVydCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgaWYgKGEgaW5zdGFuY2VvZiBQb2ludCkge1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludChhWzBdLCBhWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGE7XG59O1xuIiwiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcblx0dHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuXHR0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuXHQoZ2xvYmFsLlNoZWxmUGFjayA9IGZhY3RvcnkoKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoKSB7XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IFNoZWxmUGFjayBiaW4gYWxsb2NhdG9yLlxuICpcbiAqIFVzZXMgdGhlIFNoZWxmIEJlc3QgSGVpZ2h0IEZpdCBhbGdvcml0aG0gZnJvbVxuICogaHR0cDovL2NsYi5kZW1vbi5maS9maWxlcy9SZWN0YW5nbGVCaW5QYWNrLnBkZlxuICpcbiAqIEBjbGFzcyAgU2hlbGZQYWNrXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICBbdz02NF0gIEluaXRpYWwgd2lkdGggb2YgdGhlIHNwcml0ZVxuICogQHBhcmFtICB7bnVtYmVyfSAgW2g9NjRdICBJbml0aWFsIHdpZHRoIG9mIHRoZSBzcHJpdGVcbiAqIEBwYXJhbSAge09iamVjdH0gIFtvcHRpb25zXVxuICogQHBhcmFtICB7Ym9vbGVhbn0gW29wdGlvbnMuYXV0b1Jlc2l6ZT1mYWxzZV0gIElmIGB0cnVlYCwgdGhlIHNwcml0ZSB3aWxsIGF1dG9tYXRpY2FsbHkgZ3Jvd1xuICogQGV4YW1wbGVcbiAqIHZhciBzcHJpdGUgPSBuZXcgU2hlbGZQYWNrKDY0LCA2NCwgeyBhdXRvUmVzaXplOiBmYWxzZSB9KTtcbiAqL1xuZnVuY3Rpb24gU2hlbGZQYWNrJDEodywgaCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHRoaXMudyA9IHcgfHwgNjQ7XG4gICAgdGhpcy5oID0gaCB8fCA2NDtcbiAgICB0aGlzLmF1dG9SZXNpemUgPSAhIW9wdGlvbnMuYXV0b1Jlc2l6ZTtcbiAgICB0aGlzLnNoZWx2ZXMgPSBbXTtcbiAgICB0aGlzLmZyZWViaW5zID0gW107XG4gICAgdGhpcy5zdGF0cyA9IHt9O1xuICAgIHRoaXMuYmlucyA9IHt9O1xuICAgIHRoaXMubWF4SWQgPSAwO1xufVxuXG5cbi8qKlxuICogQmF0Y2ggcGFjayBtdWx0aXBsZSBiaW5zIGludG8gdGhlIHNwcml0ZS5cbiAqXG4gKiBAcGFyYW0gICB7T2JqZWN0W119IGJpbnMgICAgICAgQXJyYXkgb2YgcmVxdWVzdGVkIGJpbnMgLSBlYWNoIG9iamVjdCBzaG91bGQgaGF2ZSBgd2lkdGhgLCBgaGVpZ2h0YCAob3IgYHdgLCBgaGApIHByb3BlcnRpZXNcbiAqIEBwYXJhbSAgIHtudW1iZXJ9ICAgYmluc1tdLncgICBSZXF1ZXN0ZWQgYmluIHdpZHRoXG4gKiBAcGFyYW0gICB7bnVtYmVyfSAgIGJpbnNbXS5oICAgUmVxdWVzdGVkIGJpbiBoZWlnaHRcbiAqIEBwYXJhbSAgIHtPYmplY3R9ICAgW29wdGlvbnNdXG4gKiBAcGFyYW0gICB7Ym9vbGVhbn0gIFtvcHRpb25zLmluUGxhY2U9ZmFsc2VdIElmIGB0cnVlYCwgdGhlIHN1cHBsaWVkIGJpbiBvYmplY3RzIHdpbGwgYmUgdXBkYXRlZCBpbnBsYWNlIHdpdGggYHhgIGFuZCBgeWAgcHJvcGVydGllc1xuICogQHJldHVybnMge0JpbltdfSAgICBBcnJheSBvZiBhbGxvY2F0ZWQgQmlucyAtIGVhY2ggQmluIGlzIGFuIG9iamVjdCB3aXRoIGBpZGAsIGB4YCwgYHlgLCBgd2AsIGBoYCBwcm9wZXJ0aWVzXG4gKiBAZXhhbXBsZVxuICogdmFyIGJpbnMgPSBbXG4gKiAgICAgeyBpZDogMSwgdzogMTIsIGg6IDEyIH0sXG4gKiAgICAgeyBpZDogMiwgdzogMTIsIGg6IDE2IH0sXG4gKiAgICAgeyBpZDogMywgdzogMTIsIGg6IDI0IH1cbiAqIF07XG4gKiB2YXIgcmVzdWx0cyA9IHNwcml0ZS5wYWNrKGJpbnMsIHsgaW5QbGFjZTogZmFsc2UgfSk7XG4gKi9cblNoZWxmUGFjayQxLnByb3RvdHlwZS5wYWNrID0gZnVuY3Rpb24oYmlucywgb3B0aW9ucykge1xuICAgIGJpbnMgPSBbXS5jb25jYXQoYmlucyk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICB2YXIgcmVzdWx0cyA9IFtdLFxuICAgICAgICB3LCBoLCBpZCwgYWxsb2NhdGlvbjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmlucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB3ICA9IGJpbnNbaV0udyB8fCBiaW5zW2ldLndpZHRoO1xuICAgICAgICBoICA9IGJpbnNbaV0uaCB8fCBiaW5zW2ldLmhlaWdodDtcbiAgICAgICAgaWQgPSBiaW5zW2ldLmlkO1xuXG4gICAgICAgIGlmICh3ICYmIGgpIHtcbiAgICAgICAgICAgIGFsbG9jYXRpb24gPSB0aGlzLnBhY2tPbmUodywgaCwgaWQpO1xuICAgICAgICAgICAgaWYgKCFhbGxvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pblBsYWNlKSB7XG4gICAgICAgICAgICAgICAgYmluc1tpXS54ICA9IGFsbG9jYXRpb24ueDtcbiAgICAgICAgICAgICAgICBiaW5zW2ldLnkgID0gYWxsb2NhdGlvbi55O1xuICAgICAgICAgICAgICAgIGJpbnNbaV0uaWQgPSBhbGxvY2F0aW9uLmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKGFsbG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zaHJpbmsoKTtcblxuICAgIHJldHVybiByZXN1bHRzO1xufTtcblxuXG4vKipcbiAqIFBhY2sgYSBzaW5nbGUgYmluIGludG8gdGhlIHNwcml0ZS5cbiAqXG4gKiBFYWNoIGJpbiB3aWxsIGhhdmUgYSB1bmlxdWUgaWRlbnRpdGlmZXIuXG4gKiBJZiBubyBpZGVudGlmaWVyIGlzIHN1cHBsaWVkIGluIHRoZSBgaWRgIHBhcmFtZXRlciwgb25lIHdpbGwgYmUgY3JlYXRlZC5cbiAqIE5vdGU6IFRoZSBzdXBwbGllZCBgaWRgIGlzIHVzZWQgYXMgYW4gb2JqZWN0IGluZGV4LCBzbyBudW1lcmljIHZhbHVlcyBhcmUgZmFzdGVzdCFcbiAqXG4gKiBCaW5zIGFyZSBhdXRvbWF0aWNhbGx5IHJlZmNvdW50ZWQgKGkuZS4gYSBuZXdseSBwYWNrZWQgQmluIHdpbGwgaGF2ZSBhIHJlZmNvdW50IG9mIDEpLlxuICogV2hlbiBhIGJpbiBpcyBubyBsb25nZXIgbmVlZGVkLCB1c2UgdGhlIGBTaGVsZlBhY2sudW5yZWZgIGZ1bmN0aW9uIHRvIG1hcmsgaXRcbiAqICAgYXMgdW51c2VkLiAgV2hlbiBhIEJpbidzIHJlZmNvdW50IGRlY3JlbWVudHMgdG8gMCwgdGhlIEJpbiB3aWxsIGJlIG1hcmtlZFxuICogICBhcyBmcmVlIGFuZCBpdHMgc3BhY2UgbWF5IGJlIHJldXNlZCBieSB0aGUgcGFja2luZyBjb2RlLlxuICpcbiAqIEBwYXJhbSAgICB7bnVtYmVyfSAgICAgICAgIHcgICAgICBXaWR0aCBvZiB0aGUgYmluIHRvIGFsbG9jYXRlXG4gKiBAcGFyYW0gICAge251bWJlcn0gICAgICAgICBoICAgICAgSGVpZ2h0IG9mIHRoZSBiaW4gdG8gYWxsb2NhdGVcbiAqIEBwYXJhbSAgICB7bnVtYmVyfHN0cmluZ30gIFtpZF0gICBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBiaW4sIChpZiB1bnN1cHBsaWVkLCBhc3N1bWUgaXQncyBhIG5ldyBiaW4gYW5kIGNyZWF0ZSBhbiBpZClcbiAqIEByZXR1cm5zICB7QmlufSAgICAgICAgICAgIEJpbiBvYmplY3Qgd2l0aCBgaWRgLCBgeGAsIGB5YCwgYHdgLCBgaGAgcHJvcGVydGllcywgb3IgYG51bGxgIGlmIGFsbG9jYXRpb24gZmFpbGVkXG4gKiBAZXhhbXBsZVxuICogdmFyIHJlc3VsdHMgPSBzcHJpdGUucGFja09uZSgxMiwgMTYsICdhJyk7XG4gKi9cblNoZWxmUGFjayQxLnByb3RvdHlwZS5wYWNrT25lID0gZnVuY3Rpb24odywgaCwgaWQpIHtcbiAgICB2YXIgYmVzdCA9IHsgZnJlZWJpbjogLTEsIHNoZWxmOiAtMSwgd2FzdGU6IEluZmluaXR5IH0sXG4gICAgICAgIHkgPSAwLFxuICAgICAgICBiaW4sIHNoZWxmLCB3YXN0ZSwgaTtcblxuICAgIC8vIGlmIGlkIHdhcyBzdXBwbGllZCwgYXR0ZW1wdCBhIGxvb2t1cC4uXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGlkID09PSAnbnVtYmVyJykge1xuICAgICAgICBiaW4gPSB0aGlzLmdldEJpbihpZCk7XG4gICAgICAgIGlmIChiaW4pIHsgICAgICAgICAgICAgIC8vIHdlIHBhY2tlZCB0aGlzIGJpbiBhbHJlYWR5XG4gICAgICAgICAgICB0aGlzLnJlZihiaW4pO1xuICAgICAgICAgICAgcmV0dXJuIGJpbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGlkID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5tYXhJZCA9IE1hdGgubWF4KGlkLCB0aGlzLm1heElkKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlkID0gKyt0aGlzLm1heElkO1xuICAgIH1cblxuICAgIC8vIEZpcnN0IHRyeSB0byByZXVzZSBhIGZyZWUgYmluLi5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5mcmVlYmlucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBiaW4gPSB0aGlzLmZyZWViaW5zW2ldO1xuXG4gICAgICAgIC8vIGV4YWN0bHkgdGhlIHJpZ2h0IGhlaWdodCBhbmQgd2lkdGgsIHVzZSBpdC4uXG4gICAgICAgIGlmIChoID09PSBiaW4ubWF4aCAmJiB3ID09PSBiaW4ubWF4dykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWxsb2NGcmVlYmluKGksIHcsIGgsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub3QgZW5vdWdoIGhlaWdodCBvciB3aWR0aCwgc2tpcCBpdC4uXG4gICAgICAgIGlmIChoID4gYmluLm1heGggfHwgdyA+IGJpbi5tYXh3KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBleHRyYSBoZWlnaHQgb3Igd2lkdGgsIG1pbmltaXplIHdhc3RlZCBhcmVhLi5cbiAgICAgICAgaWYgKGggPD0gYmluLm1heGggJiYgdyA8PSBiaW4ubWF4dykge1xuICAgICAgICAgICAgd2FzdGUgPSAoYmluLm1heHcgKiBiaW4ubWF4aCkgLSAodyAqIGgpO1xuICAgICAgICAgICAgaWYgKHdhc3RlIDwgYmVzdC53YXN0ZSkge1xuICAgICAgICAgICAgICAgIGJlc3Qud2FzdGUgPSB3YXN0ZTtcbiAgICAgICAgICAgICAgICBiZXN0LmZyZWViaW4gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTmV4dCBmaW5kIHRoZSBiZXN0IHNoZWxmLi5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zaGVsdmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNoZWxmID0gdGhpcy5zaGVsdmVzW2ldO1xuICAgICAgICB5ICs9IHNoZWxmLmg7XG5cbiAgICAgICAgLy8gbm90IGVub3VnaCB3aWR0aCBvbiB0aGlzIHNoZWxmLCBza2lwIGl0Li5cbiAgICAgICAgaWYgKHcgPiBzaGVsZi5mcmVlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBleGFjdGx5IHRoZSByaWdodCBoZWlnaHQsIHBhY2sgaXQuLlxuICAgICAgICBpZiAoaCA9PT0gc2hlbGYuaCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWxsb2NTaGVsZihpLCB3LCBoLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm90IGVub3VnaCBoZWlnaHQsIHNraXAgaXQuLlxuICAgICAgICBpZiAoaCA+IHNoZWxmLmgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGV4dHJhIGhlaWdodCwgbWluaW1pemUgd2FzdGVkIGFyZWEuLlxuICAgICAgICBpZiAoaCA8IHNoZWxmLmgpIHtcbiAgICAgICAgICAgIHdhc3RlID0gKHNoZWxmLmggLSBoKSAqIHc7XG4gICAgICAgICAgICBpZiAod2FzdGUgPCBiZXN0Lndhc3RlKSB7XG4gICAgICAgICAgICAgICAgYmVzdC5mcmVlYmluID0gLTE7XG4gICAgICAgICAgICAgICAgYmVzdC53YXN0ZSA9IHdhc3RlO1xuICAgICAgICAgICAgICAgIGJlc3Quc2hlbGYgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGJlc3QuZnJlZWJpbiAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWxsb2NGcmVlYmluKGJlc3QuZnJlZWJpbiwgdywgaCwgaWQpO1xuICAgIH1cblxuICAgIGlmIChiZXN0LnNoZWxmICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hbGxvY1NoZWxmKGJlc3Quc2hlbGYsIHcsIGgsIGlkKTtcbiAgICB9XG5cbiAgICAvLyBObyBmcmVlIGJpbnMgb3Igc2hlbHZlcy4uIGFkZCBzaGVsZi4uXG4gICAgaWYgKGggPD0gKHRoaXMuaCAtIHkpICYmIHcgPD0gdGhpcy53KSB7XG4gICAgICAgIHNoZWxmID0gbmV3IFNoZWxmKHksIHRoaXMudywgaCk7XG4gICAgICAgIHJldHVybiB0aGlzLmFsbG9jU2hlbGYodGhpcy5zaGVsdmVzLnB1c2goc2hlbGYpIC0gMSwgdywgaCwgaWQpO1xuICAgIH1cblxuICAgIC8vIE5vIHJvb20gZm9yIG1vcmUgc2hlbHZlcy4uXG4gICAgLy8gSWYgYGF1dG9SZXNpemVgIG9wdGlvbiBpcyBzZXQsIGdyb3cgdGhlIHNwcml0ZSBhcyBmb2xsb3dzOlxuICAgIC8vICAqIGRvdWJsZSB3aGljaGV2ZXIgc3ByaXRlIGRpbWVuc2lvbiBpcyBzbWFsbGVyIChgdzFgIG9yIGBoMWApXG4gICAgLy8gICogaWYgc3ByaXRlIGRpbWVuc2lvbnMgYXJlIGVxdWFsLCBncm93IHdpZHRoIGJlZm9yZSBoZWlnaHRcbiAgICAvLyAgKiBhY2NvbW9kYXRlIHZlcnkgbGFyZ2UgYmluIHJlcXVlc3RzIChiaWcgYHdgIG9yIGBoYClcbiAgICBpZiAodGhpcy5hdXRvUmVzaXplKSB7XG4gICAgICAgIHZhciBoMSwgaDIsIHcxLCB3MjtcblxuICAgICAgICBoMSA9IGgyID0gdGhpcy5oO1xuICAgICAgICB3MSA9IHcyID0gdGhpcy53O1xuXG4gICAgICAgIGlmICh3MSA8PSBoMSB8fCB3ID4gdzEpIHsgICAvLyBncm93IHdpZHRoLi5cbiAgICAgICAgICAgIHcyID0gTWF0aC5tYXgodywgdzEpICogMjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaDEgPCB3MSB8fCBoID4gaDEpIHsgICAgLy8gZ3JvdyBoZWlnaHQuLlxuICAgICAgICAgICAgaDIgPSBNYXRoLm1heChoLCBoMSkgKiAyO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNpemUodzIsIGgyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFja09uZSh3LCBoLCBpZCk7ICAvLyByZXRyeVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufTtcblxuXG4vKipcbiAqIENhbGxlZCBieSBwYWNrT25lKCkgdG8gYWxsb2NhdGUgYSBiaW4gYnkgcmV1c2luZyBhbiBleGlzdGluZyBmcmVlYmluXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAgICB7bnVtYmVyfSAgICAgICAgIGluZGV4ICBJbmRleCBpbnRvIHRoZSBgdGhpcy5mcmVlYmluc2AgYXJyYXlcbiAqIEBwYXJhbSAgICB7bnVtYmVyfSAgICAgICAgIHcgICAgICBXaWR0aCBvZiB0aGUgYmluIHRvIGFsbG9jYXRlXG4gKiBAcGFyYW0gICAge251bWJlcn0gICAgICAgICBoICAgICAgSGVpZ2h0IG9mIHRoZSBiaW4gdG8gYWxsb2NhdGVcbiAqIEBwYXJhbSAgICB7bnVtYmVyfHN0cmluZ30gIGlkICAgICBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBiaW5cbiAqIEByZXR1cm5zICB7QmlufSAgICAgICAgICAgIEJpbiBvYmplY3Qgd2l0aCBgaWRgLCBgeGAsIGB5YCwgYHdgLCBgaGAgcHJvcGVydGllc1xuICogQGV4YW1wbGVcbiAqIHZhciBiaW4gPSBzcHJpdGUuYWxsb2NGcmVlYmluKDAsIDEyLCAxNiwgJ2EnKTtcbiAqL1xuU2hlbGZQYWNrJDEucHJvdG90eXBlLmFsbG9jRnJlZWJpbiA9IGZ1bmN0aW9uIChpbmRleCwgdywgaCwgaWQpIHtcbiAgICB2YXIgYmluID0gdGhpcy5mcmVlYmlucy5zcGxpY2UoaW5kZXgsIDEpWzBdO1xuICAgIGJpbi5pZCA9IGlkO1xuICAgIGJpbi53ID0gdztcbiAgICBiaW4uaCA9IGg7XG4gICAgYmluLnJlZmNvdW50ID0gMDtcbiAgICB0aGlzLmJpbnNbaWRdID0gYmluO1xuICAgIHRoaXMucmVmKGJpbik7XG4gICAgcmV0dXJuIGJpbjtcbn07XG5cblxuLyoqXG4gKiBDYWxsZWQgYnkgYHBhY2tPbmUoKSB0byBhbGxvY2F0ZSBiaW4gb24gYW4gZXhpc3Rpbmcgc2hlbGZcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICAgIHtudW1iZXJ9ICAgICAgICAgaW5kZXggIEluZGV4IGludG8gdGhlIGB0aGlzLnNoZWx2ZXNgIGFycmF5XG4gKiBAcGFyYW0gICAge251bWJlcn0gICAgICAgICB3ICAgICAgV2lkdGggb2YgdGhlIGJpbiB0byBhbGxvY2F0ZVxuICogQHBhcmFtICAgIHtudW1iZXJ9ICAgICAgICAgaCAgICAgIEhlaWdodCBvZiB0aGUgYmluIHRvIGFsbG9jYXRlXG4gKiBAcGFyYW0gICAge251bWJlcnxzdHJpbmd9ICBpZCAgICAgVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgYmluXG4gKiBAcmV0dXJucyAge0Jpbn0gICAgICAgICAgICBCaW4gb2JqZWN0IHdpdGggYGlkYCwgYHhgLCBgeWAsIGB3YCwgYGhgIHByb3BlcnRpZXNcbiAqIEBleGFtcGxlXG4gKiB2YXIgcmVzdWx0cyA9IHNwcml0ZS5hbGxvY1NoZWxmKDAsIDEyLCAxNiwgJ2EnKTtcbiAqL1xuU2hlbGZQYWNrJDEucHJvdG90eXBlLmFsbG9jU2hlbGYgPSBmdW5jdGlvbihpbmRleCwgdywgaCwgaWQpIHtcbiAgICB2YXIgc2hlbGYgPSB0aGlzLnNoZWx2ZXNbaW5kZXhdO1xuICAgIHZhciBiaW4gPSBzaGVsZi5hbGxvYyh3LCBoLCBpZCk7XG4gICAgdGhpcy5iaW5zW2lkXSA9IGJpbjtcbiAgICB0aGlzLnJlZihiaW4pO1xuICAgIHJldHVybiBiaW47XG59O1xuXG5cbi8qKlxuICogU2hyaW5rIHRoZSB3aWR0aC9oZWlnaHQgb2YgdGhlIHNwcml0ZSB0byB0aGUgYmFyZSBtaW5pbXVtLlxuICogU2luY2Ugc2hlbGYtcGFjayBkb3VibGVzIGZpcnN0IHdpZHRoLCB0aGVuIGhlaWdodCB3aGVuIHJ1bm5pbmcgb3V0IG9mIHNoZWxmIHNwYWNlXG4gKiB0aGlzIGNhbiByZXN1bHQgaW4gZmFpcmx5IGxhcmdlIHVudXNlZCBzcGFjZSBib3RoIGluIHdpZHRoIGFuZCBoZWlnaHQgaWYgdGhhdCBoYXBwZW5zXG4gKiB0b3dhcmRzIHRoZSBlbmQgb2YgYmluIHBhY2tpbmcuXG4gKi9cblNoZWxmUGFjayQxLnByb3RvdHlwZS5zaHJpbmsgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5zaGVsdmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIHcyID0gMDtcbiAgICAgICAgdmFyIGgyID0gMDtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuc2hlbHZlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHNoZWxmID0gdGhpcy5zaGVsdmVzW2pdO1xuICAgICAgICAgICAgaDIgKz0gc2hlbGYuaDtcbiAgICAgICAgICAgIHcyID0gTWF0aC5tYXgoc2hlbGYudyAtIHNoZWxmLmZyZWUsIHcyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzaXplKHcyLCBoMik7XG4gICAgfVxufTtcblxuXG4vKipcbiAqIFJldHVybiBhIHBhY2tlZCBiaW4gZ2l2ZW4gaXRzIGlkLCBvciB1bmRlZmluZWQgaWYgdGhlIGlkIGlzIG5vdCBmb3VuZFxuICpcbiAqIEBwYXJhbSAgICB7bnVtYmVyfHN0cmluZ30gIGlkICBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBiaW4sXG4gKiBAcmV0dXJucyAge0Jpbn0gICAgICAgICAgICBUaGUgcmVxdWVzdGVkIGJpbiwgb3IgdW5kZWZpbmVkIGlmIG5vdCB5ZXQgcGFja2VkXG4gKiBAZXhhbXBsZVxuICogdmFyIGIgPSBzcHJpdGUuZ2V0QmluKCdhJyk7XG4gKi9cblNoZWxmUGFjayQxLnByb3RvdHlwZS5nZXRCaW4gPSBmdW5jdGlvbihpZCkge1xuICAgIHJldHVybiB0aGlzLmJpbnNbaWRdO1xufTtcblxuXG4vKipcbiAqIEluY3JlbWVudCB0aGUgcmVmIGNvdW50IG9mIGEgYmluIGFuZCB1cGRhdGUgc3RhdGlzdGljcy5cbiAqXG4gKiBAcGFyYW0gICAge0Jpbn0gICAgIGJpbiAgQmluIGluc3RhbmNlXG4gKiBAcmV0dXJucyAge251bWJlcn0gIE5ldyByZWZjb3VudCBvZiB0aGUgYmluXG4gKiBAZXhhbXBsZVxuICogdmFyIGJpbiA9IHNwcml0ZS5nZXRCaW4oJ2EnKTtcbiAqIHNwcml0ZS5yZWYoYmluKTtcbiAqL1xuU2hlbGZQYWNrJDEucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKGJpbikge1xuICAgIGlmICgrK2Jpbi5yZWZjb3VudCA9PT0gMSkgeyAgIC8vIGEgbmV3IEJpbi4uIHJlY29yZCBoZWlnaHQgaW4gc3RhdHMgaGlzdG9yZ3JhbS4uXG4gICAgICAgIHZhciBoID0gYmluLmg7XG4gICAgICAgIHRoaXMuc3RhdHNbaF0gPSAodGhpcy5zdGF0c1toXSB8IDApICsgMTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmluLnJlZmNvdW50O1xufTtcblxuXG4vKipcbiAqIERlY3JlbWVudCB0aGUgcmVmIGNvdW50IG9mIGEgYmluIGFuZCB1cGRhdGUgc3RhdGlzdGljcy5cbiAqIFRoZSBiaW4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IG1hcmtlZCBhcyBmcmVlIHNwYWNlIG9uY2UgdGhlIHJlZmNvdW50IHJlYWNoZXMgMC5cbiAqXG4gKiBAcGFyYW0gICAge0Jpbn0gICAgIGJpbiAgQmluIGluc3RhbmNlXG4gKiBAcmV0dXJucyAge251bWJlcn0gIE5ldyByZWZjb3VudCBvZiB0aGUgYmluXG4gKiBAZXhhbXBsZVxuICogdmFyIGJpbiA9IHNwcml0ZS5nZXRCaW4oJ2EnKTtcbiAqIHNwcml0ZS51bnJlZihiaW4pO1xuICovXG5TaGVsZlBhY2skMS5wcm90b3R5cGUudW5yZWYgPSBmdW5jdGlvbihiaW4pIHtcbiAgICBpZiAoYmluLnJlZmNvdW50ID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGlmICgtLWJpbi5yZWZjb3VudCA9PT0gMCkge1xuICAgICAgICB0aGlzLnN0YXRzW2Jpbi5oXS0tO1xuICAgICAgICBkZWxldGUgdGhpcy5iaW5zW2Jpbi5pZF07XG4gICAgICAgIHRoaXMuZnJlZWJpbnMucHVzaChiaW4pO1xuICAgIH1cblxuICAgIHJldHVybiBiaW4ucmVmY291bnQ7XG59O1xuXG5cbi8qKlxuICogQ2xlYXIgdGhlIHNwcml0ZS4gIFJlc2V0cyBldmVyeXRoaW5nIGFuZCByZXNldHMgc3RhdGlzdGljcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogc3ByaXRlLmNsZWFyKCk7XG4gKi9cblNoZWxmUGFjayQxLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc2hlbHZlcyA9IFtdO1xuICAgIHRoaXMuZnJlZWJpbnMgPSBbXTtcbiAgICB0aGlzLnN0YXRzID0ge307XG4gICAgdGhpcy5iaW5zID0ge307XG4gICAgdGhpcy5tYXhJZCA9IDA7XG59O1xuXG5cbi8qKlxuICogUmVzaXplIHRoZSBzcHJpdGUuXG4gKlxuICogQHBhcmFtICAge251bWJlcn0gIHcgIFJlcXVlc3RlZCBuZXcgc3ByaXRlIHdpZHRoXG4gKiBAcGFyYW0gICB7bnVtYmVyfSAgaCAgUmVxdWVzdGVkIG5ldyBzcHJpdGUgaGVpZ2h0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHJlc2l6ZSBzdWNjZWVkZWQsIGBmYWxzZWAgaWYgZmFpbGVkXG4gKiBAZXhhbXBsZVxuICogc3ByaXRlLnJlc2l6ZSgyNTYsIDI1Nik7XG4gKi9cblNoZWxmUGFjayQxLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbih3LCBoKSB7XG4gICAgdGhpcy53ID0gdztcbiAgICB0aGlzLmggPSBoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zaGVsdmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuc2hlbHZlc1tpXS5yZXNpemUodyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcblxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBTaGVsZi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNsYXNzICBTaGVsZlxuICogQHBhcmFtICB7bnVtYmVyfSAgeSAgIFRvcCBjb29yZGluYXRlIG9mIHRoZSBuZXcgc2hlbGZcbiAqIEBwYXJhbSAge251bWJlcn0gIHcgICBXaWR0aCBvZiB0aGUgbmV3IHNoZWxmXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICBoICAgSGVpZ2h0IG9mIHRoZSBuZXcgc2hlbGZcbiAqIEBleGFtcGxlXG4gKiB2YXIgc2hlbGYgPSBuZXcgU2hlbGYoNjQsIDUxMiwgMjQpO1xuICovXG5mdW5jdGlvbiBTaGVsZih5LCB3LCBoKSB7XG4gICAgdGhpcy54ID0gMDtcbiAgICB0aGlzLnkgPSB5O1xuICAgIHRoaXMudyA9IHRoaXMuZnJlZSA9IHc7XG4gICAgdGhpcy5oID0gaDtcbn1cblxuXG4vKipcbiAqIEFsbG9jYXRlIGEgc2luZ2xlIGJpbiBpbnRvIHRoZSBzaGVsZi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICAge251bWJlcn0gICAgICAgICB3ICAgV2lkdGggb2YgdGhlIGJpbiB0byBhbGxvY2F0ZVxuICogQHBhcmFtICAge251bWJlcn0gICAgICAgICBoICAgSGVpZ2h0IG9mIHRoZSBiaW4gdG8gYWxsb2NhdGVcbiAqIEBwYXJhbSAgIHtudW1iZXJ8c3RyaW5nfSAgaWQgIFVuaXF1ZSBpZCBvZiB0aGUgYmluIHRvIGFsbG9jYXRlXG4gKiBAcmV0dXJucyB7QmlufSAgICAgICAgICAgIEJpbiBvYmplY3Qgd2l0aCBgaWRgLCBgeGAsIGB5YCwgYHdgLCBgaGAgcHJvcGVydGllcywgb3IgYG51bGxgIGlmIGFsbG9jYXRpb24gZmFpbGVkXG4gKiBAZXhhbXBsZVxuICogc2hlbGYuYWxsb2MoMTIsIDE2LCAnYScpO1xuICovXG5TaGVsZi5wcm90b3R5cGUuYWxsb2MgPSBmdW5jdGlvbih3LCBoLCBpZCkge1xuICAgIGlmICh3ID4gdGhpcy5mcmVlIHx8IGggPiB0aGlzLmgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciB4ID0gdGhpcy54O1xuICAgIHRoaXMueCArPSB3O1xuICAgIHRoaXMuZnJlZSAtPSB3O1xuICAgIHJldHVybiBuZXcgQmluKGlkLCB4LCB0aGlzLnksIHcsIGgsIHcsIHRoaXMuaCk7XG59O1xuXG5cbi8qKlxuICogUmVzaXplIHRoZSBzaGVsZi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICAge251bWJlcn0gIHcgIFJlcXVlc3RlZCBuZXcgd2lkdGggb2YgdGhlIHNoZWxmXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gICAgdHJ1ZVxuICogQGV4YW1wbGVcbiAqIHNoZWxmLnJlc2l6ZSg1MTIpO1xuICovXG5TaGVsZi5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24odykge1xuICAgIHRoaXMuZnJlZSArPSAodyAtIHRoaXMudyk7XG4gICAgdGhpcy53ID0gdztcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgQmluIG9iamVjdC5cbiAqXG4gKiBAY2xhc3MgIEJpblxuICogQHBhcmFtICB7bnVtYmVyfHN0cmluZ30gIGlkICAgICAgVW5pcXVlIGlkIG9mIHRoZSBiaW5cbiAqIEBwYXJhbSAge251bWJlcn0gICAgICAgICB4ICAgICAgIExlZnQgY29vcmRpbmF0ZSBvZiB0aGUgYmluXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgICAgICAgeSAgICAgICBUb3AgY29vcmRpbmF0ZSBvZiB0aGUgYmluXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgICAgICAgdyAgICAgICBXaWR0aCBvZiB0aGUgYmluXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgICAgICAgaCAgICAgICBIZWlnaHQgb2YgdGhlIGJpblxuICogQHBhcmFtICB7bnVtYmVyfSAgICAgICAgIFttYXh3XSAgTWF4IHdpZHRoIG9mIHRoZSBiaW4gKGRlZmF1bHRzIHRvIGB3YCBpZiBub3QgcHJvdmlkZWQpXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgICAgICAgW21heGhdICBNYXggaGVpZ2h0IG9mIHRoZSBiaW4gKGRlZmF1bHRzIHRvIGBoYCBpZiBub3QgcHJvdmlkZWQpXG4gKiBAZXhhbXBsZVxuICogdmFyIGJpbiA9IG5ldyBCaW4oJ2EnLCAwLCAwLCAxMiwgMTYpO1xuICovXG5mdW5jdGlvbiBCaW4oaWQsIHgsIHksIHcsIGgsIG1heHcsIG1heGgpIHtcbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy54ICA9IHg7XG4gICAgdGhpcy55ICA9IHk7XG4gICAgdGhpcy53ICA9IHc7XG4gICAgdGhpcy5oICA9IGg7XG4gICAgdGhpcy5tYXh3ID0gbWF4dyB8fCB3O1xuICAgIHRoaXMubWF4aCA9IG1heGggfHwgaDtcbiAgICB0aGlzLnJlZmNvdW50ID0gMDtcbn1cblxucmV0dXJuIFNoZWxmUGFjayQxO1xuXG59KSkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRpbnlTREY7XG5cbnZhciBJTkYgPSAxZTIwO1xuXG5mdW5jdGlvbiBUaW55U0RGKGZvbnRTaXplLCBidWZmZXIsIHJhZGl1cywgY3V0b2ZmLCBmb250RmFtaWx5LCBmb250V2VpZ2h0KSB7XG4gICAgdGhpcy5mb250U2l6ZSA9IGZvbnRTaXplIHx8IDI0O1xuICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyID09PSB1bmRlZmluZWQgPyAzIDogYnVmZmVyO1xuICAgIHRoaXMuY3V0b2ZmID0gY3V0b2ZmIHx8IDAuMjU7XG4gICAgdGhpcy5mb250RmFtaWx5ID0gZm9udEZhbWlseSB8fCAnc2Fucy1zZXJpZic7XG4gICAgdGhpcy5mb250V2VpZ2h0ID0gZm9udFdlaWdodCB8fCAnbm9ybWFsJztcbiAgICB0aGlzLnJhZGl1cyA9IHJhZGl1cyB8fCA4O1xuICAgIHZhciBzaXplID0gdGhpcy5zaXplID0gdGhpcy5mb250U2l6ZSArIHRoaXMuYnVmZmVyICogMjtcblxuICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmNhbnZhcy5oZWlnaHQgPSBzaXplO1xuXG4gICAgdGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIHRoaXMuY3R4LmZvbnQgPSB0aGlzLmZvbnRXZWlnaHQgKyAnICcgKyB0aGlzLmZvbnRTaXplICsgJ3B4ICcgKyB0aGlzLmZvbnRGYW1pbHk7XG4gICAgdGhpcy5jdHgudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XG4gICAgdGhpcy5jdHguZmlsbFN0eWxlID0gJ2JsYWNrJztcblxuICAgIC8vIHRlbXBvcmFyeSBhcnJheXMgZm9yIHRoZSBkaXN0YW5jZSB0cmFuc2Zvcm1cbiAgICB0aGlzLmdyaWRPdXRlciA9IG5ldyBGbG9hdDY0QXJyYXkoc2l6ZSAqIHNpemUpO1xuICAgIHRoaXMuZ3JpZElubmVyID0gbmV3IEZsb2F0NjRBcnJheShzaXplICogc2l6ZSk7XG4gICAgdGhpcy5mID0gbmV3IEZsb2F0NjRBcnJheShzaXplKTtcbiAgICB0aGlzLmQgPSBuZXcgRmxvYXQ2NEFycmF5KHNpemUpO1xuICAgIHRoaXMueiA9IG5ldyBGbG9hdDY0QXJyYXkoc2l6ZSArIDEpO1xuICAgIHRoaXMudiA9IG5ldyBJbnQxNkFycmF5KHNpemUpO1xuXG4gICAgLy8gaGFjayBhcm91bmQgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzM3ODUyXG4gICAgdGhpcy5taWRkbGUgPSBNYXRoLnJvdW5kKChzaXplIC8gMikgKiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdHZWNrby8nKSA+PSAwID8gMS4yIDogMSkpO1xufVxuXG5UaW55U0RGLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24gKGNoYXIpIHtcbiAgICB0aGlzLmN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5zaXplLCB0aGlzLnNpemUpO1xuICAgIHRoaXMuY3R4LmZpbGxUZXh0KGNoYXIsIHRoaXMuYnVmZmVyLCB0aGlzLm1pZGRsZSk7XG5cbiAgICB2YXIgaW1nRGF0YSA9IHRoaXMuY3R4LmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLnNpemUsIHRoaXMuc2l6ZSk7XG4gICAgdmFyIGFscGhhQ2hhbm5lbCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh0aGlzLnNpemUgKiB0aGlzLnNpemUpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNpemUgKiB0aGlzLnNpemU7IGkrKykge1xuICAgICAgICB2YXIgYSA9IGltZ0RhdGEuZGF0YVtpICogNCArIDNdIC8gMjU1OyAvLyBhbHBoYSB2YWx1ZVxuICAgICAgICB0aGlzLmdyaWRPdXRlcltpXSA9IGEgPT09IDEgPyAwIDogYSA9PT0gMCA/IElORiA6IE1hdGgucG93KE1hdGgubWF4KDAsIDAuNSAtIGEpLCAyKTtcbiAgICAgICAgdGhpcy5ncmlkSW5uZXJbaV0gPSBhID09PSAxID8gSU5GIDogYSA9PT0gMCA/IDAgOiBNYXRoLnBvdyhNYXRoLm1heCgwLCBhIC0gMC41KSwgMik7XG4gICAgfVxuXG4gICAgZWR0KHRoaXMuZ3JpZE91dGVyLCB0aGlzLnNpemUsIHRoaXMuc2l6ZSwgdGhpcy5mLCB0aGlzLmQsIHRoaXMudiwgdGhpcy56KTtcbiAgICBlZHQodGhpcy5ncmlkSW5uZXIsIHRoaXMuc2l6ZSwgdGhpcy5zaXplLCB0aGlzLmYsIHRoaXMuZCwgdGhpcy52LCB0aGlzLnopO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc2l6ZSAqIHRoaXMuc2l6ZTsgaSsrKSB7XG4gICAgICAgIHZhciBkID0gdGhpcy5ncmlkT3V0ZXJbaV0gLSB0aGlzLmdyaWRJbm5lcltpXTtcbiAgICAgICAgYWxwaGFDaGFubmVsW2ldID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKDI1NSAtIDI1NSAqIChkIC8gdGhpcy5yYWRpdXMgKyB0aGlzLmN1dG9mZikpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFscGhhQ2hhbm5lbDtcbn07XG5cbi8vIDJEIEV1Y2xpZGVhbiBkaXN0YW5jZSB0cmFuc2Zvcm0gYnkgRmVsemVuc3p3YWxiICYgSHV0dGVubG9jaGVyIGh0dHBzOi8vY3MuYnJvd24uZWR1L35wZmYvZHQvXG5mdW5jdGlvbiBlZHQoZGF0YSwgd2lkdGgsIGhlaWdodCwgZiwgZCwgdiwgeikge1xuICAgIGZvciAodmFyIHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICBmW3ldID0gZGF0YVt5ICogd2lkdGggKyB4XTtcbiAgICAgICAgfVxuICAgICAgICBlZHQxZChmLCBkLCB2LCB6LCBoZWlnaHQpO1xuICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgIGRhdGFbeSAqIHdpZHRoICsgeF0gPSBkW3ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgZlt4XSA9IGRhdGFbeSAqIHdpZHRoICsgeF07XG4gICAgICAgIH1cbiAgICAgICAgZWR0MWQoZiwgZCwgdiwgeiwgd2lkdGgpO1xuICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgZGF0YVt5ICogd2lkdGggKyB4XSA9IE1hdGguc3FydChkW3hdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gMUQgc3F1YXJlZCBkaXN0YW5jZSB0cmFuc2Zvcm1cbmZ1bmN0aW9uIGVkdDFkKGYsIGQsIHYsIHosIG4pIHtcbiAgICB2WzBdID0gMDtcbiAgICB6WzBdID0gLUlORjtcbiAgICB6WzFdID0gK0lORjtcblxuICAgIGZvciAodmFyIHEgPSAxLCBrID0gMDsgcSA8IG47IHErKykge1xuICAgICAgICB2YXIgcyA9ICgoZltxXSArIHEgKiBxKSAtIChmW3Zba11dICsgdltrXSAqIHZba10pKSAvICgyICogcSAtIDIgKiB2W2tdKTtcbiAgICAgICAgd2hpbGUgKHMgPD0geltrXSkge1xuICAgICAgICAgICAgay0tO1xuICAgICAgICAgICAgcyA9ICgoZltxXSArIHEgKiBxKSAtIChmW3Zba11dICsgdltrXSAqIHZba10pKSAvICgyICogcSAtIDIgKiB2W2tdKTtcbiAgICAgICAgfVxuICAgICAgICBrKys7XG4gICAgICAgIHZba10gPSBxO1xuICAgICAgICB6W2tdID0gcztcbiAgICAgICAgeltrICsgMV0gPSArSU5GO1xuICAgIH1cblxuICAgIGZvciAocSA9IDAsIGsgPSAwOyBxIDwgbjsgcSsrKSB7XG4gICAgICAgIHdoaWxlICh6W2sgKyAxXSA8IHEpIGsrKztcbiAgICAgICAgZFtxXSA9IChxIC0gdltrXSkgKiAocSAtIHZba10pICsgZlt2W2tdXTtcbiAgICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uc1xuICogYXJlIG1ldDpcbiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVJcbiAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SXG4gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCxcbiAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTyxcbiAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUlxuICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWVxuICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKlxuICogUG9ydGVkIGZyb20gV2Via2l0XG4gKiBodHRwOi8vc3ZuLndlYmtpdC5vcmcvcmVwb3NpdG9yeS93ZWJraXQvdHJ1bmsvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvVW5pdEJlemllci5oXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBVbml0QmV6aWVyO1xuXG5mdW5jdGlvbiBVbml0QmV6aWVyKHAxeCwgcDF5LCBwMngsIHAyeSkge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgcG9seW5vbWlhbCBjb2VmZmljaWVudHMsIGltcGxpY2l0IGZpcnN0IGFuZCBsYXN0IGNvbnRyb2wgcG9pbnRzIGFyZSAoMCwwKSBhbmQgKDEsMSkuXG4gICAgdGhpcy5jeCA9IDMuMCAqIHAxeDtcbiAgICB0aGlzLmJ4ID0gMy4wICogKHAyeCAtIHAxeCkgLSB0aGlzLmN4O1xuICAgIHRoaXMuYXggPSAxLjAgLSB0aGlzLmN4IC0gdGhpcy5ieDtcblxuICAgIHRoaXMuY3kgPSAzLjAgKiBwMXk7XG4gICAgdGhpcy5ieSA9IDMuMCAqIChwMnkgLSBwMXkpIC0gdGhpcy5jeTtcbiAgICB0aGlzLmF5ID0gMS4wIC0gdGhpcy5jeSAtIHRoaXMuYnk7XG5cbiAgICB0aGlzLnAxeCA9IHAxeDtcbiAgICB0aGlzLnAxeSA9IHAyeTtcbiAgICB0aGlzLnAyeCA9IHAyeDtcbiAgICB0aGlzLnAyeSA9IHAyeTtcbn1cblxuVW5pdEJlemllci5wcm90b3R5cGUuc2FtcGxlQ3VydmVYID0gZnVuY3Rpb24odCkge1xuICAgIC8vIGBheCB0XjMgKyBieCB0XjIgKyBjeCB0JyBleHBhbmRlZCB1c2luZyBIb3JuZXIncyBydWxlLlxuICAgIHJldHVybiAoKHRoaXMuYXggKiB0ICsgdGhpcy5ieCkgKiB0ICsgdGhpcy5jeCkgKiB0O1xufTtcblxuVW5pdEJlemllci5wcm90b3R5cGUuc2FtcGxlQ3VydmVZID0gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiAoKHRoaXMuYXkgKiB0ICsgdGhpcy5ieSkgKiB0ICsgdGhpcy5jeSkgKiB0O1xufTtcblxuVW5pdEJlemllci5wcm90b3R5cGUuc2FtcGxlQ3VydmVEZXJpdmF0aXZlWCA9IGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gKDMuMCAqIHRoaXMuYXggKiB0ICsgMi4wICogdGhpcy5ieCkgKiB0ICsgdGhpcy5jeDtcbn07XG5cblVuaXRCZXppZXIucHJvdG90eXBlLnNvbHZlQ3VydmVYID0gZnVuY3Rpb24oeCwgZXBzaWxvbikge1xuICAgIGlmICh0eXBlb2YgZXBzaWxvbiA9PT0gJ3VuZGVmaW5lZCcpIGVwc2lsb24gPSAxZS02O1xuXG4gICAgdmFyIHQwLCB0MSwgdDIsIHgyLCBpO1xuXG4gICAgLy8gRmlyc3QgdHJ5IGEgZmV3IGl0ZXJhdGlvbnMgb2YgTmV3dG9uJ3MgbWV0aG9kIC0tIG5vcm1hbGx5IHZlcnkgZmFzdC5cbiAgICBmb3IgKHQyID0geCwgaSA9IDA7IGkgPCA4OyBpKyspIHtcblxuICAgICAgICB4MiA9IHRoaXMuc2FtcGxlQ3VydmVYKHQyKSAtIHg7XG4gICAgICAgIGlmIChNYXRoLmFicyh4MikgPCBlcHNpbG9uKSByZXR1cm4gdDI7XG5cbiAgICAgICAgdmFyIGQyID0gdGhpcy5zYW1wbGVDdXJ2ZURlcml2YXRpdmVYKHQyKTtcbiAgICAgICAgaWYgKE1hdGguYWJzKGQyKSA8IDFlLTYpIGJyZWFrO1xuXG4gICAgICAgIHQyID0gdDIgLSB4MiAvIGQyO1xuICAgIH1cblxuICAgIC8vIEZhbGwgYmFjayB0byB0aGUgYmlzZWN0aW9uIG1ldGhvZCBmb3IgcmVsaWFiaWxpdHkuXG4gICAgdDAgPSAwLjA7XG4gICAgdDEgPSAxLjA7XG4gICAgdDIgPSB4O1xuXG4gICAgaWYgKHQyIDwgdDApIHJldHVybiB0MDtcbiAgICBpZiAodDIgPiB0MSkgcmV0dXJuIHQxO1xuXG4gICAgd2hpbGUgKHQwIDwgdDEpIHtcblxuICAgICAgICB4MiA9IHRoaXMuc2FtcGxlQ3VydmVYKHQyKTtcbiAgICAgICAgaWYgKE1hdGguYWJzKHgyIC0geCkgPCBlcHNpbG9uKSByZXR1cm4gdDI7XG5cbiAgICAgICAgaWYgKHggPiB4Mikge1xuICAgICAgICAgICAgdDAgPSB0MjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHQxID0gdDI7XG4gICAgICAgIH1cblxuICAgICAgICB0MiA9ICh0MSAtIHQwKSAqIDAuNSArIHQwO1xuICAgIH1cblxuICAgIC8vIEZhaWx1cmUuXG4gICAgcmV0dXJuIHQyO1xufTtcblxuVW5pdEJlemllci5wcm90b3R5cGUuc29sdmUgPSBmdW5jdGlvbih4LCBlcHNpbG9uKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FtcGxlQ3VydmVZKHRoaXMuc29sdmVDdXJ2ZVgoeCwgZXBzaWxvbikpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGUgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlRmVhdHVyZSA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlTGF5ZXIgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanMnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZlY3RvclRpbGVMYXllciA9IHJlcXVpcmUoJy4vdmVjdG9ydGlsZWxheWVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZTtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZShwYmYsIGVuZCkge1xuICAgIHRoaXMubGF5ZXJzID0gcGJmLnJlYWRGaWVsZHMocmVhZFRpbGUsIHt9LCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkVGlsZSh0YWcsIGxheWVycywgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMykge1xuICAgICAgICB2YXIgbGF5ZXIgPSBuZXcgVmVjdG9yVGlsZUxheWVyKHBiZiwgcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MpO1xuICAgICAgICBpZiAobGF5ZXIubGVuZ3RoKSBsYXllcnNbbGF5ZXIubmFtZV0gPSBsYXllcjtcbiAgICB9XG59XG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFBvaW50ID0gcmVxdWlyZSgnQG1hcGJveC9wb2ludC1nZW9tZXRyeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVGZWF0dXJlO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlRmVhdHVyZShwYmYsIGVuZCwgZXh0ZW50LCBrZXlzLCB2YWx1ZXMpIHtcbiAgICAvLyBQdWJsaWNcbiAgICB0aGlzLnByb3BlcnRpZXMgPSB7fTtcbiAgICB0aGlzLmV4dGVudCA9IGV4dGVudDtcbiAgICB0aGlzLnR5cGUgPSAwO1xuXG4gICAgLy8gUHJpdmF0ZVxuICAgIHRoaXMuX3BiZiA9IHBiZjtcbiAgICB0aGlzLl9nZW9tZXRyeSA9IC0xO1xuICAgIHRoaXMuX2tleXMgPSBrZXlzO1xuICAgIHRoaXMuX3ZhbHVlcyA9IHZhbHVlcztcblxuICAgIHBiZi5yZWFkRmllbGRzKHJlYWRGZWF0dXJlLCB0aGlzLCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkRmVhdHVyZSh0YWcsIGZlYXR1cmUsIHBiZikge1xuICAgIGlmICh0YWcgPT0gMSkgZmVhdHVyZS5pZCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09IDIpIHJlYWRUYWcocGJmLCBmZWF0dXJlKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gMykgZmVhdHVyZS50eXBlID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gNCkgZmVhdHVyZS5fZ2VvbWV0cnkgPSBwYmYucG9zO1xufVxuXG5mdW5jdGlvbiByZWFkVGFnKHBiZiwgZmVhdHVyZSkge1xuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcztcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIHZhciBrZXkgPSBmZWF0dXJlLl9rZXlzW3BiZi5yZWFkVmFyaW50KCldLFxuICAgICAgICAgICAgdmFsdWUgPSBmZWF0dXJlLl92YWx1ZXNbcGJmLnJlYWRWYXJpbnQoKV07XG4gICAgICAgIGZlYXR1cmUucHJvcGVydGllc1trZXldID0gdmFsdWU7XG4gICAgfVxufVxuXG5WZWN0b3JUaWxlRmVhdHVyZS50eXBlcyA9IFsnVW5rbm93bicsICdQb2ludCcsICdMaW5lU3RyaW5nJywgJ1BvbHlnb24nXTtcblxuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLmxvYWRHZW9tZXRyeSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYmYgPSB0aGlzLl9wYmY7XG4gICAgcGJmLnBvcyA9IHRoaXMuX2dlb21ldHJ5O1xuXG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zLFxuICAgICAgICBjbWQgPSAxLFxuICAgICAgICBsZW5ndGggPSAwLFxuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIGxpbmVzID0gW10sXG4gICAgICAgIGxpbmU7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGNtZExlbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgICAgICAgICBjbWQgPSBjbWRMZW4gJiAweDc7XG4gICAgICAgICAgICBsZW5ndGggPSBjbWRMZW4gPj4gMztcbiAgICAgICAgfVxuXG4gICAgICAgIGxlbmd0aC0tO1xuXG4gICAgICAgIGlmIChjbWQgPT09IDEgfHwgY21kID09PSAyKSB7XG4gICAgICAgICAgICB4ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgICAgICAgeSArPSBwYmYucmVhZFNWYXJpbnQoKTtcblxuICAgICAgICAgICAgaWYgKGNtZCA9PT0gMSkgeyAvLyBtb3ZlVG9cbiAgICAgICAgICAgICAgICBpZiAobGluZSkgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICAgICAgICBsaW5lID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxpbmUucHVzaChuZXcgUG9pbnQoeCwgeSkpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY21kID09PSA3KSB7XG5cbiAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwbmlrLXZlY3Rvci10aWxlL2lzc3Vlcy85MFxuICAgICAgICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgICAgICAgICBsaW5lLnB1c2gobGluZVswXS5jbG9uZSgpKTsgLy8gY2xvc2VQb2x5Z29uXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBjb21tYW5kICcgKyBjbWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGxpbmUpIGxpbmVzLnB1c2gobGluZSk7XG5cbiAgICByZXR1cm4gbGluZXM7XG59O1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUuYmJveCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYmYgPSB0aGlzLl9wYmY7XG4gICAgcGJmLnBvcyA9IHRoaXMuX2dlb21ldHJ5O1xuXG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zLFxuICAgICAgICBjbWQgPSAxLFxuICAgICAgICBsZW5ndGggPSAwLFxuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIHgxID0gSW5maW5pdHksXG4gICAgICAgIHgyID0gLUluZmluaXR5LFxuICAgICAgICB5MSA9IEluZmluaXR5LFxuICAgICAgICB5MiA9IC1JbmZpbml0eTtcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgY21kTGVuID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICAgICAgICAgIGNtZCA9IGNtZExlbiAmIDB4NztcbiAgICAgICAgICAgIGxlbmd0aCA9IGNtZExlbiA+PiAzO1xuICAgICAgICB9XG5cbiAgICAgICAgbGVuZ3RoLS07XG5cbiAgICAgICAgaWYgKGNtZCA9PT0gMSB8fCBjbWQgPT09IDIpIHtcbiAgICAgICAgICAgIHggKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICB5ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgICAgICAgaWYgKHggPCB4MSkgeDEgPSB4O1xuICAgICAgICAgICAgaWYgKHggPiB4MikgeDIgPSB4O1xuICAgICAgICAgICAgaWYgKHkgPCB5MSkgeTEgPSB5O1xuICAgICAgICAgICAgaWYgKHkgPiB5MikgeTIgPSB5O1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY21kICE9PSA3KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gY29tbWFuZCAnICsgY21kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbeDEsIHkxLCB4MiwgeTJdO1xufTtcblxuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTiA9IGZ1bmN0aW9uKHgsIHksIHopIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuZXh0ZW50ICogTWF0aC5wb3coMiwgeiksXG4gICAgICAgIHgwID0gdGhpcy5leHRlbnQgKiB4LFxuICAgICAgICB5MCA9IHRoaXMuZXh0ZW50ICogeSxcbiAgICAgICAgY29vcmRzID0gdGhpcy5sb2FkR2VvbWV0cnkoKSxcbiAgICAgICAgdHlwZSA9IFZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW3RoaXMudHlwZV0sXG4gICAgICAgIGksIGo7XG5cbiAgICBmdW5jdGlvbiBwcm9qZWN0KGxpbmUpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsaW5lLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgcCA9IGxpbmVbal0sIHkyID0gMTgwIC0gKHAueSArIHkwKSAqIDM2MCAvIHNpemU7XG4gICAgICAgICAgICBsaW5lW2pdID0gW1xuICAgICAgICAgICAgICAgIChwLnggKyB4MCkgKiAzNjAgLyBzaXplIC0gMTgwLFxuICAgICAgICAgICAgICAgIDM2MCAvIE1hdGguUEkgKiBNYXRoLmF0YW4oTWF0aC5leHAoeTIgKiBNYXRoLlBJIC8gMTgwKSkgLSA5MFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgY2FzZSAxOlxuICAgICAgICB2YXIgcG9pbnRzID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHBvaW50c1tpXSA9IGNvb3Jkc1tpXVswXTtcbiAgICAgICAgfVxuICAgICAgICBjb29yZHMgPSBwb2ludHM7XG4gICAgICAgIHByb2plY3QoY29vcmRzKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDI6XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHByb2plY3QoY29vcmRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgIGNhc2UgMzpcbiAgICAgICAgY29vcmRzID0gY2xhc3NpZnlSaW5ncyhjb29yZHMpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29vcmRzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgcHJvamVjdChjb29yZHNbaV1bal0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChjb29yZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlID0gJ011bHRpJyArIHR5cGU7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgdHlwZTogXCJGZWF0dXJlXCIsXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IGNvb3Jkc1xuICAgICAgICB9LFxuICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLnByb3BlcnRpZXNcbiAgICB9O1xuXG4gICAgaWYgKCdpZCcgaW4gdGhpcykge1xuICAgICAgICByZXN1bHQuaWQgPSB0aGlzLmlkO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBjbGFzc2lmaWVzIGFuIGFycmF5IG9mIHJpbmdzIGludG8gcG9seWdvbnMgd2l0aCBvdXRlciByaW5ncyBhbmQgaG9sZXNcblxuZnVuY3Rpb24gY2xhc3NpZnlSaW5ncyhyaW5ncykge1xuICAgIHZhciBsZW4gPSByaW5ncy5sZW5ndGg7XG5cbiAgICBpZiAobGVuIDw9IDEpIHJldHVybiBbcmluZ3NdO1xuXG4gICAgdmFyIHBvbHlnb25zID0gW10sXG4gICAgICAgIHBvbHlnb24sXG4gICAgICAgIGNjdztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGFyZWEgPSBzaWduZWRBcmVhKHJpbmdzW2ldKTtcbiAgICAgICAgaWYgKGFyZWEgPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChjY3cgPT09IHVuZGVmaW5lZCkgY2N3ID0gYXJlYSA8IDA7XG5cbiAgICAgICAgaWYgKGNjdyA9PT0gYXJlYSA8IDApIHtcbiAgICAgICAgICAgIGlmIChwb2x5Z29uKSBwb2x5Z29ucy5wdXNoKHBvbHlnb24pO1xuICAgICAgICAgICAgcG9seWdvbiA9IFtyaW5nc1tpXV07XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvbHlnb24ucHVzaChyaW5nc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvbHlnb24pIHBvbHlnb25zLnB1c2gocG9seWdvbik7XG5cbiAgICByZXR1cm4gcG9seWdvbnM7XG59XG5cbmZ1bmN0aW9uIHNpZ25lZEFyZWEocmluZykge1xuICAgIHZhciBzdW0gPSAwO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSByaW5nLmxlbmd0aCwgaiA9IGxlbiAtIDEsIHAxLCBwMjsgaSA8IGxlbjsgaiA9IGkrKykge1xuICAgICAgICBwMSA9IHJpbmdbaV07XG4gICAgICAgIHAyID0gcmluZ1tqXTtcbiAgICAgICAgc3VtICs9IChwMi54IC0gcDEueCkgKiAocDEueSArIHAyLnkpO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmVjdG9yVGlsZUZlYXR1cmUgPSByZXF1aXJlKCcuL3ZlY3RvcnRpbGVmZWF0dXJlLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZUxheWVyO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlTGF5ZXIocGJmLCBlbmQpIHtcbiAgICAvLyBQdWJsaWNcbiAgICB0aGlzLnZlcnNpb24gPSAxO1xuICAgIHRoaXMubmFtZSA9IG51bGw7XG4gICAgdGhpcy5leHRlbnQgPSA0MDk2O1xuICAgIHRoaXMubGVuZ3RoID0gMDtcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9wYmYgPSBwYmY7XG4gICAgdGhpcy5fa2V5cyA9IFtdO1xuICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgIHRoaXMuX2ZlYXR1cmVzID0gW107XG5cbiAgICBwYmYucmVhZEZpZWxkcyhyZWFkTGF5ZXIsIHRoaXMsIGVuZCk7XG5cbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuX2ZlYXR1cmVzLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gcmVhZExheWVyKHRhZywgbGF5ZXIsIHBiZikge1xuICAgIGlmICh0YWcgPT09IDE1KSBsYXllci52ZXJzaW9uID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDEpIGxheWVyLm5hbWUgPSBwYmYucmVhZFN0cmluZygpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNSkgbGF5ZXIuZXh0ZW50ID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDIpIGxheWVyLl9mZWF0dXJlcy5wdXNoKHBiZi5wb3MpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMykgbGF5ZXIuX2tleXMucHVzaChwYmYucmVhZFN0cmluZygpKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDQpIGxheWVyLl92YWx1ZXMucHVzaChyZWFkVmFsdWVNZXNzYWdlKHBiZikpO1xufVxuXG5mdW5jdGlvbiByZWFkVmFsdWVNZXNzYWdlKHBiZikge1xuICAgIHZhciB2YWx1ZSA9IG51bGwsXG4gICAgICAgIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgdmFyIHRhZyA9IHBiZi5yZWFkVmFyaW50KCkgPj4gMztcblxuICAgICAgICB2YWx1ZSA9IHRhZyA9PT0gMSA/IHBiZi5yZWFkU3RyaW5nKCkgOlxuICAgICAgICAgICAgdGFnID09PSAyID8gcGJmLnJlYWRGbG9hdCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gMyA/IHBiZi5yZWFkRG91YmxlKCkgOlxuICAgICAgICAgICAgdGFnID09PSA0ID8gcGJmLnJlYWRWYXJpbnQ2NCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNSA/IHBiZi5yZWFkVmFyaW50KCkgOlxuICAgICAgICAgICAgdGFnID09PSA2ID8gcGJmLnJlYWRTVmFyaW50KCkgOlxuICAgICAgICAgICAgdGFnID09PSA3ID8gcGJmLnJlYWRCb29sZWFuKCkgOiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuLy8gcmV0dXJuIGZlYXR1cmUgYGlgIGZyb20gdGhpcyBsYXllciBhcyBhIGBWZWN0b3JUaWxlRmVhdHVyZWBcblZlY3RvclRpbGVMYXllci5wcm90b3R5cGUuZmVhdHVyZSA9IGZ1bmN0aW9uKGkpIHtcbiAgICBpZiAoaSA8IDAgfHwgaSA+PSB0aGlzLl9mZWF0dXJlcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignZmVhdHVyZSBpbmRleCBvdXQgb2YgYm91bmRzJyk7XG5cbiAgICB0aGlzLl9wYmYucG9zID0gdGhpcy5fZmVhdHVyZXNbaV07XG5cbiAgICB2YXIgZW5kID0gdGhpcy5fcGJmLnJlYWRWYXJpbnQoKSArIHRoaXMuX3BiZi5wb3M7XG4gICAgcmV0dXJuIG5ldyBWZWN0b3JUaWxlRmVhdHVyZSh0aGlzLl9wYmYsIGVuZCwgdGhpcy5leHRlbnQsIHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcyk7XG59O1xuIiwiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcblx0dHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6XG5cdHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOlxuXHQoZmFjdG9yeSgoZ2xvYmFsLldob29UUyA9IGdsb2JhbC5XaG9vVFMgfHwge30pKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykge1xuXG4vKipcbiAqIGdldFVSTFxuICpcbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgYmFzZVVybCAgQmFzZSB1cmwgb2YgdGhlIFdNUyBzZXJ2ZXJcbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgbGF5ZXIgICAgTGF5ZXIgbmFtZVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB4ICAgICAgICBUaWxlIGNvb3JkaW5hdGUgeFxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB5ICAgICAgICBUaWxlIGNvb3JkaW5hdGUgeVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB6ICAgICAgICBUaWxlIHpvb21cbiAqIEBwYXJhbSAgICB7T2JqZWN0fSAgW29wdGlvbnNdXG4gKiBAcGFyYW0gICAge1N0cmluZ30gIFtvcHRpb25zLmZvcm1hdD0naW1hZ2UvcG5nJ11cbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgW29wdGlvbnMuc2VydmljZT0nV01TJ11cbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgW29wdGlvbnMudmVyc2lvbj0nMS4xLjEnXVxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBbb3B0aW9ucy5yZXF1ZXN0PSdHZXRNYXAnXVxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBbb3B0aW9ucy5zcnM9J0VQU0c6Mzg1NyddXG4gKiBAcGFyYW0gICAge051bWJlcn0gIFtvcHRpb25zLndpZHRoPScyNTYnXVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICBbb3B0aW9ucy5oZWlnaHQ9JzI1NiddXG4gKiBAcmV0dXJucyAge1N0cmluZ30gIHVybFxuICogQGV4YW1wbGVcbiAqIHZhciBiYXNlVXJsID0gJ2h0dHA6Ly9nZW9kYXRhLnN0YXRlLm5qLnVzL2ltYWdlcnl3bXMvTmF0dXJhbDIwMTUnO1xuICogdmFyIGxheWVyID0gJ05hdHVyYWwyMDE1JztcbiAqIHZhciB1cmwgPSB3aG9vdHMuZ2V0VVJMKGJhc2VVcmwsIGxheWVyLCAxNTQzMDgsIDE5NzE2NywgMTkpO1xuICovXG5mdW5jdGlvbiBnZXRVUkwoYmFzZVVybCwgbGF5ZXIsIHgsIHksIHosIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHZhciB1cmwgPSBiYXNlVXJsICsgJz8nICsgW1xuICAgICAgICAnYmJveD0nICAgICsgZ2V0VGlsZUJCb3goeCwgeSwgeiksXG4gICAgICAgICdmb3JtYXQ9JyAgKyAob3B0aW9ucy5mb3JtYXQgfHwgJ2ltYWdlL3BuZycpLFxuICAgICAgICAnc2VydmljZT0nICsgKG9wdGlvbnMuc2VydmljZSB8fCAnV01TJyksXG4gICAgICAgICd2ZXJzaW9uPScgKyAob3B0aW9ucy52ZXJzaW9uIHx8ICcxLjEuMScpLFxuICAgICAgICAncmVxdWVzdD0nICsgKG9wdGlvbnMucmVxdWVzdCB8fCAnR2V0TWFwJyksXG4gICAgICAgICdzcnM9JyAgICAgKyAob3B0aW9ucy5zcnMgfHwgJ0VQU0c6Mzg1NycpLFxuICAgICAgICAnd2lkdGg9JyAgICsgKG9wdGlvbnMud2lkdGggfHwgMjU2KSxcbiAgICAgICAgJ2hlaWdodD0nICArIChvcHRpb25zLmhlaWdodCB8fCAyNTYpLFxuICAgICAgICAnbGF5ZXJzPScgICsgbGF5ZXJcbiAgICBdLmpvaW4oJyYnKTtcblxuICAgIHJldHVybiB1cmw7XG59XG5cblxuLyoqXG4gKiBnZXRUaWxlQkJveFxuICpcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeCAgVGlsZSBjb29yZGluYXRlIHhcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeSAgVGlsZSBjb29yZGluYXRlIHlcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeiAgVGlsZSB6b29tXG4gKiBAcmV0dXJucyAge1N0cmluZ30gIFN0cmluZyBvZiB0aGUgYm91bmRpbmcgYm94XG4gKi9cbmZ1bmN0aW9uIGdldFRpbGVCQm94KHgsIHksIHopIHtcbiAgICAvLyBmb3IgR29vZ2xlL09TTSB0aWxlIHNjaGVtZSB3ZSBuZWVkIHRvIGFsdGVyIHRoZSB5XG4gICAgeSA9IChNYXRoLnBvdygyLCB6KSAtIHkgLSAxKTtcblxuICAgIHZhciBtaW4gPSBnZXRNZXJjQ29vcmRzKHggKiAyNTYsIHkgKiAyNTYsIHopLFxuICAgICAgICBtYXggPSBnZXRNZXJjQ29vcmRzKCh4ICsgMSkgKiAyNTYsICh5ICsgMSkgKiAyNTYsIHopO1xuXG4gICAgcmV0dXJuIG1pblswXSArICcsJyArIG1pblsxXSArICcsJyArIG1heFswXSArICcsJyArIG1heFsxXTtcbn1cblxuXG4vKipcbiAqIGdldE1lcmNDb29yZHNcbiAqXG4gKiBAcGFyYW0gICAge051bWJlcn0gIHggIFBpeGVsIGNvb3JkaW5hdGUgeFxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB5ICBQaXhlbCBjb29yZGluYXRlIHlcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeiAgVGlsZSB6b29tXG4gKiBAcmV0dXJucyAge0FycmF5fSAgIFt4LCB5XVxuICovXG5mdW5jdGlvbiBnZXRNZXJjQ29vcmRzKHgsIHksIHopIHtcbiAgICB2YXIgcmVzb2x1dGlvbiA9ICgyICogTWF0aC5QSSAqIDYzNzgxMzcgLyAyNTYpIC8gTWF0aC5wb3coMiwgeiksXG4gICAgICAgIG1lcmNfeCA9ICh4ICogcmVzb2x1dGlvbiAtIDIgKiBNYXRoLlBJICAqIDYzNzgxMzcgLyAyLjApLFxuICAgICAgICBtZXJjX3kgPSAoeSAqIHJlc29sdXRpb24gLSAyICogTWF0aC5QSSAgKiA2Mzc4MTM3IC8gMi4wKTtcblxuICAgIHJldHVybiBbbWVyY194LCBtZXJjX3ldO1xufVxuXG5leHBvcnRzLmdldFVSTCA9IGdldFVSTDtcbmV4cG9ydHMuZ2V0VGlsZUJCb3ggPSBnZXRUaWxlQkJveDtcbmV4cG9ydHMuZ2V0TWVyY0Nvb3JkcyA9IGdldE1lcmNDb29yZHM7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIGNvbXBhcmUgYW5kIGlzQnVmZmVyIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvYmxvYi82ODBlOWU1ZTQ4OGYyMmFhYzI3NTk5YTU3ZGM4NDRhNjMxNTkyOGRkL2luZGV4LmpzXG4vLyBvcmlnaW5hbCBub3RpY2U6XG5cbi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIHggPSBhLmxlbmd0aDtcbiAgdmFyIHkgPSBiLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXTtcbiAgICAgIHkgPSBiW2ldO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGlmICh5IDwgeCkge1xuICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiAwO1xufVxuZnVuY3Rpb24gaXNCdWZmZXIoYikge1xuICBpZiAoZ2xvYmFsLkJ1ZmZlciAmJiB0eXBlb2YgZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBnbG9iYWwuQnVmZmVyLmlzQnVmZmVyKGIpO1xuICB9XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpO1xufVxuXG4vLyBiYXNlZCBvbiBub2RlIGFzc2VydCwgb3JpZ2luYWwgbm90aWNlOlxuXG4vLyBodHRwOi8vd2lraS5jb21tb25qcy5vcmcvd2lraS9Vbml0X1Rlc3RpbmcvMS4wXG4vL1xuLy8gVEhJUyBJUyBOT1QgVEVTVEVEIE5PUiBMSUtFTFkgVE8gV09SSyBPVVRTSURFIFY4IVxuLy9cbi8vIE9yaWdpbmFsbHkgZnJvbSBuYXJ3aGFsLmpzIChodHRwOi8vbmFyd2hhbGpzLm9yZylcbi8vIENvcHlyaWdodCAoYykgMjAwOSBUaG9tYXMgUm9iaW5zb24gPDI4MG5vcnRoLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAnU29mdHdhcmUnKSwgdG9cbi8vIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOXG4vLyBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsLycpO1xudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcFNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyIGZ1bmN0aW9uc0hhdmVOYW1lcyA9IChmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmb28oKSB7fS5uYW1lID09PSAnZm9vJztcbn0oKSk7XG5mdW5jdGlvbiBwVG9TdHJpbmcgKG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaik7XG59XG5mdW5jdGlvbiBpc1ZpZXcoYXJyYnVmKSB7XG4gIGlmIChpc0J1ZmZlcihhcnJidWYpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgZ2xvYmFsLkFycmF5QnVmZmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhhcnJidWYpO1xuICB9XG4gIGlmICghYXJyYnVmKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChhcnJidWYgaW5zdGFuY2VvZiBEYXRhVmlldykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChhcnJidWYuYnVmZmVyICYmIGFycmJ1Zi5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbi8vIDEuIFRoZSBhc3NlcnQgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0aGF0IHRocm93XG4vLyBBc3NlcnRpb25FcnJvcidzIHdoZW4gcGFydGljdWxhciBjb25kaXRpb25zIGFyZSBub3QgbWV0LiBUaGVcbi8vIGFzc2VydCBtb2R1bGUgbXVzdCBjb25mb3JtIHRvIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlLlxuXG52YXIgYXNzZXJ0ID0gbW9kdWxlLmV4cG9ydHMgPSBvaztcblxuLy8gMi4gVGhlIEFzc2VydGlvbkVycm9yIGlzIGRlZmluZWQgaW4gYXNzZXJ0LlxuLy8gbmV3IGFzc2VydC5Bc3NlcnRpb25FcnJvcih7IG1lc3NhZ2U6IG1lc3NhZ2UsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsOiBhY3R1YWwsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkIH0pXG5cbnZhciByZWdleCA9IC9cXHMqZnVuY3Rpb25cXHMrKFteXFwoXFxzXSopXFxzKi87XG4vLyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL2Z1bmN0aW9uLnByb3RvdHlwZS5uYW1lL2Jsb2IvYWRlZWVlYzhiZmNjNjA2OGIxODdkN2Q5ZmIzZDViYjFkM2EzMDg5OS9pbXBsZW1lbnRhdGlvbi5qc1xuZnVuY3Rpb24gZ2V0TmFtZShmdW5jKSB7XG4gIGlmICghdXRpbC5pc0Z1bmN0aW9uKGZ1bmMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChmdW5jdGlvbnNIYXZlTmFtZXMpIHtcbiAgICByZXR1cm4gZnVuYy5uYW1lO1xuICB9XG4gIHZhciBzdHIgPSBmdW5jLnRvU3RyaW5nKCk7XG4gIHZhciBtYXRjaCA9IHN0ci5tYXRjaChyZWdleCk7XG4gIHJldHVybiBtYXRjaCAmJiBtYXRjaFsxXTtcbn1cbmFzc2VydC5Bc3NlcnRpb25FcnJvciA9IGZ1bmN0aW9uIEFzc2VydGlvbkVycm9yKG9wdGlvbnMpIHtcbiAgdGhpcy5uYW1lID0gJ0Fzc2VydGlvbkVycm9yJztcbiAgdGhpcy5hY3R1YWwgPSBvcHRpb25zLmFjdHVhbDtcbiAgdGhpcy5leHBlY3RlZCA9IG9wdGlvbnMuZXhwZWN0ZWQ7XG4gIHRoaXMub3BlcmF0b3IgPSBvcHRpb25zLm9wZXJhdG9yO1xuICBpZiAob3B0aW9ucy5tZXNzYWdlKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdlO1xuICAgIHRoaXMuZ2VuZXJhdGVkTWVzc2FnZSA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubWVzc2FnZSA9IGdldE1lc3NhZ2UodGhpcyk7XG4gICAgdGhpcy5nZW5lcmF0ZWRNZXNzYWdlID0gdHJ1ZTtcbiAgfVxuICB2YXIgc3RhY2tTdGFydEZ1bmN0aW9uID0gb3B0aW9ucy5zdGFja1N0YXJ0RnVuY3Rpb24gfHwgZmFpbDtcbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgc3RhY2tTdGFydEZ1bmN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBub24gdjggYnJvd3NlcnMgc28gd2UgY2FuIGhhdmUgYSBzdGFja3RyYWNlXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcigpO1xuICAgIGlmIChlcnIuc3RhY2spIHtcbiAgICAgIHZhciBvdXQgPSBlcnIuc3RhY2s7XG5cbiAgICAgIC8vIHRyeSB0byBzdHJpcCB1c2VsZXNzIGZyYW1lc1xuICAgICAgdmFyIGZuX25hbWUgPSBnZXROYW1lKHN0YWNrU3RhcnRGdW5jdGlvbik7XG4gICAgICB2YXIgaWR4ID0gb3V0LmluZGV4T2YoJ1xcbicgKyBmbl9uYW1lKTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAvLyBvbmNlIHdlIGhhdmUgbG9jYXRlZCB0aGUgZnVuY3Rpb24gZnJhbWVcbiAgICAgICAgLy8gd2UgbmVlZCB0byBzdHJpcCBvdXQgZXZlcnl0aGluZyBiZWZvcmUgaXQgKGFuZCBpdHMgbGluZSlcbiAgICAgICAgdmFyIG5leHRfbGluZSA9IG91dC5pbmRleE9mKCdcXG4nLCBpZHggKyAxKTtcbiAgICAgICAgb3V0ID0gb3V0LnN1YnN0cmluZyhuZXh0X2xpbmUgKyAxKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGFjayA9IG91dDtcbiAgICB9XG4gIH1cbn07XG5cbi8vIGFzc2VydC5Bc3NlcnRpb25FcnJvciBpbnN0YW5jZW9mIEVycm9yXG51dGlsLmluaGVyaXRzKGFzc2VydC5Bc3NlcnRpb25FcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiB0cnVuY2F0ZShzLCBuKSB7XG4gIGlmICh0eXBlb2YgcyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPCBuID8gcyA6IHMuc2xpY2UoMCwgbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHM7XG4gIH1cbn1cbmZ1bmN0aW9uIGluc3BlY3Qoc29tZXRoaW5nKSB7XG4gIGlmIChmdW5jdGlvbnNIYXZlTmFtZXMgfHwgIXV0aWwuaXNGdW5jdGlvbihzb21ldGhpbmcpKSB7XG4gICAgcmV0dXJuIHV0aWwuaW5zcGVjdChzb21ldGhpbmcpO1xuICB9XG4gIHZhciByYXduYW1lID0gZ2V0TmFtZShzb21ldGhpbmcpO1xuICB2YXIgbmFtZSA9IHJhd25hbWUgPyAnOiAnICsgcmF3bmFtZSA6ICcnO1xuICByZXR1cm4gJ1tGdW5jdGlvbicgKyAgbmFtZSArICddJztcbn1cbmZ1bmN0aW9uIGdldE1lc3NhZ2Uoc2VsZikge1xuICByZXR1cm4gdHJ1bmNhdGUoaW5zcGVjdChzZWxmLmFjdHVhbCksIDEyOCkgKyAnICcgK1xuICAgICAgICAgc2VsZi5vcGVyYXRvciArICcgJyArXG4gICAgICAgICB0cnVuY2F0ZShpbnNwZWN0KHNlbGYuZXhwZWN0ZWQpLCAxMjgpO1xufVxuXG4vLyBBdCBwcmVzZW50IG9ubHkgdGhlIHRocmVlIGtleXMgbWVudGlvbmVkIGFib3ZlIGFyZSB1c2VkIGFuZFxuLy8gdW5kZXJzdG9vZCBieSB0aGUgc3BlYy4gSW1wbGVtZW50YXRpb25zIG9yIHN1YiBtb2R1bGVzIGNhbiBwYXNzXG4vLyBvdGhlciBrZXlzIHRvIHRoZSBBc3NlcnRpb25FcnJvcidzIGNvbnN0cnVjdG9yIC0gdGhleSB3aWxsIGJlXG4vLyBpZ25vcmVkLlxuXG4vLyAzLiBBbGwgb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbXVzdCB0aHJvdyBhbiBBc3NlcnRpb25FcnJvclxuLy8gd2hlbiBhIGNvcnJlc3BvbmRpbmcgY29uZGl0aW9uIGlzIG5vdCBtZXQsIHdpdGggYSBtZXNzYWdlIHRoYXRcbi8vIG1heSBiZSB1bmRlZmluZWQgaWYgbm90IHByb3ZpZGVkLiAgQWxsIGFzc2VydGlvbiBtZXRob2RzIHByb3ZpZGVcbi8vIGJvdGggdGhlIGFjdHVhbCBhbmQgZXhwZWN0ZWQgdmFsdWVzIHRvIHRoZSBhc3NlcnRpb24gZXJyb3IgZm9yXG4vLyBkaXNwbGF5IHB1cnBvc2VzLlxuXG5mdW5jdGlvbiBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIG9wZXJhdG9yLCBzdGFja1N0YXJ0RnVuY3Rpb24pIHtcbiAgdGhyb3cgbmV3IGFzc2VydC5Bc3NlcnRpb25FcnJvcih7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBhY3R1YWw6IGFjdHVhbCxcbiAgICBleHBlY3RlZDogZXhwZWN0ZWQsXG4gICAgb3BlcmF0b3I6IG9wZXJhdG9yLFxuICAgIHN0YWNrU3RhcnRGdW5jdGlvbjogc3RhY2tTdGFydEZ1bmN0aW9uXG4gIH0pO1xufVxuXG4vLyBFWFRFTlNJT04hIGFsbG93cyBmb3Igd2VsbCBiZWhhdmVkIGVycm9ycyBkZWZpbmVkIGVsc2V3aGVyZS5cbmFzc2VydC5mYWlsID0gZmFpbDtcblxuLy8gNC4gUHVyZSBhc3NlcnRpb24gdGVzdHMgd2hldGhlciBhIHZhbHVlIGlzIHRydXRoeSwgYXMgZGV0ZXJtaW5lZFxuLy8gYnkgISFndWFyZC5cbi8vIGFzc2VydC5vayhndWFyZCwgbWVzc2FnZV9vcHQpO1xuLy8gVGhpcyBzdGF0ZW1lbnQgaXMgZXF1aXZhbGVudCB0byBhc3NlcnQuZXF1YWwodHJ1ZSwgISFndWFyZCxcbi8vIG1lc3NhZ2Vfb3B0KTsuIFRvIHRlc3Qgc3RyaWN0bHkgZm9yIHRoZSB2YWx1ZSB0cnVlLCB1c2Vcbi8vIGFzc2VydC5zdHJpY3RFcXVhbCh0cnVlLCBndWFyZCwgbWVzc2FnZV9vcHQpOy5cblxuZnVuY3Rpb24gb2sodmFsdWUsIG1lc3NhZ2UpIHtcbiAgaWYgKCF2YWx1ZSkgZmFpbCh2YWx1ZSwgdHJ1ZSwgbWVzc2FnZSwgJz09JywgYXNzZXJ0Lm9rKTtcbn1cbmFzc2VydC5vayA9IG9rO1xuXG4vLyA1LiBUaGUgZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIHNoYWxsb3csIGNvZXJjaXZlIGVxdWFsaXR5IHdpdGhcbi8vID09LlxuLy8gYXNzZXJ0LmVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gZXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsICE9IGV4cGVjdGVkKSBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICc9PScsIGFzc2VydC5lcXVhbCk7XG59O1xuXG4vLyA2LiBUaGUgbm9uLWVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBmb3Igd2hldGhlciB0d28gb2JqZWN0cyBhcmUgbm90IGVxdWFsXG4vLyB3aXRoICE9IGFzc2VydC5ub3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5ub3RFcXVhbCA9IGZ1bmN0aW9uIG5vdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCA9PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJyE9JywgYXNzZXJ0Lm5vdEVxdWFsKTtcbiAgfVxufTtcblxuLy8gNy4gVGhlIGVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBhIGRlZXAgZXF1YWxpdHkgcmVsYXRpb24uXG4vLyBhc3NlcnQuZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LmRlZXBFcXVhbCA9IGZ1bmN0aW9uIGRlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmICghX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBmYWxzZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdkZWVwRXF1YWwnLCBhc3NlcnQuZGVlcEVxdWFsKTtcbiAgfVxufTtcblxuYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIGRlZXBTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmICghX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCB0cnVlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ2RlZXBTdHJpY3RFcXVhbCcsIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHN0cmljdCwgbWVtb3MpIHtcbiAgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYWN0dWFsKSAmJiBpc0J1ZmZlcihleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gY29tcGFyZShhY3R1YWwsIGV4cGVjdGVkKSA9PT0gMDtcblxuICAvLyA3LjIuIElmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBhIERhdGUgb2JqZWN0LCB0aGUgYWN0dWFsIHZhbHVlIGlzXG4gIC8vIGVxdWl2YWxlbnQgaWYgaXQgaXMgYWxzbyBhIERhdGUgb2JqZWN0IHRoYXQgcmVmZXJzIHRvIHRoZSBzYW1lIHRpbWUuXG4gIH0gZWxzZSBpZiAodXRpbC5pc0RhdGUoYWN0dWFsKSAmJiB1dGlsLmlzRGF0ZShleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gYWN0dWFsLmdldFRpbWUoKSA9PT0gZXhwZWN0ZWQuZ2V0VGltZSgpO1xuXG4gIC8vIDcuMyBJZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0LCB0aGUgYWN0dWFsIHZhbHVlIGlzXG4gIC8vIGVxdWl2YWxlbnQgaWYgaXQgaXMgYWxzbyBhIFJlZ0V4cCBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzb3VyY2UgYW5kXG4gIC8vIHByb3BlcnRpZXMgKGBnbG9iYWxgLCBgbXVsdGlsaW5lYCwgYGxhc3RJbmRleGAsIGBpZ25vcmVDYXNlYCkuXG4gIH0gZWxzZSBpZiAodXRpbC5pc1JlZ0V4cChhY3R1YWwpICYmIHV0aWwuaXNSZWdFeHAoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGFjdHVhbC5zb3VyY2UgPT09IGV4cGVjdGVkLnNvdXJjZSAmJlxuICAgICAgICAgICBhY3R1YWwuZ2xvYmFsID09PSBleHBlY3RlZC5nbG9iYWwgJiZcbiAgICAgICAgICAgYWN0dWFsLm11bHRpbGluZSA9PT0gZXhwZWN0ZWQubXVsdGlsaW5lICYmXG4gICAgICAgICAgIGFjdHVhbC5sYXN0SW5kZXggPT09IGV4cGVjdGVkLmxhc3RJbmRleCAmJlxuICAgICAgICAgICBhY3R1YWwuaWdub3JlQ2FzZSA9PT0gZXhwZWN0ZWQuaWdub3JlQ2FzZTtcblxuICAvLyA3LjQuIE90aGVyIHBhaXJzIHRoYXQgZG8gbm90IGJvdGggcGFzcyB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcsXG4gIC8vIGVxdWl2YWxlbmNlIGlzIGRldGVybWluZWQgYnkgPT0uXG4gIH0gZWxzZSBpZiAoKGFjdHVhbCA9PT0gbnVsbCB8fCB0eXBlb2YgYWN0dWFsICE9PSAnb2JqZWN0JykgJiZcbiAgICAgICAgICAgICAoZXhwZWN0ZWQgPT09IG51bGwgfHwgdHlwZW9mIGV4cGVjdGVkICE9PSAnb2JqZWN0JykpIHtcbiAgICByZXR1cm4gc3RyaWN0ID8gYWN0dWFsID09PSBleHBlY3RlZCA6IGFjdHVhbCA9PSBleHBlY3RlZDtcblxuICAvLyBJZiBib3RoIHZhbHVlcyBhcmUgaW5zdGFuY2VzIG9mIHR5cGVkIGFycmF5cywgd3JhcCB0aGVpciB1bmRlcmx5aW5nXG4gIC8vIEFycmF5QnVmZmVycyBpbiBhIEJ1ZmZlciBlYWNoIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlXG4gIC8vIFRoaXMgb3B0aW1pemF0aW9uIHJlcXVpcmVzIHRoZSBhcnJheXMgdG8gaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIGNoZWNrZWQgYnlcbiAgLy8gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyAoYWthIHBUb1N0cmluZykuIE5ldmVyIHBlcmZvcm0gYmluYXJ5XG4gIC8vIGNvbXBhcmlzb25zIGZvciBGbG9hdCpBcnJheXMsIHRob3VnaCwgc2luY2UgZS5nLiArMCA9PT0gLTAgYnV0IHRoZWlyXG4gIC8vIGJpdCBwYXR0ZXJucyBhcmUgbm90IGlkZW50aWNhbC5cbiAgfSBlbHNlIGlmIChpc1ZpZXcoYWN0dWFsKSAmJiBpc1ZpZXcoZXhwZWN0ZWQpICYmXG4gICAgICAgICAgICAgcFRvU3RyaW5nKGFjdHVhbCkgPT09IHBUb1N0cmluZyhleHBlY3RlZCkgJiZcbiAgICAgICAgICAgICAhKGFjdHVhbCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSB8fFxuICAgICAgICAgICAgICAgYWN0dWFsIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KSkge1xuICAgIHJldHVybiBjb21wYXJlKG5ldyBVaW50OEFycmF5KGFjdHVhbC5idWZmZXIpLFxuICAgICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KGV4cGVjdGVkLmJ1ZmZlcikpID09PSAwO1xuXG4gIC8vIDcuNSBGb3IgYWxsIG90aGVyIE9iamVjdCBwYWlycywgaW5jbHVkaW5nIEFycmF5IG9iamVjdHMsIGVxdWl2YWxlbmNlIGlzXG4gIC8vIGRldGVybWluZWQgYnkgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChhcyB2ZXJpZmllZFxuICAvLyB3aXRoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCksIHRoZSBzYW1lIHNldCBvZiBrZXlzXG4gIC8vIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLCBlcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnlcbiAgLy8gY29ycmVzcG9uZGluZyBrZXksIGFuZCBhbiBpZGVudGljYWwgJ3Byb3RvdHlwZScgcHJvcGVydHkuIE5vdGU6IHRoaXNcbiAgLy8gYWNjb3VudHMgZm9yIGJvdGggbmFtZWQgYW5kIGluZGV4ZWQgcHJvcGVydGllcyBvbiBBcnJheXMuXG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYWN0dWFsKSAhPT0gaXNCdWZmZXIoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIG1lbW9zID0gbWVtb3MgfHwge2FjdHVhbDogW10sIGV4cGVjdGVkOiBbXX07XG5cbiAgICB2YXIgYWN0dWFsSW5kZXggPSBtZW1vcy5hY3R1YWwuaW5kZXhPZihhY3R1YWwpO1xuICAgIGlmIChhY3R1YWxJbmRleCAhPT0gLTEpIHtcbiAgICAgIGlmIChhY3R1YWxJbmRleCA9PT0gbWVtb3MuZXhwZWN0ZWQuaW5kZXhPZihleHBlY3RlZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWVtb3MuYWN0dWFsLnB1c2goYWN0dWFsKTtcbiAgICBtZW1vcy5leHBlY3RlZC5wdXNoKGV4cGVjdGVkKTtcblxuICAgIHJldHVybiBvYmpFcXVpdihhY3R1YWwsIGV4cGVjdGVkLCBzdHJpY3QsIG1lbW9zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0FyZ3VtZW50cyhvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xufVxuXG5mdW5jdGlvbiBvYmpFcXVpdihhLCBiLCBzdHJpY3QsIGFjdHVhbFZpc2l0ZWRPYmplY3RzKSB7XG4gIGlmIChhID09PSBudWxsIHx8IGEgPT09IHVuZGVmaW5lZCB8fCBiID09PSBudWxsIHx8IGIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG4gIC8vIGlmIG9uZSBpcyBhIHByaW1pdGl2ZSwgdGhlIG90aGVyIG11c3QgYmUgc2FtZVxuICBpZiAodXRpbC5pc1ByaW1pdGl2ZShhKSB8fCB1dGlsLmlzUHJpbWl0aXZlKGIpKVxuICAgIHJldHVybiBhID09PSBiO1xuICBpZiAoc3RyaWN0ICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSAhPT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGIpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgdmFyIGFJc0FyZ3MgPSBpc0FyZ3VtZW50cyhhKTtcbiAgdmFyIGJJc0FyZ3MgPSBpc0FyZ3VtZW50cyhiKTtcbiAgaWYgKChhSXNBcmdzICYmICFiSXNBcmdzKSB8fCAoIWFJc0FyZ3MgJiYgYklzQXJncykpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoYUlzQXJncykge1xuICAgIGEgPSBwU2xpY2UuY2FsbChhKTtcbiAgICBiID0gcFNsaWNlLmNhbGwoYik7XG4gICAgcmV0dXJuIF9kZWVwRXF1YWwoYSwgYiwgc3RyaWN0KTtcbiAgfVxuICB2YXIga2EgPSBvYmplY3RLZXlzKGEpO1xuICB2YXIga2IgPSBvYmplY3RLZXlzKGIpO1xuICB2YXIga2V5LCBpO1xuICAvLyBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGtleXMgaW5jb3Jwb3JhdGVzXG4gIC8vIGhhc093blByb3BlcnR5KVxuICBpZiAoa2EubGVuZ3RoICE9PSBrYi5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvL3RoZSBzYW1lIHNldCBvZiBrZXlzIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLFxuICBrYS5zb3J0KCk7XG4gIGtiLnNvcnQoKTtcbiAgLy9+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPT0ga2JbaV0pXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy9lcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnkgY29ycmVzcG9uZGluZyBrZXksIGFuZFxuICAvL35+fnBvc3NpYmx5IGV4cGVuc2l2ZSBkZWVwIHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBrZXkgPSBrYVtpXTtcbiAgICBpZiAoIV9kZWVwRXF1YWwoYVtrZXldLCBiW2tleV0sIHN0cmljdCwgYWN0dWFsVmlzaXRlZE9iamVjdHMpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyA4LiBUaGUgbm9uLWVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBmb3IgYW55IGRlZXAgaW5lcXVhbGl0eS5cbi8vIGFzc2VydC5ub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90RGVlcEVxdWFsID0gZnVuY3Rpb24gbm90RGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKF9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgZmFsc2UpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnbm90RGVlcEVxdWFsJywgYXNzZXJ0Lm5vdERlZXBFcXVhbCk7XG4gIH1cbn07XG5cbmFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWwgPSBub3REZWVwU3RyaWN0RXF1YWw7XG5mdW5jdGlvbiBub3REZWVwU3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCB0cnVlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ25vdERlZXBTdHJpY3RFcXVhbCcsIG5vdERlZXBTdHJpY3RFcXVhbCk7XG4gIH1cbn1cblxuXG4vLyA5LiBUaGUgc3RyaWN0IGVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBzdHJpY3QgZXF1YWxpdHksIGFzIGRldGVybWluZWQgYnkgPT09LlxuLy8gYXNzZXJ0LnN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LnN0cmljdEVxdWFsID0gZnVuY3Rpb24gc3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJz09PScsIGFzc2VydC5zdHJpY3RFcXVhbCk7XG4gIH1cbn07XG5cbi8vIDEwLiBUaGUgc3RyaWN0IG5vbi1lcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgZm9yIHN0cmljdCBpbmVxdWFsaXR5LCBhc1xuLy8gZGV0ZXJtaW5lZCBieSAhPT0uICBhc3NlcnQubm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90U3RyaWN0RXF1YWwgPSBmdW5jdGlvbiBub3RTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnIT09JywgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkge1xuICBpZiAoIWFjdHVhbCB8fCAhZXhwZWN0ZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGV4cGVjdGVkKSA9PSAnW29iamVjdCBSZWdFeHBdJykge1xuICAgIHJldHVybiBleHBlY3RlZC50ZXN0KGFjdHVhbCk7XG4gIH1cblxuICB0cnkge1xuICAgIGlmIChhY3R1YWwgaW5zdGFuY2VvZiBleHBlY3RlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSWdub3JlLiAgVGhlIGluc3RhbmNlb2YgY2hlY2sgZG9lc24ndCB3b3JrIGZvciBhcnJvdyBmdW5jdGlvbnMuXG4gIH1cblxuICBpZiAoRXJyb3IuaXNQcm90b3R5cGVPZihleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZXhwZWN0ZWQuY2FsbCh7fSwgYWN0dWFsKSA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gX3RyeUJsb2NrKGJsb2NrKSB7XG4gIHZhciBlcnJvcjtcbiAgdHJ5IHtcbiAgICBibG9jaygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZXJyb3IgPSBlO1xuICB9XG4gIHJldHVybiBlcnJvcjtcbn1cblxuZnVuY3Rpb24gX3Rocm93cyhzaG91bGRUaHJvdywgYmxvY2ssIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIHZhciBhY3R1YWw7XG5cbiAgaWYgKHR5cGVvZiBibG9jayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYmxvY2tcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZXhwZWN0ZWQgPT09ICdzdHJpbmcnKSB7XG4gICAgbWVzc2FnZSA9IGV4cGVjdGVkO1xuICAgIGV4cGVjdGVkID0gbnVsbDtcbiAgfVxuXG4gIGFjdHVhbCA9IF90cnlCbG9jayhibG9jayk7XG5cbiAgbWVzc2FnZSA9IChleHBlY3RlZCAmJiBleHBlY3RlZC5uYW1lID8gJyAoJyArIGV4cGVjdGVkLm5hbWUgKyAnKS4nIDogJy4nKSArXG4gICAgICAgICAgICAobWVzc2FnZSA/ICcgJyArIG1lc3NhZ2UgOiAnLicpO1xuXG4gIGlmIChzaG91bGRUaHJvdyAmJiAhYWN0dWFsKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCAnTWlzc2luZyBleHBlY3RlZCBleGNlcHRpb24nICsgbWVzc2FnZSk7XG4gIH1cblxuICB2YXIgdXNlclByb3ZpZGVkTWVzc2FnZSA9IHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJztcbiAgdmFyIGlzVW53YW50ZWRFeGNlcHRpb24gPSAhc2hvdWxkVGhyb3cgJiYgdXRpbC5pc0Vycm9yKGFjdHVhbCk7XG4gIHZhciBpc1VuZXhwZWN0ZWRFeGNlcHRpb24gPSAhc2hvdWxkVGhyb3cgJiYgYWN0dWFsICYmICFleHBlY3RlZDtcblxuICBpZiAoKGlzVW53YW50ZWRFeGNlcHRpb24gJiZcbiAgICAgIHVzZXJQcm92aWRlZE1lc3NhZ2UgJiZcbiAgICAgIGV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpKSB8fFxuICAgICAgaXNVbmV4cGVjdGVkRXhjZXB0aW9uKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCAnR290IHVud2FudGVkIGV4Y2VwdGlvbicgKyBtZXNzYWdlKTtcbiAgfVxuXG4gIGlmICgoc2hvdWxkVGhyb3cgJiYgYWN0dWFsICYmIGV4cGVjdGVkICYmXG4gICAgICAhZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkpIHx8ICghc2hvdWxkVGhyb3cgJiYgYWN0dWFsKSkge1xuICAgIHRocm93IGFjdHVhbDtcbiAgfVxufVxuXG4vLyAxMS4gRXhwZWN0ZWQgdG8gdGhyb3cgYW4gZXJyb3I6XG4vLyBhc3NlcnQudGhyb3dzKGJsb2NrLCBFcnJvcl9vcHQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LnRocm93cyA9IGZ1bmN0aW9uKGJsb2NrLCAvKm9wdGlvbmFsKi9lcnJvciwgLypvcHRpb25hbCovbWVzc2FnZSkge1xuICBfdGhyb3dzKHRydWUsIGJsb2NrLCBlcnJvciwgbWVzc2FnZSk7XG59O1xuXG4vLyBFWFRFTlNJT04hIFRoaXMgaXMgYW5ub3lpbmcgdG8gd3JpdGUgb3V0c2lkZSB0aGlzIG1vZHVsZS5cbmFzc2VydC5kb2VzTm90VGhyb3cgPSBmdW5jdGlvbihibG9jaywgLypvcHRpb25hbCovZXJyb3IsIC8qb3B0aW9uYWwqL21lc3NhZ2UpIHtcbiAgX3Rocm93cyhmYWxzZSwgYmxvY2ssIGVycm9yLCBtZXNzYWdlKTtcbn07XG5cbmFzc2VydC5pZkVycm9yID0gZnVuY3Rpb24oZXJyKSB7IGlmIChlcnIpIHRocm93IGVycjsgfTtcblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAoaGFzT3duLmNhbGwob2JqLCBrZXkpKSBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4ga2V5cztcbn07XG4iLCIvLyAoYykgRGVhbiBNY05hbWVlIDxkZWFuQGdtYWlsLmNvbT4sIDIwMTIuXG4vL1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2RlYW5tL2Nzcy1jb2xvci1wYXJzZXItanNcbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lOR1xuLy8gRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HU1xuLy8gSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yL1xudmFyIGtDU1NDb2xvclRhYmxlID0ge1xuICBcInRyYW5zcGFyZW50XCI6IFswLDAsMCwwXSwgXCJhbGljZWJsdWVcIjogWzI0MCwyNDgsMjU1LDFdLFxuICBcImFudGlxdWV3aGl0ZVwiOiBbMjUwLDIzNSwyMTUsMV0sIFwiYXF1YVwiOiBbMCwyNTUsMjU1LDFdLFxuICBcImFxdWFtYXJpbmVcIjogWzEyNywyNTUsMjEyLDFdLCBcImF6dXJlXCI6IFsyNDAsMjU1LDI1NSwxXSxcbiAgXCJiZWlnZVwiOiBbMjQ1LDI0NSwyMjAsMV0sIFwiYmlzcXVlXCI6IFsyNTUsMjI4LDE5NiwxXSxcbiAgXCJibGFja1wiOiBbMCwwLDAsMV0sIFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwyMzUsMjA1LDFdLFxuICBcImJsdWVcIjogWzAsMCwyNTUsMV0sIFwiYmx1ZXZpb2xldFwiOiBbMTM4LDQzLDIyNiwxXSxcbiAgXCJicm93blwiOiBbMTY1LDQyLDQyLDFdLCBcImJ1cmx5d29vZFwiOiBbMjIyLDE4NCwxMzUsMV0sXG4gIFwiY2FkZXRibHVlXCI6IFs5NSwxNTgsMTYwLDFdLCBcImNoYXJ0cmV1c2VcIjogWzEyNywyNTUsMCwxXSxcbiAgXCJjaG9jb2xhdGVcIjogWzIxMCwxMDUsMzAsMV0sIFwiY29yYWxcIjogWzI1NSwxMjcsODAsMV0sXG4gIFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwxNDksMjM3LDFdLCBcImNvcm5zaWxrXCI6IFsyNTUsMjQ4LDIyMCwxXSxcbiAgXCJjcmltc29uXCI6IFsyMjAsMjAsNjAsMV0sIFwiY3lhblwiOiBbMCwyNTUsMjU1LDFdLFxuICBcImRhcmtibHVlXCI6IFswLDAsMTM5LDFdLCBcImRhcmtjeWFuXCI6IFswLDEzOSwxMzksMV0sXG4gIFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LDEzNCwxMSwxXSwgXCJkYXJrZ3JheVwiOiBbMTY5LDE2OSwxNjksMV0sXG4gIFwiZGFya2dyZWVuXCI6IFswLDEwMCwwLDFdLCBcImRhcmtncmV5XCI6IFsxNjksMTY5LDE2OSwxXSxcbiAgXCJkYXJra2hha2lcIjogWzE4OSwxODMsMTA3LDFdLCBcImRhcmttYWdlbnRhXCI6IFsxMzksMCwxMzksMV0sXG4gIFwiZGFya29saXZlZ3JlZW5cIjogWzg1LDEwNyw0NywxXSwgXCJkYXJrb3JhbmdlXCI6IFsyNTUsMTQwLDAsMV0sXG4gIFwiZGFya29yY2hpZFwiOiBbMTUzLDUwLDIwNCwxXSwgXCJkYXJrcmVkXCI6IFsxMzksMCwwLDFdLFxuICBcImRhcmtzYWxtb25cIjogWzIzMywxNTAsMTIyLDFdLCBcImRhcmtzZWFncmVlblwiOiBbMTQzLDE4OCwxNDMsMV0sXG4gIFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsNjEsMTM5LDFdLCBcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LDc5LDc5LDFdLFxuICBcImRhcmtzbGF0ZWdyZXlcIjogWzQ3LDc5LDc5LDFdLCBcImRhcmt0dXJxdW9pc2VcIjogWzAsMjA2LDIwOSwxXSxcbiAgXCJkYXJrdmlvbGV0XCI6IFsxNDgsMCwyMTEsMV0sIFwiZGVlcHBpbmtcIjogWzI1NSwyMCwxNDcsMV0sXG4gIFwiZGVlcHNreWJsdWVcIjogWzAsMTkxLDI1NSwxXSwgXCJkaW1ncmF5XCI6IFsxMDUsMTA1LDEwNSwxXSxcbiAgXCJkaW1ncmV5XCI6IFsxMDUsMTA1LDEwNSwxXSwgXCJkb2RnZXJibHVlXCI6IFszMCwxNDQsMjU1LDFdLFxuICBcImZpcmVicmlja1wiOiBbMTc4LDM0LDM0LDFdLCBcImZsb3JhbHdoaXRlXCI6IFsyNTUsMjUwLDI0MCwxXSxcbiAgXCJmb3Jlc3RncmVlblwiOiBbMzQsMTM5LDM0LDFdLCBcImZ1Y2hzaWFcIjogWzI1NSwwLDI1NSwxXSxcbiAgXCJnYWluc2Jvcm9cIjogWzIyMCwyMjAsMjIwLDFdLCBcImdob3N0d2hpdGVcIjogWzI0OCwyNDgsMjU1LDFdLFxuICBcImdvbGRcIjogWzI1NSwyMTUsMCwxXSwgXCJnb2xkZW5yb2RcIjogWzIxOCwxNjUsMzIsMV0sXG4gIFwiZ3JheVwiOiBbMTI4LDEyOCwxMjgsMV0sIFwiZ3JlZW5cIjogWzAsMTI4LDAsMV0sXG4gIFwiZ3JlZW55ZWxsb3dcIjogWzE3MywyNTUsNDcsMV0sIFwiZ3JleVwiOiBbMTI4LDEyOCwxMjgsMV0sXG4gIFwiaG9uZXlkZXdcIjogWzI0MCwyNTUsMjQwLDFdLCBcImhvdHBpbmtcIjogWzI1NSwxMDUsMTgwLDFdLFxuICBcImluZGlhbnJlZFwiOiBbMjA1LDkyLDkyLDFdLCBcImluZGlnb1wiOiBbNzUsMCwxMzAsMV0sXG4gIFwiaXZvcnlcIjogWzI1NSwyNTUsMjQwLDFdLCBcImtoYWtpXCI6IFsyNDAsMjMwLDE0MCwxXSxcbiAgXCJsYXZlbmRlclwiOiBbMjMwLDIzMCwyNTAsMV0sIFwibGF2ZW5kZXJibHVzaFwiOiBbMjU1LDI0MCwyNDUsMV0sXG4gIFwibGF3bmdyZWVuXCI6IFsxMjQsMjUyLDAsMV0sIFwibGVtb25jaGlmZm9uXCI6IFsyNTUsMjUwLDIwNSwxXSxcbiAgXCJsaWdodGJsdWVcIjogWzE3MywyMTYsMjMwLDFdLCBcImxpZ2h0Y29yYWxcIjogWzI0MCwxMjgsMTI4LDFdLFxuICBcImxpZ2h0Y3lhblwiOiBbMjI0LDI1NSwyNTUsMV0sIFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogWzI1MCwyNTAsMjEwLDFdLFxuICBcImxpZ2h0Z3JheVwiOiBbMjExLDIxMSwyMTEsMV0sIFwibGlnaHRncmVlblwiOiBbMTQ0LDIzOCwxNDQsMV0sXG4gIFwibGlnaHRncmV5XCI6IFsyMTEsMjExLDIxMSwxXSwgXCJsaWdodHBpbmtcIjogWzI1NSwxODIsMTkzLDFdLFxuICBcImxpZ2h0c2FsbW9uXCI6IFsyNTUsMTYwLDEyMiwxXSwgXCJsaWdodHNlYWdyZWVuXCI6IFszMiwxNzgsMTcwLDFdLFxuICBcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LDIwNiwyNTAsMV0sIFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwxMzYsMTUzLDFdLFxuICBcImxpZ2h0c2xhdGVncmV5XCI6IFsxMTksMTM2LDE1MywxXSwgXCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LDE5NiwyMjIsMV0sXG4gIFwibGlnaHR5ZWxsb3dcIjogWzI1NSwyNTUsMjI0LDFdLCBcImxpbWVcIjogWzAsMjU1LDAsMV0sXG4gIFwibGltZWdyZWVuXCI6IFs1MCwyMDUsNTAsMV0sIFwibGluZW5cIjogWzI1MCwyNDAsMjMwLDFdLFxuICBcIm1hZ2VudGFcIjogWzI1NSwwLDI1NSwxXSwgXCJtYXJvb25cIjogWzEyOCwwLDAsMV0sXG4gIFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLDIwNSwxNzAsMV0sIFwibWVkaXVtYmx1ZVwiOiBbMCwwLDIwNSwxXSxcbiAgXCJtZWRpdW1vcmNoaWRcIjogWzE4Niw4NSwyMTEsMV0sIFwibWVkaXVtcHVycGxlXCI6IFsxNDcsMTEyLDIxOSwxXSxcbiAgXCJtZWRpdW1zZWFncmVlblwiOiBbNjAsMTc5LDExMywxXSwgXCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywxMDQsMjM4LDFdLFxuICBcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLDI1MCwxNTQsMV0sIFwibWVkaXVtdHVycXVvaXNlXCI6IFs3MiwyMDksMjA0LDFdLFxuICBcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LDIxLDEzMywxXSwgXCJtaWRuaWdodGJsdWVcIjogWzI1LDI1LDExMiwxXSxcbiAgXCJtaW50Y3JlYW1cIjogWzI0NSwyNTUsMjUwLDFdLCBcIm1pc3R5cm9zZVwiOiBbMjU1LDIyOCwyMjUsMV0sXG4gIFwibW9jY2FzaW5cIjogWzI1NSwyMjgsMTgxLDFdLCBcIm5hdmFqb3doaXRlXCI6IFsyNTUsMjIyLDE3MywxXSxcbiAgXCJuYXZ5XCI6IFswLDAsMTI4LDFdLCBcIm9sZGxhY2VcIjogWzI1MywyNDUsMjMwLDFdLFxuICBcIm9saXZlXCI6IFsxMjgsMTI4LDAsMV0sIFwib2xpdmVkcmFiXCI6IFsxMDcsMTQyLDM1LDFdLFxuICBcIm9yYW5nZVwiOiBbMjU1LDE2NSwwLDFdLCBcIm9yYW5nZXJlZFwiOiBbMjU1LDY5LDAsMV0sXG4gIFwib3JjaGlkXCI6IFsyMTgsMTEyLDIxNCwxXSwgXCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsMjMyLDE3MCwxXSxcbiAgXCJwYWxlZ3JlZW5cIjogWzE1MiwyNTEsMTUyLDFdLCBcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwyMzgsMjM4LDFdLFxuICBcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwxMTIsMTQ3LDFdLCBcInBhcGF5YXdoaXBcIjogWzI1NSwyMzksMjEzLDFdLFxuICBcInBlYWNocHVmZlwiOiBbMjU1LDIxOCwxODUsMV0sIFwicGVydVwiOiBbMjA1LDEzMyw2MywxXSxcbiAgXCJwaW5rXCI6IFsyNTUsMTkyLDIwMywxXSwgXCJwbHVtXCI6IFsyMjEsMTYwLDIyMSwxXSxcbiAgXCJwb3dkZXJibHVlXCI6IFsxNzYsMjI0LDIzMCwxXSwgXCJwdXJwbGVcIjogWzEyOCwwLDEyOCwxXSxcbiAgXCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsNTEsMTUzLDFdLFxuICBcInJlZFwiOiBbMjU1LDAsMCwxXSwgXCJyb3N5YnJvd25cIjogWzE4OCwxNDMsMTQzLDFdLFxuICBcInJveWFsYmx1ZVwiOiBbNjUsMTA1LDIyNSwxXSwgXCJzYWRkbGVicm93blwiOiBbMTM5LDY5LDE5LDFdLFxuICBcInNhbG1vblwiOiBbMjUwLDEyOCwxMTQsMV0sIFwic2FuZHlicm93blwiOiBbMjQ0LDE2NCw5NiwxXSxcbiAgXCJzZWFncmVlblwiOiBbNDYsMTM5LDg3LDFdLCBcInNlYXNoZWxsXCI6IFsyNTUsMjQ1LDIzOCwxXSxcbiAgXCJzaWVubmFcIjogWzE2MCw4Miw0NSwxXSwgXCJzaWx2ZXJcIjogWzE5MiwxOTIsMTkyLDFdLFxuICBcInNreWJsdWVcIjogWzEzNSwyMDYsMjM1LDFdLCBcInNsYXRlYmx1ZVwiOiBbMTA2LDkwLDIwNSwxXSxcbiAgXCJzbGF0ZWdyYXlcIjogWzExMiwxMjgsMTQ0LDFdLCBcInNsYXRlZ3JleVwiOiBbMTEyLDEyOCwxNDQsMV0sXG4gIFwic25vd1wiOiBbMjU1LDI1MCwyNTAsMV0sIFwic3ByaW5nZ3JlZW5cIjogWzAsMjU1LDEyNywxXSxcbiAgXCJzdGVlbGJsdWVcIjogWzcwLDEzMCwxODAsMV0sIFwidGFuXCI6IFsyMTAsMTgwLDE0MCwxXSxcbiAgXCJ0ZWFsXCI6IFswLDEyOCwxMjgsMV0sIFwidGhpc3RsZVwiOiBbMjE2LDE5MSwyMTYsMV0sXG4gIFwidG9tYXRvXCI6IFsyNTUsOTksNzEsMV0sIFwidHVycXVvaXNlXCI6IFs2NCwyMjQsMjA4LDFdLFxuICBcInZpb2xldFwiOiBbMjM4LDEzMCwyMzgsMV0sIFwid2hlYXRcIjogWzI0NSwyMjIsMTc5LDFdLFxuICBcIndoaXRlXCI6IFsyNTUsMjU1LDI1NSwxXSwgXCJ3aGl0ZXNtb2tlXCI6IFsyNDUsMjQ1LDI0NSwxXSxcbiAgXCJ5ZWxsb3dcIjogWzI1NSwyNTUsMCwxXSwgXCJ5ZWxsb3dncmVlblwiOiBbMTU0LDIwNSw1MCwxXX1cblxuZnVuY3Rpb24gY2xhbXBfY3NzX2J5dGUoaSkgeyAgLy8gQ2xhbXAgdG8gaW50ZWdlciAwIC4uIDI1NS5cbiAgaSA9IE1hdGgucm91bmQoaSk7ICAvLyBTZWVtcyB0byBiZSB3aGF0IENocm9tZSBkb2VzICh2cyB0cnVuY2F0aW9uKS5cbiAgcmV0dXJuIGkgPCAwID8gMCA6IGkgPiAyNTUgPyAyNTUgOiBpO1xufVxuXG5mdW5jdGlvbiBjbGFtcF9jc3NfZmxvYXQoZikgeyAgLy8gQ2xhbXAgdG8gZmxvYXQgMC4wIC4uIDEuMC5cbiAgcmV0dXJuIGYgPCAwID8gMCA6IGYgPiAxID8gMSA6IGY7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2Nzc19pbnQoc3RyKSB7ICAvLyBpbnQgb3IgcGVyY2VudGFnZS5cbiAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICclJylcbiAgICByZXR1cm4gY2xhbXBfY3NzX2J5dGUocGFyc2VGbG9hdChzdHIpIC8gMTAwICogMjU1KTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19ieXRlKHBhcnNlSW50KHN0cikpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jc3NfZmxvYXQoc3RyKSB7ICAvLyBmbG9hdCBvciBwZXJjZW50YWdlLlxuICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJyUnKVxuICAgIHJldHVybiBjbGFtcF9jc3NfZmxvYXQocGFyc2VGbG9hdChzdHIpIC8gMTAwKTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19mbG9hdChwYXJzZUZsb2F0KHN0cikpO1xufVxuXG5mdW5jdGlvbiBjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgpIHtcbiAgaWYgKGggPCAwKSBoICs9IDE7XG4gIGVsc2UgaWYgKGggPiAxKSBoIC09IDE7XG5cbiAgaWYgKGggKiA2IDwgMSkgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogaCAqIDY7XG4gIGlmIChoICogMiA8IDEpIHJldHVybiBtMjtcbiAgaWYgKGggKiAzIDwgMikgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogKDIvMyAtIGgpICogNjtcbiAgcmV0dXJuIG0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNTU0NvbG9yKGNzc19zdHIpIHtcbiAgLy8gUmVtb3ZlIGFsbCB3aGl0ZXNwYWNlLCBub3QgY29tcGxpYW50LCBidXQgc2hvdWxkIGp1c3QgYmUgbW9yZSBhY2NlcHRpbmcuXG4gIHZhciBzdHIgPSBjc3Nfc3RyLnJlcGxhY2UoLyAvZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gQ29sb3Iga2V5d29yZHMgKGFuZCB0cmFuc3BhcmVudCkgbG9va3VwLlxuICBpZiAoc3RyIGluIGtDU1NDb2xvclRhYmxlKSByZXR1cm4ga0NTU0NvbG9yVGFibGVbc3RyXS5zbGljZSgpOyAgLy8gZHVwLlxuXG4gIC8vICNhYmMgYW5kICNhYmMxMjMgc3ludGF4LlxuICBpZiAoc3RyWzBdID09PSAnIycpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gNCkge1xuICAgICAgdmFyIGl2ID0gcGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTYpOyAgLy8gVE9ETyhkZWFubSk6IFN0cmljdGVyIHBhcnNpbmcuXG4gICAgICBpZiAoIShpdiA+PSAwICYmIGl2IDw9IDB4ZmZmKSkgcmV0dXJuIG51bGw7ICAvLyBDb3ZlcnMgTmFOLlxuICAgICAgcmV0dXJuIFsoKGl2ICYgMHhmMDApID4+IDQpIHwgKChpdiAmIDB4ZjAwKSA+PiA4KSxcbiAgICAgICAgICAgICAgKGl2ICYgMHhmMCkgfCAoKGl2ICYgMHhmMCkgPj4gNCksXG4gICAgICAgICAgICAgIChpdiAmIDB4ZikgfCAoKGl2ICYgMHhmKSA8PCA0KSxcbiAgICAgICAgICAgICAgMV07XG4gICAgfSBlbHNlIGlmIChzdHIubGVuZ3RoID09PSA3KSB7XG4gICAgICB2YXIgaXYgPSBwYXJzZUludChzdHIuc3Vic3RyKDEpLCAxNik7ICAvLyBUT0RPKGRlYW5tKTogU3RyaWN0ZXIgcGFyc2luZy5cbiAgICAgIGlmICghKGl2ID49IDAgJiYgaXYgPD0gMHhmZmZmZmYpKSByZXR1cm4gbnVsbDsgIC8vIENvdmVycyBOYU4uXG4gICAgICByZXR1cm4gWyhpdiAmIDB4ZmYwMDAwKSA+PiAxNixcbiAgICAgICAgICAgICAgKGl2ICYgMHhmZjAwKSA+PiA4LFxuICAgICAgICAgICAgICBpdiAmIDB4ZmYsXG4gICAgICAgICAgICAgIDFdO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG9wID0gc3RyLmluZGV4T2YoJygnKSwgZXAgPSBzdHIuaW5kZXhPZignKScpO1xuICBpZiAob3AgIT09IC0xICYmIGVwICsgMSA9PT0gc3RyLmxlbmd0aCkge1xuICAgIHZhciBmbmFtZSA9IHN0ci5zdWJzdHIoMCwgb3ApO1xuICAgIHZhciBwYXJhbXMgPSBzdHIuc3Vic3RyKG9wKzEsIGVwLShvcCsxKSkuc3BsaXQoJywnKTtcbiAgICB2YXIgYWxwaGEgPSAxOyAgLy8gVG8gYWxsb3cgY2FzZSBmYWxsdGhyb3VnaC5cbiAgICBzd2l0Y2ggKGZuYW1lKSB7XG4gICAgICBjYXNlICdyZ2JhJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICAgICAgICBhbHBoYSA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXMucG9wKCkpO1xuICAgICAgICAvLyBGYWxsIHRocm91Z2guXG4gICAgICBjYXNlICdyZ2InOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBbcGFyc2VfY3NzX2ludChwYXJhbXNbMF0pLFxuICAgICAgICAgICAgICAgIHBhcnNlX2Nzc19pbnQocGFyYW1zWzFdKSxcbiAgICAgICAgICAgICAgICBwYXJzZV9jc3NfaW50KHBhcmFtc1syXSksXG4gICAgICAgICAgICAgICAgYWxwaGFdO1xuICAgICAgY2FzZSAnaHNsYSc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgYWxwaGEgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zLnBvcCgpKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoLlxuICAgICAgY2FzZSAnaHNsJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgaCA9ICgoKHBhcnNlRmxvYXQocGFyYW1zWzBdKSAlIDM2MCkgKyAzNjApICUgMzYwKSAvIDM2MDsgIC8vIDAgLi4gMVxuICAgICAgICAvLyBOT1RFKGRlYW5tKTogQWNjb3JkaW5nIHRvIHRoZSBDU1Mgc3BlYyBzL2wgc2hvdWxkIG9ubHkgYmVcbiAgICAgICAgLy8gcGVyY2VudGFnZXMsIGJ1dCB3ZSBkb24ndCBib3RoZXIgYW5kIGxldCBmbG9hdCBvciBwZXJjZW50YWdlLlxuICAgICAgICB2YXIgcyA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMV0pO1xuICAgICAgICB2YXIgbCA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMl0pO1xuICAgICAgICB2YXIgbTIgPSBsIDw9IDAuNSA/IGwgKiAocyArIDEpIDogbCArIHMgLSBsICogcztcbiAgICAgICAgdmFyIG0xID0gbCAqIDIgLSBtMjtcbiAgICAgICAgcmV0dXJuIFtjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgrMS8zKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoLTEvMykgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGFscGhhXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG50cnkgeyBleHBvcnRzLnBhcnNlQ1NTQ29sb3IgPSBwYXJzZUNTU0NvbG9yIH0gY2F0Y2goZSkgeyB9XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZWFyY3V0O1xubW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IGVhcmN1dDtcblxuZnVuY3Rpb24gZWFyY3V0KGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0pIHtcblxuICAgIGRpbSA9IGRpbSB8fCAyO1xuXG4gICAgdmFyIGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoLFxuICAgICAgICBvdXRlckxlbiA9IGhhc0hvbGVzID8gaG9sZUluZGljZXNbMF0gKiBkaW0gOiBkYXRhLmxlbmd0aCxcbiAgICAgICAgb3V0ZXJOb2RlID0gbGlua2VkTGlzdChkYXRhLCAwLCBvdXRlckxlbiwgZGltLCB0cnVlKSxcbiAgICAgICAgdHJpYW5nbGVzID0gW107XG5cbiAgICBpZiAoIW91dGVyTm9kZSkgcmV0dXJuIHRyaWFuZ2xlcztcblxuICAgIHZhciBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB4LCB5LCBpbnZTaXplO1xuXG4gICAgaWYgKGhhc0hvbGVzKSBvdXRlck5vZGUgPSBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pO1xuXG4gICAgLy8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XG4gICAgaWYgKGRhdGEubGVuZ3RoID4gODAgKiBkaW0pIHtcbiAgICAgICAgbWluWCA9IG1heFggPSBkYXRhWzBdO1xuICAgICAgICBtaW5ZID0gbWF4WSA9IGRhdGFbMV07XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IGRpbTsgaSA8IG91dGVyTGVuOyBpICs9IGRpbSkge1xuICAgICAgICAgICAgeCA9IGRhdGFbaV07XG4gICAgICAgICAgICB5ID0gZGF0YVtpICsgMV07XG4gICAgICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWluWCwgbWluWSBhbmQgaW52U2l6ZSBhcmUgbGF0ZXIgdXNlZCB0byB0cmFuc2Zvcm0gY29vcmRzIGludG8gaW50ZWdlcnMgZm9yIHotb3JkZXIgY2FsY3VsYXRpb25cbiAgICAgICAgaW52U2l6ZSA9IE1hdGgubWF4KG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSk7XG4gICAgICAgIGludlNpemUgPSBpbnZTaXplICE9PSAwID8gMSAvIGludlNpemUgOiAwO1xuICAgIH1cblxuICAgIGVhcmN1dExpbmtlZChvdXRlck5vZGUsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcblxuICAgIHJldHVybiB0cmlhbmdsZXM7XG59XG5cbi8vIGNyZWF0ZSBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdCBmcm9tIHBvbHlnb24gcG9pbnRzIGluIHRoZSBzcGVjaWZpZWQgd2luZGluZyBvcmRlclxuZnVuY3Rpb24gbGlua2VkTGlzdChkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGNsb2Nrd2lzZSkge1xuICAgIHZhciBpLCBsYXN0O1xuXG4gICAgaWYgKGNsb2Nrd2lzZSA9PT0gKHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSA+IDApKSB7XG4gICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoaSA9IGVuZCAtIGRpbTsgaSA+PSBzdGFydDsgaSAtPSBkaW0pIGxhc3QgPSBpbnNlcnROb2RlKGksIGRhdGFbaV0sIGRhdGFbaSArIDFdLCBsYXN0KTtcbiAgICB9XG5cbiAgICBpZiAobGFzdCAmJiBlcXVhbHMobGFzdCwgbGFzdC5uZXh0KSkge1xuICAgICAgICByZW1vdmVOb2RlKGxhc3QpO1xuICAgICAgICBsYXN0ID0gbGFzdC5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBsYXN0O1xufVxuXG4vLyBlbGltaW5hdGUgY29saW5lYXIgb3IgZHVwbGljYXRlIHBvaW50c1xuZnVuY3Rpb24gZmlsdGVyUG9pbnRzKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoIXN0YXJ0KSByZXR1cm4gc3RhcnQ7XG4gICAgaWYgKCFlbmQpIGVuZCA9IHN0YXJ0O1xuXG4gICAgdmFyIHAgPSBzdGFydCxcbiAgICAgICAgYWdhaW47XG4gICAgZG8ge1xuICAgICAgICBhZ2FpbiA9IGZhbHNlO1xuXG4gICAgICAgIGlmICghcC5zdGVpbmVyICYmIChlcXVhbHMocCwgcC5uZXh0KSB8fCBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocCk7XG4gICAgICAgICAgICBwID0gZW5kID0gcC5wcmV2O1xuICAgICAgICAgICAgaWYgKHAgPT09IHAubmV4dCkgYnJlYWs7XG4gICAgICAgICAgICBhZ2FpbiA9IHRydWU7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAgPSBwLm5leHQ7XG4gICAgICAgIH1cbiAgICB9IHdoaWxlIChhZ2FpbiB8fCBwICE9PSBlbmQpO1xuXG4gICAgcmV0dXJuIGVuZDtcbn1cblxuLy8gbWFpbiBlYXIgc2xpY2luZyBsb29wIHdoaWNoIHRyaWFuZ3VsYXRlcyBhIHBvbHlnb24gKGdpdmVuIGFzIGEgbGlua2VkIGxpc3QpXG5mdW5jdGlvbiBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgcGFzcykge1xuICAgIGlmICghZWFyKSByZXR1cm47XG5cbiAgICAvLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXG4gICAgaWYgKCFwYXNzICYmIGludlNpemUpIGluZGV4Q3VydmUoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcblxuICAgIHZhciBzdG9wID0gZWFyLFxuICAgICAgICBwcmV2LCBuZXh0O1xuXG4gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGVhcnMsIHNsaWNpbmcgdGhlbSBvbmUgYnkgb25lXG4gICAgd2hpbGUgKGVhci5wcmV2ICE9PSBlYXIubmV4dCkge1xuICAgICAgICBwcmV2ID0gZWFyLnByZXY7XG4gICAgICAgIG5leHQgPSBlYXIubmV4dDtcblxuICAgICAgICBpZiAoaW52U2l6ZSA/IGlzRWFySGFzaGVkKGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSkgOiBpc0VhcihlYXIpKSB7XG4gICAgICAgICAgICAvLyBjdXQgb2ZmIHRoZSB0cmlhbmdsZVxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gocHJldi5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGVhci5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKG5leHQuaSAvIGRpbSk7XG5cbiAgICAgICAgICAgIHJlbW92ZU5vZGUoZWFyKTtcblxuICAgICAgICAgICAgLy8gc2tpcHBpbmcgdGhlIG5leHQgdmVydGljZSBsZWFkcyB0byBsZXNzIHNsaXZlciB0cmlhbmdsZXNcbiAgICAgICAgICAgIGVhciA9IG5leHQubmV4dDtcbiAgICAgICAgICAgIHN0b3AgPSBuZXh0Lm5leHQ7XG5cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZWFyID0gbmV4dDtcblxuICAgICAgICAvLyBpZiB3ZSBsb29wZWQgdGhyb3VnaCB0aGUgd2hvbGUgcmVtYWluaW5nIHBvbHlnb24gYW5kIGNhbid0IGZpbmQgYW55IG1vcmUgZWFyc1xuICAgICAgICBpZiAoZWFyID09PSBzdG9wKSB7XG4gICAgICAgICAgICAvLyB0cnkgZmlsdGVyaW5nIHBvaW50cyBhbmQgc2xpY2luZyBhZ2FpblxuICAgICAgICAgICAgaWYgKCFwYXNzKSB7XG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGZpbHRlclBvaW50cyhlYXIpLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMSk7XG5cbiAgICAgICAgICAgIC8vIGlmIHRoaXMgZGlkbid0IHdvcmssIHRyeSBjdXJpbmcgYWxsIHNtYWxsIHNlbGYtaW50ZXJzZWN0aW9ucyBsb2NhbGx5XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhc3MgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBlYXIgPSBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKGVhciwgdHJpYW5nbGVzLCBkaW0pO1xuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAyKTtcblxuICAgICAgICAgICAgLy8gYXMgYSBsYXN0IHJlc29ydCwgdHJ5IHNwbGl0dGluZyB0aGUgcmVtYWluaW5nIHBvbHlnb24gaW50byB0d29cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PT0gMikge1xuICAgICAgICAgICAgICAgIHNwbGl0RWFyY3V0KGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gY2hlY2sgd2hldGhlciBhIHBvbHlnb24gbm9kZSBmb3JtcyBhIHZhbGlkIGVhciB3aXRoIGFkamFjZW50IG5vZGVzXG5mdW5jdGlvbiBpc0VhcihlYXIpIHtcbiAgICB2YXIgYSA9IGVhci5wcmV2LFxuICAgICAgICBiID0gZWFyLFxuICAgICAgICBjID0gZWFyLm5leHQ7XG5cbiAgICBpZiAoYXJlYShhLCBiLCBjKSA+PSAwKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyXG5cbiAgICAvLyBub3cgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgb3RoZXIgcG9pbnRzIGluc2lkZSB0aGUgcG90ZW50aWFsIGVhclxuICAgIHZhciBwID0gZWFyLm5leHQubmV4dDtcblxuICAgIHdoaWxlIChwICE9PSBlYXIucHJldikge1xuICAgICAgICBpZiAocG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0Vhckhhc2hlZChlYXIsIG1pblgsIG1pblksIGludlNpemUpIHtcbiAgICB2YXIgYSA9IGVhci5wcmV2LFxuICAgICAgICBiID0gZWFyLFxuICAgICAgICBjID0gZWFyLm5leHQ7XG5cbiAgICBpZiAoYXJlYShhLCBiLCBjKSA+PSAwKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyXG5cbiAgICAvLyB0cmlhbmdsZSBiYm94OyBtaW4gJiBtYXggYXJlIGNhbGN1bGF0ZWQgbGlrZSB0aGlzIGZvciBzcGVlZFxuICAgIHZhciBtaW5UWCA9IGEueCA8IGIueCA/IChhLnggPCBjLnggPyBhLnggOiBjLngpIDogKGIueCA8IGMueCA/IGIueCA6IGMueCksXG4gICAgICAgIG1pblRZID0gYS55IDwgYi55ID8gKGEueSA8IGMueSA/IGEueSA6IGMueSkgOiAoYi55IDwgYy55ID8gYi55IDogYy55KSxcbiAgICAgICAgbWF4VFggPSBhLnggPiBiLnggPyAoYS54ID4gYy54ID8gYS54IDogYy54KSA6IChiLnggPiBjLnggPyBiLnggOiBjLngpLFxuICAgICAgICBtYXhUWSA9IGEueSA+IGIueSA/IChhLnkgPiBjLnkgPyBhLnkgOiBjLnkpIDogKGIueSA+IGMueSA/IGIueSA6IGMueSk7XG5cbiAgICAvLyB6LW9yZGVyIHJhbmdlIGZvciB0aGUgY3VycmVudCB0cmlhbmdsZSBiYm94O1xuICAgIHZhciBtaW5aID0gek9yZGVyKG1pblRYLCBtaW5UWSwgbWluWCwgbWluWSwgaW52U2l6ZSksXG4gICAgICAgIG1heFogPSB6T3JkZXIobWF4VFgsIG1heFRZLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcblxuICAgIHZhciBwID0gZWFyLnByZXZaLFxuICAgICAgICBuID0gZWFyLm5leHRaO1xuXG4gICAgLy8gbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgaW4gYm90aCBkaXJlY3Rpb25zXG4gICAgd2hpbGUgKHAgJiYgcC56ID49IG1pblogJiYgbiAmJiBuLnogPD0gbWF4Wikge1xuICAgICAgICBpZiAocCAhPT0gZWFyLnByZXYgJiYgcCAhPT0gZWFyLm5leHQgJiZcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAucHJldlo7XG5cbiAgICAgICAgaWYgKG4gIT09IGVhci5wcmV2ICYmIG4gIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgbi54LCBuLnkpICYmXG4gICAgICAgICAgICBhcmVhKG4ucHJldiwgbiwgbi5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIG4gPSBuLm5leHRaO1xuICAgIH1cblxuICAgIC8vIGxvb2sgZm9yIHJlbWFpbmluZyBwb2ludHMgaW4gZGVjcmVhc2luZyB6LW9yZGVyXG4gICAgd2hpbGUgKHAgJiYgcC56ID49IG1pblopIHtcbiAgICAgICAgaWYgKHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLnByZXZaO1xuICAgIH1cblxuICAgIC8vIGxvb2sgZm9yIHJlbWFpbmluZyBwb2ludHMgaW4gaW5jcmVhc2luZyB6LW9yZGVyXG4gICAgd2hpbGUgKG4gJiYgbi56IDw9IG1heFopIHtcbiAgICAgICAgaWYgKG4gIT09IGVhci5wcmV2ICYmIG4gIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgbi54LCBuLnkpICYmXG4gICAgICAgICAgICBhcmVhKG4ucHJldiwgbiwgbi5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIG4gPSBuLm5leHRaO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vLyBnbyB0aHJvdWdoIGFsbCBwb2x5Z29uIG5vZGVzIGFuZCBjdXJlIHNtYWxsIGxvY2FsIHNlbGYtaW50ZXJzZWN0aW9uc1xuZnVuY3Rpb24gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyhzdGFydCwgdHJpYW5nbGVzLCBkaW0pIHtcbiAgICB2YXIgcCA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgdmFyIGEgPSBwLnByZXYsXG4gICAgICAgICAgICBiID0gcC5uZXh0Lm5leHQ7XG5cbiAgICAgICAgaWYgKCFlcXVhbHMoYSwgYikgJiYgaW50ZXJzZWN0cyhhLCBwLCBwLm5leHQsIGIpICYmIGxvY2FsbHlJbnNpZGUoYSwgYikgJiYgbG9jYWxseUluc2lkZShiLCBhKSkge1xuXG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChhLmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gocC5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGIuaSAvIGRpbSk7XG5cbiAgICAgICAgICAgIC8vIHJlbW92ZSB0d28gbm9kZXMgaW52b2x2ZWRcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocCk7XG4gICAgICAgICAgICByZW1vdmVOb2RlKHAubmV4dCk7XG5cbiAgICAgICAgICAgIHAgPSBzdGFydCA9IGI7XG4gICAgICAgIH1cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XG5cbiAgICByZXR1cm4gcDtcbn1cblxuLy8gdHJ5IHNwbGl0dGluZyBwb2x5Z29uIGludG8gdHdvIGFuZCB0cmlhbmd1bGF0ZSB0aGVtIGluZGVwZW5kZW50bHlcbmZ1bmN0aW9uIHNwbGl0RWFyY3V0KHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSkge1xuICAgIC8vIGxvb2sgZm9yIGEgdmFsaWQgZGlhZ29uYWwgdGhhdCBkaXZpZGVzIHRoZSBwb2x5Z29uIGludG8gdHdvXG4gICAgdmFyIGEgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBiID0gYS5uZXh0Lm5leHQ7XG4gICAgICAgIHdoaWxlIChiICE9PSBhLnByZXYpIHtcbiAgICAgICAgICAgIGlmIChhLmkgIT09IGIuaSAmJiBpc1ZhbGlkRGlhZ29uYWwoYSwgYikpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGxpdCB0aGUgcG9seWdvbiBpbiB0d28gYnkgdGhlIGRpYWdvbmFsXG4gICAgICAgICAgICAgICAgdmFyIGMgPSBzcGxpdFBvbHlnb24oYSwgYik7XG5cbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgY29saW5lYXIgcG9pbnRzIGFyb3VuZCB0aGUgY3V0c1xuICAgICAgICAgICAgICAgIGEgPSBmaWx0ZXJQb2ludHMoYSwgYS5uZXh0KTtcbiAgICAgICAgICAgICAgICBjID0gZmlsdGVyUG9pbnRzKGMsIGMubmV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBydW4gZWFyY3V0IG9uIGVhY2ggaGFsZlxuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChhLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGMsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiID0gYi5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIGEgPSBhLm5leHQ7XG4gICAgfSB3aGlsZSAoYSAhPT0gc3RhcnQpO1xufVxuXG4vLyBsaW5rIGV2ZXJ5IGhvbGUgaW50byB0aGUgb3V0ZXIgbG9vcCwgcHJvZHVjaW5nIGEgc2luZ2xlLXJpbmcgcG9seWdvbiB3aXRob3V0IGhvbGVzXG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pIHtcbiAgICB2YXIgcXVldWUgPSBbXSxcbiAgICAgICAgaSwgbGVuLCBzdGFydCwgZW5kLCBsaXN0O1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcbiAgICAgICAgZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1tpICsgMV0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcbiAgICAgICAgbGlzdCA9IGxpbmtlZExpc3QoZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBmYWxzZSk7XG4gICAgICAgIGlmIChsaXN0ID09PSBsaXN0Lm5leHQpIGxpc3Quc3RlaW5lciA9IHRydWU7XG4gICAgICAgIHF1ZXVlLnB1c2goZ2V0TGVmdG1vc3QobGlzdCkpO1xuICAgIH1cblxuICAgIHF1ZXVlLnNvcnQoY29tcGFyZVgpO1xuXG4gICAgLy8gcHJvY2VzcyBob2xlcyBmcm9tIGxlZnQgdG8gcmlnaHRcbiAgICBmb3IgKGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZWxpbWluYXRlSG9sZShxdWV1ZVtpXSwgb3V0ZXJOb2RlKTtcbiAgICAgICAgb3V0ZXJOb2RlID0gZmlsdGVyUG9pbnRzKG91dGVyTm9kZSwgb3V0ZXJOb2RlLm5leHQpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRlck5vZGU7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVYKGEsIGIpIHtcbiAgICByZXR1cm4gYS54IC0gYi54O1xufVxuXG4vLyBmaW5kIGEgYnJpZGdlIGJldHdlZW4gdmVydGljZXMgdGhhdCBjb25uZWN0cyBob2xlIHdpdGggYW4gb3V0ZXIgcmluZyBhbmQgYW5kIGxpbmsgaXRcbmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGUoaG9sZSwgb3V0ZXJOb2RlKSB7XG4gICAgb3V0ZXJOb2RlID0gZmluZEhvbGVCcmlkZ2UoaG9sZSwgb3V0ZXJOb2RlKTtcbiAgICBpZiAob3V0ZXJOb2RlKSB7XG4gICAgICAgIHZhciBiID0gc3BsaXRQb2x5Z29uKG91dGVyTm9kZSwgaG9sZSk7XG4gICAgICAgIGZpbHRlclBvaW50cyhiLCBiLm5leHQpO1xuICAgIH1cbn1cblxuLy8gRGF2aWQgRWJlcmx5J3MgYWxnb3JpdGhtIGZvciBmaW5kaW5nIGEgYnJpZGdlIGJldHdlZW4gaG9sZSBhbmQgb3V0ZXIgcG9seWdvblxuZnVuY3Rpb24gZmluZEhvbGVCcmlkZ2UoaG9sZSwgb3V0ZXJOb2RlKSB7XG4gICAgdmFyIHAgPSBvdXRlck5vZGUsXG4gICAgICAgIGh4ID0gaG9sZS54LFxuICAgICAgICBoeSA9IGhvbGUueSxcbiAgICAgICAgcXggPSAtSW5maW5pdHksXG4gICAgICAgIG07XG5cbiAgICAvLyBmaW5kIGEgc2VnbWVudCBpbnRlcnNlY3RlZCBieSBhIHJheSBmcm9tIHRoZSBob2xlJ3MgbGVmdG1vc3QgcG9pbnQgdG8gdGhlIGxlZnQ7XG4gICAgLy8gc2VnbWVudCdzIGVuZHBvaW50IHdpdGggbGVzc2VyIHggd2lsbCBiZSBwb3RlbnRpYWwgY29ubmVjdGlvbiBwb2ludFxuICAgIGRvIHtcbiAgICAgICAgaWYgKGh5IDw9IHAueSAmJiBoeSA+PSBwLm5leHQueSAmJiBwLm5leHQueSAhPT0gcC55KSB7XG4gICAgICAgICAgICB2YXIgeCA9IHAueCArIChoeSAtIHAueSkgKiAocC5uZXh0LnggLSBwLngpIC8gKHAubmV4dC55IC0gcC55KTtcbiAgICAgICAgICAgIGlmICh4IDw9IGh4ICYmIHggPiBxeCkge1xuICAgICAgICAgICAgICAgIHF4ID0geDtcbiAgICAgICAgICAgICAgICBpZiAoeCA9PT0gaHgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh5ID09PSBwLnkpIHJldHVybiBwO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaHkgPT09IHAubmV4dC55KSByZXR1cm4gcC5uZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtID0gcC54IDwgcC5uZXh0LnggPyBwIDogcC5uZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gb3V0ZXJOb2RlKTtcblxuICAgIGlmICghbSkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoaHggPT09IHF4KSByZXR1cm4gbS5wcmV2OyAvLyBob2xlIHRvdWNoZXMgb3V0ZXIgc2VnbWVudDsgcGljayBsb3dlciBlbmRwb2ludFxuXG4gICAgLy8gbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgb2YgaG9sZSBwb2ludCwgc2VnbWVudCBpbnRlcnNlY3Rpb24gYW5kIGVuZHBvaW50O1xuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBwb2ludHMgZm91bmQsIHdlIGhhdmUgYSB2YWxpZCBjb25uZWN0aW9uO1xuICAgIC8vIG90aGVyd2lzZSBjaG9vc2UgdGhlIHBvaW50IG9mIHRoZSBtaW5pbXVtIGFuZ2xlIHdpdGggdGhlIHJheSBhcyBjb25uZWN0aW9uIHBvaW50XG5cbiAgICB2YXIgc3RvcCA9IG0sXG4gICAgICAgIG14ID0gbS54LFxuICAgICAgICBteSA9IG0ueSxcbiAgICAgICAgdGFuTWluID0gSW5maW5pdHksXG4gICAgICAgIHRhbjtcblxuICAgIHAgPSBtLm5leHQ7XG5cbiAgICB3aGlsZSAocCAhPT0gc3RvcCkge1xuICAgICAgICBpZiAoaHggPj0gcC54ICYmIHAueCA+PSBteCAmJiBoeCAhPT0gcC54ICYmXG4gICAgICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGh5IDwgbXkgPyBoeCA6IHF4LCBoeSwgbXgsIG15LCBoeSA8IG15ID8gcXggOiBoeCwgaHksIHAueCwgcC55KSkge1xuXG4gICAgICAgICAgICB0YW4gPSBNYXRoLmFicyhoeSAtIHAueSkgLyAoaHggLSBwLngpOyAvLyB0YW5nZW50aWFsXG5cbiAgICAgICAgICAgIGlmICgodGFuIDwgdGFuTWluIHx8ICh0YW4gPT09IHRhbk1pbiAmJiBwLnggPiBtLngpKSAmJiBsb2NhbGx5SW5zaWRlKHAsIGhvbGUpKSB7XG4gICAgICAgICAgICAgICAgbSA9IHA7XG4gICAgICAgICAgICAgICAgdGFuTWluID0gdGFuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gbTtcbn1cblxuLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxuZnVuY3Rpb24gaW5kZXhDdXJ2ZShzdGFydCwgbWluWCwgbWluWSwgaW52U2l6ZSkge1xuICAgIHZhciBwID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC56ID09PSBudWxsKSBwLnogPSB6T3JkZXIocC54LCBwLnksIG1pblgsIG1pblksIGludlNpemUpO1xuICAgICAgICBwLnByZXZaID0gcC5wcmV2O1xuICAgICAgICBwLm5leHRaID0gcC5uZXh0O1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcblxuICAgIHAucHJldloubmV4dFogPSBudWxsO1xuICAgIHAucHJldlogPSBudWxsO1xuXG4gICAgc29ydExpbmtlZChwKTtcbn1cblxuLy8gU2ltb24gVGF0aGFtJ3MgbGlua2VkIGxpc3QgbWVyZ2Ugc29ydCBhbGdvcml0aG1cbi8vIGh0dHA6Ly93d3cuY2hpYXJrLmdyZWVuZW5kLm9yZy51ay9+c2d0YXRoYW0vYWxnb3JpdGhtcy9saXN0c29ydC5odG1sXG5mdW5jdGlvbiBzb3J0TGlua2VkKGxpc3QpIHtcbiAgICB2YXIgaSwgcCwgcSwgZSwgdGFpbCwgbnVtTWVyZ2VzLCBwU2l6ZSwgcVNpemUsXG4gICAgICAgIGluU2l6ZSA9IDE7XG5cbiAgICBkbyB7XG4gICAgICAgIHAgPSBsaXN0O1xuICAgICAgICBsaXN0ID0gbnVsbDtcbiAgICAgICAgdGFpbCA9IG51bGw7XG4gICAgICAgIG51bU1lcmdlcyA9IDA7XG5cbiAgICAgICAgd2hpbGUgKHApIHtcbiAgICAgICAgICAgIG51bU1lcmdlcysrO1xuICAgICAgICAgICAgcSA9IHA7XG4gICAgICAgICAgICBwU2l6ZSA9IDA7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5TaXplOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwU2l6ZSsrO1xuICAgICAgICAgICAgICAgIHEgPSBxLm5leHRaO1xuICAgICAgICAgICAgICAgIGlmICghcSkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxU2l6ZSA9IGluU2l6ZTtcblxuICAgICAgICAgICAgd2hpbGUgKHBTaXplID4gMCB8fCAocVNpemUgPiAwICYmIHEpKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAocFNpemUgIT09IDAgJiYgKHFTaXplID09PSAwIHx8ICFxIHx8IHAueiA8PSBxLnopKSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBwO1xuICAgICAgICAgICAgICAgICAgICBwID0gcC5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcFNpemUtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlID0gcTtcbiAgICAgICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHFTaXplLS07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRhaWwpIHRhaWwubmV4dFogPSBlO1xuICAgICAgICAgICAgICAgIGVsc2UgbGlzdCA9IGU7XG5cbiAgICAgICAgICAgICAgICBlLnByZXZaID0gdGFpbDtcbiAgICAgICAgICAgICAgICB0YWlsID0gZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcCA9IHE7XG4gICAgICAgIH1cblxuICAgICAgICB0YWlsLm5leHRaID0gbnVsbDtcbiAgICAgICAgaW5TaXplICo9IDI7XG5cbiAgICB9IHdoaWxlIChudW1NZXJnZXMgPiAxKTtcblxuICAgIHJldHVybiBsaXN0O1xufVxuXG4vLyB6LW9yZGVyIG9mIGEgcG9pbnQgZ2l2ZW4gY29vcmRzIGFuZCBpbnZlcnNlIG9mIHRoZSBsb25nZXIgc2lkZSBvZiBkYXRhIGJib3hcbmZ1bmN0aW9uIHpPcmRlcih4LCB5LCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XG4gICAgLy8gY29vcmRzIGFyZSB0cmFuc2Zvcm1lZCBpbnRvIG5vbi1uZWdhdGl2ZSAxNS1iaXQgaW50ZWdlciByYW5nZVxuICAgIHggPSAzMjc2NyAqICh4IC0gbWluWCkgKiBpbnZTaXplO1xuICAgIHkgPSAzMjc2NyAqICh5IC0gbWluWSkgKiBpbnZTaXplO1xuXG4gICAgeCA9ICh4IHwgKHggPDwgOCkpICYgMHgwMEZGMDBGRjtcbiAgICB4ID0gKHggfCAoeCA8PCA0KSkgJiAweDBGMEYwRjBGO1xuICAgIHggPSAoeCB8ICh4IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gICAgeCA9ICh4IHwgKHggPDwgMSkpICYgMHg1NTU1NTU1NTtcblxuICAgIHkgPSAoeSB8ICh5IDw8IDgpKSAmIDB4MDBGRjAwRkY7XG4gICAgeSA9ICh5IHwgKHkgPDwgNCkpICYgMHgwRjBGMEYwRjtcbiAgICB5ID0gKHkgfCAoeSA8PCAyKSkgJiAweDMzMzMzMzMzO1xuICAgIHkgPSAoeSB8ICh5IDw8IDEpKSAmIDB4NTU1NTU1NTU7XG5cbiAgICByZXR1cm4geCB8ICh5IDw8IDEpO1xufVxuXG4vLyBmaW5kIHRoZSBsZWZ0bW9zdCBub2RlIG9mIGEgcG9seWdvbiByaW5nXG5mdW5jdGlvbiBnZXRMZWZ0bW9zdChzdGFydCkge1xuICAgIHZhciBwID0gc3RhcnQsXG4gICAgICAgIGxlZnRtb3N0ID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC54IDwgbGVmdG1vc3QueCkgbGVmdG1vc3QgPSBwO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcblxuICAgIHJldHVybiBsZWZ0bW9zdDtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2ludCBsaWVzIHdpdGhpbiBhIGNvbnZleCB0cmlhbmdsZVxuZnVuY3Rpb24gcG9pbnRJblRyaWFuZ2xlKGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHB4LCBweSkge1xuICAgIHJldHVybiAoY3ggLSBweCkgKiAoYXkgLSBweSkgLSAoYXggLSBweCkgKiAoY3kgLSBweSkgPj0gMCAmJlxuICAgICAgICAgICAoYXggLSBweCkgKiAoYnkgLSBweSkgLSAoYnggLSBweCkgKiAoYXkgLSBweSkgPj0gMCAmJlxuICAgICAgICAgICAoYnggLSBweCkgKiAoY3kgLSBweSkgLSAoY3ggLSBweCkgKiAoYnkgLSBweSkgPj0gMDtcbn1cblxuLy8gY2hlY2sgaWYgYSBkaWFnb25hbCBiZXR3ZWVuIHR3byBwb2x5Z29uIG5vZGVzIGlzIHZhbGlkIChsaWVzIGluIHBvbHlnb24gaW50ZXJpb3IpXG5mdW5jdGlvbiBpc1ZhbGlkRGlhZ29uYWwoYSwgYikge1xuICAgIHJldHVybiBhLm5leHQuaSAhPT0gYi5pICYmIGEucHJldi5pICE9PSBiLmkgJiYgIWludGVyc2VjdHNQb2x5Z29uKGEsIGIpICYmXG4gICAgICAgICAgIGxvY2FsbHlJbnNpZGUoYSwgYikgJiYgbG9jYWxseUluc2lkZShiLCBhKSAmJiBtaWRkbGVJbnNpZGUoYSwgYik7XG59XG5cbi8vIHNpZ25lZCBhcmVhIG9mIGEgdHJpYW5nbGVcbmZ1bmN0aW9uIGFyZWEocCwgcSwgcikge1xuICAgIHJldHVybiAocS55IC0gcC55KSAqIChyLnggLSBxLngpIC0gKHEueCAtIHAueCkgKiAoci55IC0gcS55KTtcbn1cblxuLy8gY2hlY2sgaWYgdHdvIHBvaW50cyBhcmUgZXF1YWxcbmZ1bmN0aW9uIGVxdWFscyhwMSwgcDIpIHtcbiAgICByZXR1cm4gcDEueCA9PT0gcDIueCAmJiBwMS55ID09PSBwMi55O1xufVxuXG4vLyBjaGVjayBpZiB0d28gc2VnbWVudHMgaW50ZXJzZWN0XG5mdW5jdGlvbiBpbnRlcnNlY3RzKHAxLCBxMSwgcDIsIHEyKSB7XG4gICAgaWYgKChlcXVhbHMocDEsIHExKSAmJiBlcXVhbHMocDIsIHEyKSkgfHxcbiAgICAgICAgKGVxdWFscyhwMSwgcTIpICYmIGVxdWFscyhwMiwgcTEpKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGFyZWEocDEsIHExLCBwMikgPiAwICE9PSBhcmVhKHAxLCBxMSwgcTIpID4gMCAmJlxuICAgICAgICAgICBhcmVhKHAyLCBxMiwgcDEpID4gMCAhPT0gYXJlYShwMiwgcTIsIHExKSA+IDA7XG59XG5cbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpbnRlcnNlY3RzIGFueSBwb2x5Z29uIHNlZ21lbnRzXG5mdW5jdGlvbiBpbnRlcnNlY3RzUG9seWdvbihhLCBiKSB7XG4gICAgdmFyIHAgPSBhO1xuICAgIGRvIHtcbiAgICAgICAgaWYgKHAuaSAhPT0gYS5pICYmIHAubmV4dC5pICE9PSBhLmkgJiYgcC5pICE9PSBiLmkgJiYgcC5uZXh0LmkgIT09IGIuaSAmJlxuICAgICAgICAgICAgICAgIGludGVyc2VjdHMocCwgcC5uZXh0LCBhLCBiKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gYSk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpcyBsb2NhbGx5IGluc2lkZSB0aGUgcG9seWdvblxuZnVuY3Rpb24gbG9jYWxseUluc2lkZShhLCBiKSB7XG4gICAgcmV0dXJuIGFyZWEoYS5wcmV2LCBhLCBhLm5leHQpIDwgMCA/XG4gICAgICAgIGFyZWEoYSwgYiwgYS5uZXh0KSA+PSAwICYmIGFyZWEoYSwgYS5wcmV2LCBiKSA+PSAwIDpcbiAgICAgICAgYXJlYShhLCBiLCBhLnByZXYpIDwgMCB8fCBhcmVhKGEsIGEubmV4dCwgYikgPCAwO1xufVxuXG4vLyBjaGVjayBpZiB0aGUgbWlkZGxlIHBvaW50IG9mIGEgcG9seWdvbiBkaWFnb25hbCBpcyBpbnNpZGUgdGhlIHBvbHlnb25cbmZ1bmN0aW9uIG1pZGRsZUluc2lkZShhLCBiKSB7XG4gICAgdmFyIHAgPSBhLFxuICAgICAgICBpbnNpZGUgPSBmYWxzZSxcbiAgICAgICAgcHggPSAoYS54ICsgYi54KSAvIDIsXG4gICAgICAgIHB5ID0gKGEueSArIGIueSkgLyAyO1xuICAgIGRvIHtcbiAgICAgICAgaWYgKCgocC55ID4gcHkpICE9PSAocC5uZXh0LnkgPiBweSkpICYmIHAubmV4dC55ICE9PSBwLnkgJiZcbiAgICAgICAgICAgICAgICAocHggPCAocC5uZXh0LnggLSBwLngpICogKHB5IC0gcC55KSAvIChwLm5leHQueSAtIHAueSkgKyBwLngpKVxuICAgICAgICAgICAgaW5zaWRlID0gIWluc2lkZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBhKTtcblxuICAgIHJldHVybiBpbnNpZGU7XG59XG5cbi8vIGxpbmsgdHdvIHBvbHlnb24gdmVydGljZXMgd2l0aCBhIGJyaWRnZTsgaWYgdGhlIHZlcnRpY2VzIGJlbG9uZyB0byB0aGUgc2FtZSByaW5nLCBpdCBzcGxpdHMgcG9seWdvbiBpbnRvIHR3bztcbi8vIGlmIG9uZSBiZWxvbmdzIHRvIHRoZSBvdXRlciByaW5nIGFuZCBhbm90aGVyIHRvIGEgaG9sZSwgaXQgbWVyZ2VzIGl0IGludG8gYSBzaW5nbGUgcmluZ1xuZnVuY3Rpb24gc3BsaXRQb2x5Z29uKGEsIGIpIHtcbiAgICB2YXIgYTIgPSBuZXcgTm9kZShhLmksIGEueCwgYS55KSxcbiAgICAgICAgYjIgPSBuZXcgTm9kZShiLmksIGIueCwgYi55KSxcbiAgICAgICAgYW4gPSBhLm5leHQsXG4gICAgICAgIGJwID0gYi5wcmV2O1xuXG4gICAgYS5uZXh0ID0gYjtcbiAgICBiLnByZXYgPSBhO1xuXG4gICAgYTIubmV4dCA9IGFuO1xuICAgIGFuLnByZXYgPSBhMjtcblxuICAgIGIyLm5leHQgPSBhMjtcbiAgICBhMi5wcmV2ID0gYjI7XG5cbiAgICBicC5uZXh0ID0gYjI7XG4gICAgYjIucHJldiA9IGJwO1xuXG4gICAgcmV0dXJuIGIyO1xufVxuXG4vLyBjcmVhdGUgYSBub2RlIGFuZCBvcHRpb25hbGx5IGxpbmsgaXQgd2l0aCBwcmV2aW91cyBvbmUgKGluIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0KVxuZnVuY3Rpb24gaW5zZXJ0Tm9kZShpLCB4LCB5LCBsYXN0KSB7XG4gICAgdmFyIHAgPSBuZXcgTm9kZShpLCB4LCB5KTtcblxuICAgIGlmICghbGFzdCkge1xuICAgICAgICBwLnByZXYgPSBwO1xuICAgICAgICBwLm5leHQgPSBwO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgcC5uZXh0ID0gbGFzdC5uZXh0O1xuICAgICAgICBwLnByZXYgPSBsYXN0O1xuICAgICAgICBsYXN0Lm5leHQucHJldiA9IHA7XG4gICAgICAgIGxhc3QubmV4dCA9IHA7XG4gICAgfVxuICAgIHJldHVybiBwO1xufVxuXG5mdW5jdGlvbiByZW1vdmVOb2RlKHApIHtcbiAgICBwLm5leHQucHJldiA9IHAucHJldjtcbiAgICBwLnByZXYubmV4dCA9IHAubmV4dDtcblxuICAgIGlmIChwLnByZXZaKSBwLnByZXZaLm5leHRaID0gcC5uZXh0WjtcbiAgICBpZiAocC5uZXh0WikgcC5uZXh0Wi5wcmV2WiA9IHAucHJldlo7XG59XG5cbmZ1bmN0aW9uIE5vZGUoaSwgeCwgeSkge1xuICAgIC8vIHZlcnRpY2UgaW5kZXggaW4gY29vcmRpbmF0ZXMgYXJyYXlcbiAgICB0aGlzLmkgPSBpO1xuXG4gICAgLy8gdmVydGV4IGNvb3JkaW5hdGVzXG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuXG4gICAgLy8gcHJldmlvdXMgYW5kIG5leHQgdmVydGljZSBub2RlcyBpbiBhIHBvbHlnb24gcmluZ1xuICAgIHRoaXMucHJldiA9IG51bGw7XG4gICAgdGhpcy5uZXh0ID0gbnVsbDtcblxuICAgIC8vIHotb3JkZXIgY3VydmUgdmFsdWVcbiAgICB0aGlzLnogPSBudWxsO1xuXG4gICAgLy8gcHJldmlvdXMgYW5kIG5leHQgbm9kZXMgaW4gei1vcmRlclxuICAgIHRoaXMucHJldlogPSBudWxsO1xuICAgIHRoaXMubmV4dFogPSBudWxsO1xuXG4gICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhIHN0ZWluZXIgcG9pbnRcbiAgICB0aGlzLnN0ZWluZXIgPSBmYWxzZTtcbn1cblxuLy8gcmV0dXJuIGEgcGVyY2VudGFnZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBvbHlnb24gYXJlYSBhbmQgaXRzIHRyaWFuZ3VsYXRpb24gYXJlYTtcbi8vIHVzZWQgdG8gdmVyaWZ5IGNvcnJlY3RuZXNzIG9mIHRyaWFuZ3VsYXRpb25cbmVhcmN1dC5kZXZpYXRpb24gPSBmdW5jdGlvbiAoZGF0YSwgaG9sZUluZGljZXMsIGRpbSwgdHJpYW5nbGVzKSB7XG4gICAgdmFyIGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoO1xuICAgIHZhciBvdXRlckxlbiA9IGhhc0hvbGVzID8gaG9sZUluZGljZXNbMF0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcblxuICAgIHZhciBwb2x5Z29uQXJlYSA9IE1hdGguYWJzKHNpZ25lZEFyZWEoZGF0YSwgMCwgb3V0ZXJMZW4sIGRpbSkpO1xuICAgIGlmIChoYXNIb2xlcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IGhvbGVJbmRpY2VzW2ldICogZGltO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGkgPCBsZW4gLSAxID8gaG9sZUluZGljZXNbaSArIDFdICogZGltIDogZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICBwb2x5Z29uQXJlYSAtPSBNYXRoLmFicyhzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHRyaWFuZ2xlc0FyZWEgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0cmlhbmdsZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgdmFyIGEgPSB0cmlhbmdsZXNbaV0gKiBkaW07XG4gICAgICAgIHZhciBiID0gdHJpYW5nbGVzW2kgKyAxXSAqIGRpbTtcbiAgICAgICAgdmFyIGMgPSB0cmlhbmdsZXNbaSArIDJdICogZGltO1xuICAgICAgICB0cmlhbmdsZXNBcmVhICs9IE1hdGguYWJzKFxuICAgICAgICAgICAgKGRhdGFbYV0gLSBkYXRhW2NdKSAqIChkYXRhW2IgKyAxXSAtIGRhdGFbYSArIDFdKSAtXG4gICAgICAgICAgICAoZGF0YVthXSAtIGRhdGFbYl0pICogKGRhdGFbYyArIDFdIC0gZGF0YVthICsgMV0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9seWdvbkFyZWEgPT09IDAgJiYgdHJpYW5nbGVzQXJlYSA9PT0gMCA/IDAgOlxuICAgICAgICBNYXRoLmFicygodHJpYW5nbGVzQXJlYSAtIHBvbHlnb25BcmVhKSAvIHBvbHlnb25BcmVhKTtcbn07XG5cbmZ1bmN0aW9uIHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSB7XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0LCBqID0gZW5kIC0gZGltOyBpIDwgZW5kOyBpICs9IGRpbSkge1xuICAgICAgICBzdW0gKz0gKGRhdGFbal0gLSBkYXRhW2ldKSAqIChkYXRhW2kgKyAxXSArIGRhdGFbaiArIDFdKTtcbiAgICAgICAgaiA9IGk7XG4gICAgfVxuICAgIHJldHVybiBzdW07XG59XG5cbi8vIHR1cm4gYSBwb2x5Z29uIGluIGEgbXVsdGktZGltZW5zaW9uYWwgYXJyYXkgZm9ybSAoZS5nLiBhcyBpbiBHZW9KU09OKSBpbnRvIGEgZm9ybSBFYXJjdXQgYWNjZXB0c1xuZWFyY3V0LmZsYXR0ZW4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciBkaW0gPSBkYXRhWzBdWzBdLmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0ge3ZlcnRpY2VzOiBbXSwgaG9sZXM6IFtdLCBkaW1lbnNpb25zOiBkaW19LFxuICAgICAgICBob2xlSW5kZXggPSAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGF0YVtpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCBkaW07IGQrKykgcmVzdWx0LnZlcnRpY2VzLnB1c2goZGF0YVtpXVtqXVtkXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBob2xlSW5kZXggKz0gZGF0YVtpIC0gMV0ubGVuZ3RoO1xuICAgICAgICAgICAgcmVzdWx0LmhvbGVzLnB1c2goaG9sZUluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbiIsInZhciBnZW9qc29uQXJlYSA9IHJlcXVpcmUoJ0BtYXBib3gvZ2VvanNvbi1hcmVhJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmV3aW5kO1xuXG5mdW5jdGlvbiByZXdpbmQoZ2osIG91dGVyKSB7XG4gICAgc3dpdGNoICgoZ2ogJiYgZ2oudHlwZSkgfHwgbnVsbCkge1xuICAgICAgICBjYXNlICdGZWF0dXJlQ29sbGVjdGlvbic6XG4gICAgICAgICAgICBnai5mZWF0dXJlcyA9IGdqLmZlYXR1cmVzLm1hcChjdXJyeU91dGVyKHJld2luZCwgb3V0ZXIpKTtcbiAgICAgICAgICAgIHJldHVybiBnajtcbiAgICAgICAgY2FzZSAnRmVhdHVyZSc6XG4gICAgICAgICAgICBnai5nZW9tZXRyeSA9IHJld2luZChnai5nZW9tZXRyeSwgb3V0ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIGdqO1xuICAgICAgICBjYXNlICdQb2x5Z29uJzpcbiAgICAgICAgY2FzZSAnTXVsdGlQb2x5Z29uJzpcbiAgICAgICAgICAgIHJldHVybiBjb3JyZWN0KGdqLCBvdXRlcik7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZ2o7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjdXJyeU91dGVyKGEsIGIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oXykgeyByZXR1cm4gYShfLCBiKTsgfTtcbn1cblxuZnVuY3Rpb24gY29ycmVjdChfLCBvdXRlcikge1xuICAgIGlmIChfLnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICBfLmNvb3JkaW5hdGVzID0gY29ycmVjdFJpbmdzKF8uY29vcmRpbmF0ZXMsIG91dGVyKTtcbiAgICB9IGVsc2UgaWYgKF8udHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgXy5jb29yZGluYXRlcyA9IF8uY29vcmRpbmF0ZXMubWFwKGN1cnJ5T3V0ZXIoY29ycmVjdFJpbmdzLCBvdXRlcikpO1xuICAgIH1cbiAgICByZXR1cm4gXztcbn1cblxuZnVuY3Rpb24gY29ycmVjdFJpbmdzKF8sIG91dGVyKSB7XG4gICAgb3V0ZXIgPSAhIW91dGVyO1xuICAgIF9bMF0gPSB3aW5kKF9bMF0sIG91dGVyKTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IF8ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgX1tpXSA9IHdpbmQoX1tpXSwgIW91dGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIF87XG59XG5cbmZ1bmN0aW9uIHdpbmQoXywgZGlyKSB7XG4gICAgcmV0dXJuIGN3KF8pID09PSBkaXIgPyBfIDogXy5yZXZlcnNlKCk7XG59XG5cbmZ1bmN0aW9uIGN3KF8pIHtcbiAgICByZXR1cm4gZ2VvanNvbkFyZWEucmluZyhfKSA+PSAwO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsaXA7XG5cbnZhciBjcmVhdGVGZWF0dXJlID0gcmVxdWlyZSgnLi9mZWF0dXJlJyk7XG5cbi8qIGNsaXAgZmVhdHVyZXMgYmV0d2VlbiB0d28gYXhpcy1wYXJhbGxlbCBsaW5lczpcbiAqICAgICB8ICAgICAgICB8XG4gKiAgX19ffF9fXyAgICAgfCAgICAgL1xuICogLyAgIHwgICBcXF9fX198X19fXy9cbiAqICAgICB8ICAgICAgICB8XG4gKi9cblxuZnVuY3Rpb24gY2xpcChmZWF0dXJlcywgc2NhbGUsIGsxLCBrMiwgYXhpcywgbWluQWxsLCBtYXhBbGwpIHtcblxuICAgIGsxIC89IHNjYWxlO1xuICAgIGsyIC89IHNjYWxlO1xuXG4gICAgaWYgKG1pbkFsbCA+PSBrMSAmJiBtYXhBbGwgPD0gazIpIHJldHVybiBmZWF0dXJlczsgLy8gdHJpdmlhbCBhY2NlcHRcbiAgICBlbHNlIGlmIChtaW5BbGwgPiBrMiB8fCBtYXhBbGwgPCBrMSkgcmV0dXJuIG51bGw7IC8vIHRyaXZpYWwgcmVqZWN0XG5cbiAgICB2YXIgY2xpcHBlZCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbaV07XG4gICAgICAgIHZhciBnZW9tZXRyeSA9IGZlYXR1cmUuZ2VvbWV0cnk7XG4gICAgICAgIHZhciB0eXBlID0gZmVhdHVyZS50eXBlO1xuXG4gICAgICAgIHZhciBtaW4gPSBheGlzID09PSAwID8gZmVhdHVyZS5taW5YIDogZmVhdHVyZS5taW5ZO1xuICAgICAgICB2YXIgbWF4ID0gYXhpcyA9PT0gMCA/IGZlYXR1cmUubWF4WCA6IGZlYXR1cmUubWF4WTtcblxuICAgICAgICBpZiAobWluID49IGsxICYmIG1heCA8PSBrMikgeyAvLyB0cml2aWFsIGFjY2VwdFxuICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGZlYXR1cmUpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWluID4gazIgfHwgbWF4IDwgazEpIHsgLy8gdHJpdmlhbCByZWplY3RcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5ld0dlb21ldHJ5ID0gW107XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICdQb2ludCcgfHwgdHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgICAgICBjbGlwUG9pbnRzKGdlb21ldHJ5LCBuZXdHZW9tZXRyeSwgazEsIGsyLCBheGlzKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgY2xpcExpbmUoZ2VvbWV0cnksIG5ld0dlb21ldHJ5LCBrMSwgazIsIGF4aXMsIGZhbHNlKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICBjbGlwTGluZXMoZ2VvbWV0cnksIG5ld0dlb21ldHJ5LCBrMSwgazIsIGF4aXMsIGZhbHNlKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgY2xpcExpbmVzKGdlb21ldHJ5LCBuZXdHZW9tZXRyeSwgazEsIGsyLCBheGlzLCB0cnVlKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGdlb21ldHJ5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBvbHlnb24gPSBbXTtcbiAgICAgICAgICAgICAgICBjbGlwTGluZXMoZ2VvbWV0cnlbal0sIHBvbHlnb24sIGsxLCBrMiwgYXhpcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHBvbHlnb24ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0dlb21ldHJ5LnB1c2gocG9seWdvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld0dlb21ldHJ5Lmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJyB8fCB0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlmIChuZXdHZW9tZXRyeS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICdMaW5lU3RyaW5nJztcbiAgICAgICAgICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBuZXdHZW9tZXRyeVswXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ011bHRpTGluZVN0cmluZyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdQb2ludCcgfHwgdHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgICAgICAgICAgdHlwZSA9IG5ld0dlb21ldHJ5Lmxlbmd0aCA9PT0gMyA/ICdQb2ludCcgOiAnTXVsdGlQb2ludCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsaXBwZWQucHVzaChjcmVhdGVGZWF0dXJlKGZlYXR1cmUuaWQsIHR5cGUsIG5ld0dlb21ldHJ5LCBmZWF0dXJlLnRhZ3MpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbGlwcGVkLmxlbmd0aCA/IGNsaXBwZWQgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBjbGlwUG9pbnRzKGdlb20sIG5ld0dlb20sIGsxLCBrMiwgYXhpcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICB2YXIgYSA9IGdlb21baSArIGF4aXNdO1xuXG4gICAgICAgIGlmIChhID49IGsxICYmIGEgPD0gazIpIHtcbiAgICAgICAgICAgIG5ld0dlb20ucHVzaChnZW9tW2ldKTtcbiAgICAgICAgICAgIG5ld0dlb20ucHVzaChnZW9tW2kgKyAxXSk7XG4gICAgICAgICAgICBuZXdHZW9tLnB1c2goZ2VvbVtpICsgMl0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjbGlwTGluZShnZW9tLCBuZXdHZW9tLCBrMSwgazIsIGF4aXMsIGlzUG9seWdvbikge1xuXG4gICAgdmFyIHNsaWNlID0gW107XG4gICAgdmFyIGludGVyc2VjdCA9IGF4aXMgPT09IDAgPyBpbnRlcnNlY3RYIDogaW50ZXJzZWN0WTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGggLSAzOyBpICs9IDMpIHtcbiAgICAgICAgdmFyIGF4ID0gZ2VvbVtpXTtcbiAgICAgICAgdmFyIGF5ID0gZ2VvbVtpICsgMV07XG4gICAgICAgIHZhciBheiA9IGdlb21baSArIDJdO1xuICAgICAgICB2YXIgYnggPSBnZW9tW2kgKyAzXTtcbiAgICAgICAgdmFyIGJ5ID0gZ2VvbVtpICsgNF07XG4gICAgICAgIHZhciBhID0gYXhpcyA9PT0gMCA/IGF4IDogYXk7XG4gICAgICAgIHZhciBiID0gYXhpcyA9PT0gMCA/IGJ4IDogYnk7XG4gICAgICAgIHZhciBzbGljZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAoYSA8IGsxKSB7XG4gICAgICAgICAgICAvLyAtLS18LS0+ICB8XG4gICAgICAgICAgICBpZiAoYiA+PSBrMSkgaW50ZXJzZWN0KHNsaWNlLCBheCwgYXksIGJ4LCBieSwgazEpO1xuICAgICAgICB9IGVsc2UgaWYgKGEgPiBrMikge1xuICAgICAgICAgICAgLy8gfCAgPC0tfC0tLVxuICAgICAgICAgICAgaWYgKGIgPD0gazIpIGludGVyc2VjdChzbGljZSwgYXgsIGF5LCBieCwgYnksIGsyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFkZFBvaW50KHNsaWNlLCBheCwgYXksIGF6KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYiA8IGsxICYmIGEgPj0gazEpIHtcbiAgICAgICAgICAgIC8vIDwtLXwtLS0gIHwgb3IgPC0tfC0tLS0tfC0tLVxuICAgICAgICAgICAgaW50ZXJzZWN0KHNsaWNlLCBheCwgYXksIGJ4LCBieSwgazEpO1xuICAgICAgICAgICAgc2xpY2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYiA+IGsyICYmIGEgPD0gazIpIHtcbiAgICAgICAgICAgIC8vIHwgIC0tLXwtLT4gb3IgLS0tfC0tLS0tfC0tPlxuICAgICAgICAgICAgaW50ZXJzZWN0KHNsaWNlLCBheCwgYXksIGJ4LCBieSwgazIpO1xuICAgICAgICAgICAgc2xpY2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNQb2x5Z29uICYmIHNsaWNlZCkge1xuICAgICAgICAgICAgc2xpY2Uuc2l6ZSA9IGdlb20uc2l6ZTtcbiAgICAgICAgICAgIG5ld0dlb20ucHVzaChzbGljZSk7XG4gICAgICAgICAgICBzbGljZSA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gYWRkIHRoZSBsYXN0IHBvaW50XG4gICAgdmFyIGxhc3QgPSBnZW9tLmxlbmd0aCAtIDM7XG4gICAgYXggPSBnZW9tW2xhc3RdO1xuICAgIGF5ID0gZ2VvbVtsYXN0ICsgMV07XG4gICAgYXogPSBnZW9tW2xhc3QgKyAyXTtcbiAgICBhID0gYXhpcyA9PT0gMCA/IGF4IDogYXk7XG4gICAgaWYgKGEgPj0gazEgJiYgYSA8PSBrMikgYWRkUG9pbnQoc2xpY2UsIGF4LCBheSwgYXopO1xuXG4gICAgLy8gY2xvc2UgdGhlIHBvbHlnb24gaWYgaXRzIGVuZHBvaW50cyBhcmUgbm90IHRoZSBzYW1lIGFmdGVyIGNsaXBwaW5nXG4gICAgbGFzdCA9IHNsaWNlLmxlbmd0aCAtIDM7XG4gICAgaWYgKGlzUG9seWdvbiAmJiBsYXN0ID49IDMgJiYgKHNsaWNlW2xhc3RdICE9PSBzbGljZVswXSB8fCBzbGljZVtsYXN0ICsgMV0gIT09IHNsaWNlWzFdKSkge1xuICAgICAgICBhZGRQb2ludChzbGljZSwgc2xpY2VbMF0sIHNsaWNlWzFdLCBzbGljZVsyXSk7XG4gICAgfVxuXG4gICAgLy8gYWRkIHRoZSBmaW5hbCBzbGljZVxuICAgIGlmIChzbGljZS5sZW5ndGgpIHtcbiAgICAgICAgc2xpY2Uuc2l6ZSA9IGdlb20uc2l6ZTtcbiAgICAgICAgbmV3R2VvbS5wdXNoKHNsaWNlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNsaXBMaW5lcyhnZW9tLCBuZXdHZW9tLCBrMSwgazIsIGF4aXMsIGlzUG9seWdvbikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjbGlwTGluZShnZW9tW2ldLCBuZXdHZW9tLCBrMSwgazIsIGF4aXMsIGlzUG9seWdvbik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhZGRQb2ludChvdXQsIHgsIHksIHopIHtcbiAgICBvdXQucHVzaCh4KTtcbiAgICBvdXQucHVzaCh5KTtcbiAgICBvdXQucHVzaCh6KTtcbn1cblxuZnVuY3Rpb24gaW50ZXJzZWN0WChvdXQsIGF4LCBheSwgYngsIGJ5LCB4KSB7XG4gICAgb3V0LnB1c2goeCk7XG4gICAgb3V0LnB1c2goYXkgKyAoeCAtIGF4KSAqIChieSAtIGF5KSAvIChieCAtIGF4KSk7XG4gICAgb3V0LnB1c2goMSk7XG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdFkob3V0LCBheCwgYXksIGJ4LCBieSwgeSkge1xuICAgIG91dC5wdXNoKGF4ICsgKHkgLSBheSkgKiAoYnggLSBheCkgLyAoYnkgLSBheSkpO1xuICAgIG91dC5wdXNoKHkpO1xuICAgIG91dC5wdXNoKDEpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG5cbnZhciBzaW1wbGlmeSA9IHJlcXVpcmUoJy4vc2ltcGxpZnknKTtcbnZhciBjcmVhdGVGZWF0dXJlID0gcmVxdWlyZSgnLi9mZWF0dXJlJyk7XG5cbi8vIGNvbnZlcnRzIEdlb0pTT04gZmVhdHVyZSBpbnRvIGFuIGludGVybWVkaWF0ZSBwcm9qZWN0ZWQgSlNPTiB2ZWN0b3IgZm9ybWF0IHdpdGggc2ltcGxpZmljYXRpb24gZGF0YVxuXG5mdW5jdGlvbiBjb252ZXJ0KGRhdGEsIHRvbGVyYW5jZSkge1xuICAgIHZhciBmZWF0dXJlcyA9IFtdO1xuXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmVDb2xsZWN0aW9uJykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEuZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBkYXRhLmZlYXR1cmVzW2ldLCB0b2xlcmFuY2UpO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBkYXRhLCB0b2xlcmFuY2UpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2luZ2xlIGdlb21ldHJ5IG9yIGEgZ2VvbWV0cnkgY29sbGVjdGlvblxuICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge2dlb21ldHJ5OiBkYXRhfSwgdG9sZXJhbmNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmVhdHVyZXM7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBnZW9qc29uLCB0b2xlcmFuY2UpIHtcbiAgICBpZiAoIWdlb2pzb24uZ2VvbWV0cnkpIHJldHVybjtcblxuICAgIHZhciBjb29yZHMgPSBnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgIHZhciB0eXBlID0gZ2VvanNvbi5nZW9tZXRyeS50eXBlO1xuICAgIHZhciB0b2wgPSB0b2xlcmFuY2UgKiB0b2xlcmFuY2U7XG4gICAgdmFyIGdlb21ldHJ5ID0gW107XG5cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICBjb252ZXJ0UG9pbnQoY29vcmRzLCBnZW9tZXRyeSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udmVydFBvaW50KGNvb3Jkc1tpXSwgZ2VvbWV0cnkpO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICBjb252ZXJ0TGluZShjb29yZHMsIGdlb21ldHJ5LCB0b2wsIGZhbHNlKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcbiAgICAgICAgY29udmVydExpbmVzKGNvb3JkcywgZ2VvbWV0cnksIHRvbCwgZmFsc2UpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgY29udmVydExpbmVzKGNvb3JkcywgZ2VvbWV0cnksIHRvbCwgdHJ1ZSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBwb2x5Z29uID0gW107XG4gICAgICAgICAgICBjb252ZXJ0TGluZXMoY29vcmRzW2ldLCBwb2x5Z29uLCB0b2wsIHRydWUpO1xuICAgICAgICAgICAgZ2VvbWV0cnkucHVzaChwb2x5Z29uKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0dlb21ldHJ5Q29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb2pzb24uZ2VvbWV0cnkuZ2VvbWV0cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIHtcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogZ2VvanNvbi5nZW9tZXRyeS5nZW9tZXRyaWVzW2ldLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGdlb2pzb24ucHJvcGVydGllc1xuICAgICAgICAgICAgfSwgdG9sZXJhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBkYXRhIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LicpO1xuICAgIH1cblxuICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlRmVhdHVyZShnZW9qc29uLmlkLCB0eXBlLCBnZW9tZXRyeSwgZ2VvanNvbi5wcm9wZXJ0aWVzKSk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRQb2ludChjb29yZHMsIG91dCkge1xuICAgIG91dC5wdXNoKHByb2plY3RYKGNvb3Jkc1swXSkpO1xuICAgIG91dC5wdXNoKHByb2plY3RZKGNvb3Jkc1sxXSkpO1xuICAgIG91dC5wdXNoKDApO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0TGluZShyaW5nLCBvdXQsIHRvbCwgaXNQb2x5Z29uKSB7XG4gICAgdmFyIHgwLCB5MDtcbiAgICB2YXIgc2l6ZSA9IDA7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIHggPSBwcm9qZWN0WChyaW5nW2pdWzBdKTtcbiAgICAgICAgdmFyIHkgPSBwcm9qZWN0WShyaW5nW2pdWzFdKTtcblxuICAgICAgICBvdXQucHVzaCh4KTtcbiAgICAgICAgb3V0LnB1c2goeSk7XG4gICAgICAgIG91dC5wdXNoKDApO1xuXG4gICAgICAgIGlmIChqID4gMCkge1xuICAgICAgICAgICAgaWYgKGlzUG9seWdvbikge1xuICAgICAgICAgICAgICAgIHNpemUgKz0gKHgwICogeSAtIHggKiB5MCkgLyAyOyAvLyBhcmVhXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNpemUgKz0gTWF0aC5zcXJ0KE1hdGgucG93KHggLSB4MCwgMikgKyBNYXRoLnBvdyh5IC0geTAsIDIpKTsgLy8gbGVuZ3RoXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgeDAgPSB4O1xuICAgICAgICB5MCA9IHk7XG4gICAgfVxuXG4gICAgdmFyIGxhc3QgPSBvdXQubGVuZ3RoIC0gMztcbiAgICBvdXRbMl0gPSAxO1xuICAgIHNpbXBsaWZ5KG91dCwgMCwgbGFzdCwgdG9sKTtcbiAgICBvdXRbbGFzdCArIDJdID0gMTtcblxuICAgIG91dC5zaXplID0gTWF0aC5hYnMoc2l6ZSk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRMaW5lcyhyaW5ncywgb3V0LCB0b2wsIGlzUG9seWdvbikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGdlb20gPSBbXTtcbiAgICAgICAgY29udmVydExpbmUocmluZ3NbaV0sIGdlb20sIHRvbCwgaXNQb2x5Z29uKTtcbiAgICAgICAgb3V0LnB1c2goZ2VvbSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwcm9qZWN0WCh4KSB7XG4gICAgcmV0dXJuIHggLyAzNjAgKyAwLjU7XG59XG5cbmZ1bmN0aW9uIHByb2plY3RZKHkpIHtcbiAgICB2YXIgc2luID0gTWF0aC5zaW4oeSAqIE1hdGguUEkgLyAxODApO1xuICAgIHZhciB5MiA9IDAuNSAtIDAuMjUgKiBNYXRoLmxvZygoMSArIHNpbikgLyAoMSAtIHNpbikpIC8gTWF0aC5QSTtcbiAgICByZXR1cm4geTIgPCAwID8gMCA6IHkyID4gMSA/IDEgOiB5Mjtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVGZWF0dXJlO1xuXG5mdW5jdGlvbiBjcmVhdGVGZWF0dXJlKGlkLCB0eXBlLCBnZW9tLCB0YWdzKSB7XG4gICAgdmFyIGZlYXR1cmUgPSB7XG4gICAgICAgIGlkOiBpZCB8fCBudWxsLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBnZW9tZXRyeTogZ2VvbSxcbiAgICAgICAgdGFnczogdGFncyxcbiAgICAgICAgbWluWDogSW5maW5pdHksXG4gICAgICAgIG1pblk6IEluZmluaXR5LFxuICAgICAgICBtYXhYOiAtSW5maW5pdHksXG4gICAgICAgIG1heFk6IC1JbmZpbml0eVxuICAgIH07XG4gICAgY2FsY0JCb3goZmVhdHVyZSk7XG4gICAgcmV0dXJuIGZlYXR1cmU7XG59XG5cbmZ1bmN0aW9uIGNhbGNCQm94KGZlYXR1cmUpIHtcbiAgICB2YXIgZ2VvbSA9IGZlYXR1cmUuZ2VvbWV0cnk7XG4gICAgdmFyIHR5cGUgPSBmZWF0dXJlLnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50JyB8fCB0eXBlID09PSAnTXVsdGlQb2ludCcgfHwgdHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgIGNhbGNMaW5lQkJveChmZWF0dXJlLCBnZW9tKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1BvbHlnb24nIHx8IHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY2FsY0xpbmVCQm94KGZlYXR1cmUsIGdlb21baV0pO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGdlb21baV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBjYWxjTGluZUJCb3goZmVhdHVyZSwgZ2VvbVtpXVtqXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNhbGNMaW5lQkJveChmZWF0dXJlLCBnZW9tKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIGZlYXR1cmUubWluWCA9IE1hdGgubWluKGZlYXR1cmUubWluWCwgZ2VvbVtpXSk7XG4gICAgICAgIGZlYXR1cmUubWluWSA9IE1hdGgubWluKGZlYXR1cmUubWluWSwgZ2VvbVtpICsgMV0pO1xuICAgICAgICBmZWF0dXJlLm1heFggPSBNYXRoLm1heChmZWF0dXJlLm1heFgsIGdlb21baV0pO1xuICAgICAgICBmZWF0dXJlLm1heFkgPSBNYXRoLm1heChmZWF0dXJlLm1heFksIGdlb21baSArIDFdKTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2VvanNvbnZ0O1xuXG52YXIgY29udmVydCA9IHJlcXVpcmUoJy4vY29udmVydCcpLCAgICAgLy8gR2VvSlNPTiBjb252ZXJzaW9uIGFuZCBwcmVwcm9jZXNzaW5nXG4gICAgdHJhbnNmb3JtID0gcmVxdWlyZSgnLi90cmFuc2Zvcm0nKSwgLy8gY29vcmRpbmF0ZSB0cmFuc2Zvcm1hdGlvblxuICAgIGNsaXAgPSByZXF1aXJlKCcuL2NsaXAnKSwgICAgICAgICAgIC8vIHN0cmlwZSBjbGlwcGluZyBhbGdvcml0aG1cbiAgICB3cmFwID0gcmVxdWlyZSgnLi93cmFwJyksICAgICAgICAgICAvLyBkYXRlIGxpbmUgcHJvY2Vzc2luZ1xuICAgIGNyZWF0ZVRpbGUgPSByZXF1aXJlKCcuL3RpbGUnKTsgICAgIC8vIGZpbmFsIHNpbXBsaWZpZWQgdGlsZSBnZW5lcmF0aW9uXG5cblxuZnVuY3Rpb24gZ2VvanNvbnZ0KGRhdGEsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEdlb0pTT05WVChkYXRhLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gR2VvSlNPTlZUKGRhdGEsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zID0gZXh0ZW5kKE9iamVjdC5jcmVhdGUodGhpcy5vcHRpb25zKSwgb3B0aW9ucyk7XG5cbiAgICB2YXIgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuXG4gICAgaWYgKGRlYnVnKSBjb25zb2xlLnRpbWUoJ3ByZXByb2Nlc3MgZGF0YScpO1xuXG4gICAgaWYgKG9wdGlvbnMubWF4Wm9vbSA8IDAgfHwgb3B0aW9ucy5tYXhab29tID4gMjQpIHRocm93IG5ldyBFcnJvcignbWF4Wm9vbSBzaG91bGQgYmUgaW4gdGhlIDAtMjQgcmFuZ2UnKTtcblxuICAgIHZhciB6MiA9IDEgPDwgb3B0aW9ucy5tYXhab29tLCAvLyAyXnpcbiAgICAgICAgZmVhdHVyZXMgPSBjb252ZXJ0KGRhdGEsIG9wdGlvbnMudG9sZXJhbmNlIC8gKHoyICogb3B0aW9ucy5leHRlbnQpKTtcblxuICAgIHRoaXMudGlsZXMgPSB7fTtcbiAgICB0aGlzLnRpbGVDb29yZHMgPSBbXTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ3ByZXByb2Nlc3MgZGF0YScpO1xuICAgICAgICBjb25zb2xlLmxvZygnaW5kZXg6IG1heFpvb206ICVkLCBtYXhQb2ludHM6ICVkJywgb3B0aW9ucy5pbmRleE1heFpvb20sIG9wdGlvbnMuaW5kZXhNYXhQb2ludHMpO1xuICAgICAgICBjb25zb2xlLnRpbWUoJ2dlbmVyYXRlIHRpbGVzJyk7XG4gICAgICAgIHRoaXMuc3RhdHMgPSB7fTtcbiAgICAgICAgdGhpcy50b3RhbCA9IDA7XG4gICAgfVxuXG4gICAgZmVhdHVyZXMgPSB3cmFwKGZlYXR1cmVzLCBvcHRpb25zLmJ1ZmZlciAvIG9wdGlvbnMuZXh0ZW50KTtcblxuICAgIC8vIHN0YXJ0IHNsaWNpbmcgZnJvbSB0aGUgdG9wIHRpbGUgZG93blxuICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIHRoaXMuc3BsaXRUaWxlKGZlYXR1cmVzLCAwLCAwLCAwKTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBpZiAoZmVhdHVyZXMubGVuZ3RoKSBjb25zb2xlLmxvZygnZmVhdHVyZXM6ICVkLCBwb2ludHM6ICVkJywgdGhpcy50aWxlc1swXS5udW1GZWF0dXJlcywgdGhpcy50aWxlc1swXS5udW1Qb2ludHMpO1xuICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ2dlbmVyYXRlIHRpbGVzJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCd0aWxlcyBnZW5lcmF0ZWQ6JywgdGhpcy50b3RhbCwgSlNPTi5zdHJpbmdpZnkodGhpcy5zdGF0cykpO1xuICAgIH1cbn1cblxuR2VvSlNPTlZULnByb3RvdHlwZS5vcHRpb25zID0ge1xuICAgIG1heFpvb206IDE0LCAgICAgICAgICAgIC8vIG1heCB6b29tIHRvIHByZXNlcnZlIGRldGFpbCBvblxuICAgIGluZGV4TWF4Wm9vbTogNSwgICAgICAgIC8vIG1heCB6b29tIGluIHRoZSB0aWxlIGluZGV4XG4gICAgaW5kZXhNYXhQb2ludHM6IDEwMDAwMCwgLy8gbWF4IG51bWJlciBvZiBwb2ludHMgcGVyIHRpbGUgaW4gdGhlIHRpbGUgaW5kZXhcbiAgICB0b2xlcmFuY2U6IDMsICAgICAgICAgICAvLyBzaW1wbGlmaWNhdGlvbiB0b2xlcmFuY2UgKGhpZ2hlciBtZWFucyBzaW1wbGVyKVxuICAgIGV4dGVudDogNDA5NiwgICAgICAgICAgIC8vIHRpbGUgZXh0ZW50XG4gICAgYnVmZmVyOiA2NCwgICAgICAgICAgICAgLy8gdGlsZSBidWZmZXIgb24gZWFjaCBzaWRlXG4gICAgZGVidWc6IDAgICAgICAgICAgICAgICAgLy8gbG9nZ2luZyBsZXZlbCAoMCwgMSBvciAyKVxufTtcblxuR2VvSlNPTlZULnByb3RvdHlwZS5zcGxpdFRpbGUgPSBmdW5jdGlvbiAoZmVhdHVyZXMsIHosIHgsIHksIGN6LCBjeCwgY3kpIHtcblxuICAgIHZhciBzdGFjayA9IFtmZWF0dXJlcywgeiwgeCwgeV0sXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIC8vIGF2b2lkIHJlY3Vyc2lvbiBieSB1c2luZyBhIHByb2Nlc3NpbmcgcXVldWVcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIHkgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgeCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB6ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGZlYXR1cmVzID0gc3RhY2sucG9wKCk7XG5cbiAgICAgICAgdmFyIHoyID0gMSA8PCB6LFxuICAgICAgICAgICAgaWQgPSB0b0lEKHosIHgsIHkpLFxuICAgICAgICAgICAgdGlsZSA9IHRoaXMudGlsZXNbaWRdLFxuICAgICAgICAgICAgdGlsZVRvbGVyYW5jZSA9IHogPT09IG9wdGlvbnMubWF4Wm9vbSA/IDAgOiBvcHRpb25zLnRvbGVyYW5jZSAvICh6MiAqIG9wdGlvbnMuZXh0ZW50KTtcblxuICAgICAgICBpZiAoIXRpbGUpIHtcbiAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnY3JlYXRpb24nKTtcblxuICAgICAgICAgICAgdGlsZSA9IHRoaXMudGlsZXNbaWRdID0gY3JlYXRlVGlsZShmZWF0dXJlcywgejIsIHgsIHksIHRpbGVUb2xlcmFuY2UsIHogPT09IG9wdGlvbnMubWF4Wm9vbSk7XG4gICAgICAgICAgICB0aGlzLnRpbGVDb29yZHMucHVzaCh7ejogeiwgeDogeCwgeTogeX0pO1xuXG4gICAgICAgICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWcgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aWxlIHolZC0lZC0lZCAoZmVhdHVyZXM6ICVkLCBwb2ludHM6ICVkLCBzaW1wbGlmaWVkOiAlZCknLFxuICAgICAgICAgICAgICAgICAgICAgICAgeiwgeCwgeSwgdGlsZS5udW1GZWF0dXJlcywgdGlsZS5udW1Qb2ludHMsIHRpbGUubnVtU2ltcGxpZmllZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZUVuZCgnY3JlYXRpb24nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9ICd6JyArIHo7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0c1trZXldID0gKHRoaXMuc3RhdHNba2V5XSB8fCAwKSArIDE7XG4gICAgICAgICAgICAgICAgdGhpcy50b3RhbCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2F2ZSByZWZlcmVuY2UgdG8gb3JpZ2luYWwgZ2VvbWV0cnkgaW4gdGlsZSBzbyB0aGF0IHdlIGNhbiBkcmlsbCBkb3duIGxhdGVyIGlmIHdlIHN0b3Agbm93XG4gICAgICAgIHRpbGUuc291cmNlID0gZmVhdHVyZXM7XG5cbiAgICAgICAgLy8gaWYgaXQncyB0aGUgZmlyc3QtcGFzcyB0aWxpbmdcbiAgICAgICAgaWYgKCFjeikge1xuICAgICAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgd2UgcmVhY2hlZCBtYXggem9vbSwgb3IgaWYgdGhlIHRpbGUgaXMgdG9vIHNpbXBsZVxuICAgICAgICAgICAgaWYgKHogPT09IG9wdGlvbnMuaW5kZXhNYXhab29tIHx8IHRpbGUubnVtUG9pbnRzIDw9IG9wdGlvbnMuaW5kZXhNYXhQb2ludHMpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIGlmIGEgZHJpbGxkb3duIHRvIGEgc3BlY2lmaWMgdGlsZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgd2UgcmVhY2hlZCBiYXNlIHpvb20gb3Igb3VyIHRhcmdldCB0aWxlIHpvb21cbiAgICAgICAgICAgIGlmICh6ID09PSBvcHRpb25zLm1heFpvb20gfHwgeiA9PT0gY3opIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiBpdCdzIG5vdCBhbiBhbmNlc3RvciBvZiB0aGUgdGFyZ2V0IHRpbGVcbiAgICAgICAgICAgIHZhciBtID0gMSA8PCAoY3ogLSB6KTtcbiAgICAgICAgICAgIGlmICh4ICE9PSBNYXRoLmZsb29yKGN4IC8gbSkgfHwgeSAhPT0gTWF0aC5mbG9vcihjeSAvIG0pKSBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHdlIHNsaWNlIGZ1cnRoZXIgZG93biwgbm8gbmVlZCB0byBrZWVwIHNvdXJjZSBnZW9tZXRyeVxuICAgICAgICB0aWxlLnNvdXJjZSA9IG51bGw7XG5cbiAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lKCdjbGlwcGluZycpO1xuXG4gICAgICAgIC8vIHZhbHVlcyB3ZSdsbCB1c2UgZm9yIGNsaXBwaW5nXG4gICAgICAgIHZhciBrMSA9IDAuNSAqIG9wdGlvbnMuYnVmZmVyIC8gb3B0aW9ucy5leHRlbnQsXG4gICAgICAgICAgICBrMiA9IDAuNSAtIGsxLFxuICAgICAgICAgICAgazMgPSAwLjUgKyBrMSxcbiAgICAgICAgICAgIGs0ID0gMSArIGsxLFxuICAgICAgICAgICAgdGwsIGJsLCB0ciwgYnIsIGxlZnQsIHJpZ2h0O1xuXG4gICAgICAgIHRsID0gYmwgPSB0ciA9IGJyID0gbnVsbDtcblxuICAgICAgICBsZWZ0ICA9IGNsaXAoZmVhdHVyZXMsIHoyLCB4IC0gazEsIHggKyBrMywgMCwgdGlsZS5taW5YLCB0aWxlLm1heFgpO1xuICAgICAgICByaWdodCA9IGNsaXAoZmVhdHVyZXMsIHoyLCB4ICsgazIsIHggKyBrNCwgMCwgdGlsZS5taW5YLCB0aWxlLm1heFgpO1xuICAgICAgICBmZWF0dXJlcyA9IG51bGw7XG5cbiAgICAgICAgaWYgKGxlZnQpIHtcbiAgICAgICAgICAgIHRsID0gY2xpcChsZWZ0LCB6MiwgeSAtIGsxLCB5ICsgazMsIDEsIHRpbGUubWluWSwgdGlsZS5tYXhZKTtcbiAgICAgICAgICAgIGJsID0gY2xpcChsZWZ0LCB6MiwgeSArIGsyLCB5ICsgazQsIDEsIHRpbGUubWluWSwgdGlsZS5tYXhZKTtcbiAgICAgICAgICAgIGxlZnQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJpZ2h0KSB7XG4gICAgICAgICAgICB0ciA9IGNsaXAocmlnaHQsIHoyLCB5IC0gazEsIHkgKyBrMywgMSwgdGlsZS5taW5ZLCB0aWxlLm1heFkpO1xuICAgICAgICAgICAgYnIgPSBjbGlwKHJpZ2h0LCB6MiwgeSArIGsyLCB5ICsgazQsIDEsIHRpbGUubWluWSwgdGlsZS5tYXhZKTtcbiAgICAgICAgICAgIHJpZ2h0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZUVuZCgnY2xpcHBpbmcnKTtcblxuICAgICAgICBzdGFjay5wdXNoKHRsIHx8IFtdLCB6ICsgMSwgeCAqIDIsICAgICB5ICogMik7XG4gICAgICAgIHN0YWNrLnB1c2goYmwgfHwgW10sIHogKyAxLCB4ICogMiwgICAgIHkgKiAyICsgMSk7XG4gICAgICAgIHN0YWNrLnB1c2godHIgfHwgW10sIHogKyAxLCB4ICogMiArIDEsIHkgKiAyKTtcbiAgICAgICAgc3RhY2sucHVzaChiciB8fCBbXSwgeiArIDEsIHggKiAyICsgMSwgeSAqIDIgKyAxKTtcbiAgICB9XG59O1xuXG5HZW9KU09OVlQucHJvdG90eXBlLmdldFRpbGUgPSBmdW5jdGlvbiAoeiwgeCwgeSkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBleHRlbnQgPSBvcHRpb25zLmV4dGVudCxcbiAgICAgICAgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuXG4gICAgaWYgKHogPCAwIHx8IHogPiAyNCkgcmV0dXJuIG51bGw7XG5cbiAgICB2YXIgejIgPSAxIDw8IHo7XG4gICAgeCA9ICgoeCAlIHoyKSArIHoyKSAlIHoyOyAvLyB3cmFwIHRpbGUgeCBjb29yZGluYXRlXG5cbiAgICB2YXIgaWQgPSB0b0lEKHosIHgsIHkpO1xuICAgIGlmICh0aGlzLnRpbGVzW2lkXSkgcmV0dXJuIHRyYW5zZm9ybS50aWxlKHRoaXMudGlsZXNbaWRdLCBleHRlbnQpO1xuXG4gICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS5sb2coJ2RyaWxsaW5nIGRvd24gdG8geiVkLSVkLSVkJywgeiwgeCwgeSk7XG5cbiAgICB2YXIgejAgPSB6LFxuICAgICAgICB4MCA9IHgsXG4gICAgICAgIHkwID0geSxcbiAgICAgICAgcGFyZW50O1xuXG4gICAgd2hpbGUgKCFwYXJlbnQgJiYgejAgPiAwKSB7XG4gICAgICAgIHowLS07XG4gICAgICAgIHgwID0gTWF0aC5mbG9vcih4MCAvIDIpO1xuICAgICAgICB5MCA9IE1hdGguZmxvb3IoeTAgLyAyKTtcbiAgICAgICAgcGFyZW50ID0gdGhpcy50aWxlc1t0b0lEKHowLCB4MCwgeTApXTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmVudCB8fCAhcGFyZW50LnNvdXJjZSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBpZiB3ZSBmb3VuZCBhIHBhcmVudCB0aWxlIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIGdlb21ldHJ5LCB3ZSBjYW4gZHJpbGwgZG93biBmcm9tIGl0XG4gICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS5sb2coJ2ZvdW5kIHBhcmVudCB0aWxlIHolZC0lZC0lZCcsIHowLCB4MCwgeTApO1xuXG4gICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lKCdkcmlsbGluZyBkb3duJyk7XG4gICAgdGhpcy5zcGxpdFRpbGUocGFyZW50LnNvdXJjZSwgejAsIHgwLCB5MCwgeiwgeCwgeSk7XG4gICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lRW5kKCdkcmlsbGluZyBkb3duJyk7XG5cbiAgICByZXR1cm4gdGhpcy50aWxlc1tpZF0gPyB0cmFuc2Zvcm0udGlsZSh0aGlzLnRpbGVzW2lkXSwgZXh0ZW50KSA6IG51bGw7XG59O1xuXG5mdW5jdGlvbiB0b0lEKHosIHgsIHkpIHtcbiAgICByZXR1cm4gKCgoMSA8PCB6KSAqIHkgKyB4KSAqIDMyKSArIHo7XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMpIHtcbiAgICBmb3IgKHZhciBpIGluIHNyYykgZGVzdFtpXSA9IHNyY1tpXTtcbiAgICByZXR1cm4gZGVzdDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBzaW1wbGlmeTtcblxuLy8gY2FsY3VsYXRlIHNpbXBsaWZpY2F0aW9uIGRhdGEgdXNpbmcgb3B0aW1pemVkIERvdWdsYXMtUGV1Y2tlciBhbGdvcml0aG1cblxuZnVuY3Rpb24gc2ltcGxpZnkoY29vcmRzLCBmaXJzdCwgbGFzdCwgc3FUb2xlcmFuY2UpIHtcbiAgICB2YXIgbWF4U3FEaXN0ID0gc3FUb2xlcmFuY2U7XG4gICAgdmFyIGluZGV4O1xuXG4gICAgdmFyIGF4ID0gY29vcmRzW2ZpcnN0XTtcbiAgICB2YXIgYXkgPSBjb29yZHNbZmlyc3QgKyAxXTtcbiAgICB2YXIgYnggPSBjb29yZHNbbGFzdF07XG4gICAgdmFyIGJ5ID0gY29vcmRzW2xhc3QgKyAxXTtcblxuICAgIGZvciAodmFyIGkgPSBmaXJzdCArIDM7IGkgPCBsYXN0OyBpICs9IDMpIHtcbiAgICAgICAgdmFyIGQgPSBnZXRTcVNlZ0Rpc3QoY29vcmRzW2ldLCBjb29yZHNbaSArIDFdLCBheCwgYXksIGJ4LCBieSk7XG4gICAgICAgIGlmIChkID4gbWF4U3FEaXN0KSB7XG4gICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICBtYXhTcURpc3QgPSBkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1heFNxRGlzdCA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgIGlmIChpbmRleCAtIGZpcnN0ID4gMykgc2ltcGxpZnkoY29vcmRzLCBmaXJzdCwgaW5kZXgsIHNxVG9sZXJhbmNlKTtcbiAgICAgICAgY29vcmRzW2luZGV4ICsgMl0gPSBtYXhTcURpc3Q7XG4gICAgICAgIGlmIChsYXN0IC0gaW5kZXggPiAzKSBzaW1wbGlmeShjb29yZHMsIGluZGV4LCBsYXN0LCBzcVRvbGVyYW5jZSk7XG4gICAgfVxufVxuXG4vLyBzcXVhcmUgZGlzdGFuY2UgZnJvbSBhIHBvaW50IHRvIGEgc2VnbWVudFxuZnVuY3Rpb24gZ2V0U3FTZWdEaXN0KHB4LCBweSwgeCwgeSwgYngsIGJ5KSB7XG5cbiAgICB2YXIgZHggPSBieCAtIHg7XG4gICAgdmFyIGR5ID0gYnkgLSB5O1xuXG4gICAgaWYgKGR4ICE9PSAwIHx8IGR5ICE9PSAwKSB7XG5cbiAgICAgICAgdmFyIHQgPSAoKHB4IC0geCkgKiBkeCArIChweSAtIHkpICogZHkpIC8gKGR4ICogZHggKyBkeSAqIGR5KTtcblxuICAgICAgICBpZiAodCA+IDEpIHtcbiAgICAgICAgICAgIHggPSBieDtcbiAgICAgICAgICAgIHkgPSBieTtcblxuICAgICAgICB9IGVsc2UgaWYgKHQgPiAwKSB7XG4gICAgICAgICAgICB4ICs9IGR4ICogdDtcbiAgICAgICAgICAgIHkgKz0gZHkgKiB0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZHggPSBweCAtIHg7XG4gICAgZHkgPSBweSAtIHk7XG5cbiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlVGlsZTtcblxuZnVuY3Rpb24gY3JlYXRlVGlsZShmZWF0dXJlcywgejIsIHR4LCB0eSwgdG9sZXJhbmNlLCBub1NpbXBsaWZ5KSB7XG4gICAgdmFyIHRpbGUgPSB7XG4gICAgICAgIGZlYXR1cmVzOiBbXSxcbiAgICAgICAgbnVtUG9pbnRzOiAwLFxuICAgICAgICBudW1TaW1wbGlmaWVkOiAwLFxuICAgICAgICBudW1GZWF0dXJlczogMCxcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICB4OiB0eCxcbiAgICAgICAgeTogdHksXG4gICAgICAgIHoyOiB6MixcbiAgICAgICAgdHJhbnNmb3JtZWQ6IGZhbHNlLFxuICAgICAgICBtaW5YOiAyLFxuICAgICAgICBtaW5ZOiAxLFxuICAgICAgICBtYXhYOiAtMSxcbiAgICAgICAgbWF4WTogMFxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aWxlLm51bUZlYXR1cmVzKys7XG4gICAgICAgIGFkZEZlYXR1cmUodGlsZSwgZmVhdHVyZXNbaV0sIHRvbGVyYW5jZSwgbm9TaW1wbGlmeSk7XG5cbiAgICAgICAgdmFyIG1pblggPSBmZWF0dXJlc1tpXS5taW5YO1xuICAgICAgICB2YXIgbWluWSA9IGZlYXR1cmVzW2ldLm1pblk7XG4gICAgICAgIHZhciBtYXhYID0gZmVhdHVyZXNbaV0ubWF4WDtcbiAgICAgICAgdmFyIG1heFkgPSBmZWF0dXJlc1tpXS5tYXhZO1xuXG4gICAgICAgIGlmIChtaW5YIDwgdGlsZS5taW5YKSB0aWxlLm1pblggPSBtaW5YO1xuICAgICAgICBpZiAobWluWSA8IHRpbGUubWluWSkgdGlsZS5taW5ZID0gbWluWTtcbiAgICAgICAgaWYgKG1heFggPiB0aWxlLm1heFgpIHRpbGUubWF4WCA9IG1heFg7XG4gICAgICAgIGlmIChtYXhZID4gdGlsZS5tYXhZKSB0aWxlLm1heFkgPSBtYXhZO1xuICAgIH1cbiAgICByZXR1cm4gdGlsZTtcbn1cblxuZnVuY3Rpb24gYWRkRmVhdHVyZSh0aWxlLCBmZWF0dXJlLCB0b2xlcmFuY2UsIG5vU2ltcGxpZnkpIHtcblxuICAgIHZhciBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZSxcbiAgICAgICAgc2ltcGxpZmllZCA9IFtdO1xuXG4gICAgaWYgKHR5cGUgPT09ICdQb2ludCcgfHwgdHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgc2ltcGxpZmllZC5wdXNoKGdlb21baV0pO1xuICAgICAgICAgICAgc2ltcGxpZmllZC5wdXNoKGdlb21baSArIDFdKTtcbiAgICAgICAgICAgIHRpbGUubnVtUG9pbnRzKys7XG4gICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgYWRkTGluZShzaW1wbGlmaWVkLCBnZW9tLCB0aWxlLCB0b2xlcmFuY2UsIG5vU2ltcGxpZnksIGZhbHNlLCBmYWxzZSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYWRkTGluZShzaW1wbGlmaWVkLCBnZW9tW2ldLCB0aWxlLCB0b2xlcmFuY2UsIG5vU2ltcGxpZnksIHR5cGUgPT09ICdQb2x5Z29uJywgaSA9PT0gMCk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcblxuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGdlb20ubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIHZhciBwb2x5Z29uID0gZ2VvbVtrXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYWRkTGluZShzaW1wbGlmaWVkLCBwb2x5Z29uW2ldLCB0aWxlLCB0b2xlcmFuY2UsIG5vU2ltcGxpZnksIHRydWUsIGkgPT09IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpbXBsaWZpZWQubGVuZ3RoKSB7XG4gICAgICAgIHZhciB0aWxlRmVhdHVyZSA9IHtcbiAgICAgICAgICAgIGdlb21ldHJ5OiBzaW1wbGlmaWVkLFxuICAgICAgICAgICAgdHlwZTogdHlwZSA9PT0gJ1BvbHlnb24nIHx8IHR5cGUgPT09ICdNdWx0aVBvbHlnb24nID8gMyA6XG4gICAgICAgICAgICAgICAgdHlwZSA9PT0gJ0xpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnID8gMiA6IDEsXG4gICAgICAgICAgICB0YWdzOiBmZWF0dXJlLnRhZ3MgfHwgbnVsbFxuICAgICAgICB9O1xuICAgICAgICBpZiAoZmVhdHVyZS5pZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGlsZUZlYXR1cmUuaWQgPSBmZWF0dXJlLmlkO1xuICAgICAgICB9XG4gICAgICAgIHRpbGUuZmVhdHVyZXMucHVzaCh0aWxlRmVhdHVyZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhZGRMaW5lKHJlc3VsdCwgZ2VvbSwgdGlsZSwgdG9sZXJhbmNlLCBub1NpbXBsaWZ5LCBpc1BvbHlnb24sIGlzT3V0ZXIpIHtcbiAgICB2YXIgc3FUb2xlcmFuY2UgPSB0b2xlcmFuY2UgKiB0b2xlcmFuY2U7XG5cbiAgICBpZiAoIW5vU2ltcGxpZnkgJiYgKGdlb20uc2l6ZSA8IChpc1BvbHlnb24gPyBzcVRvbGVyYW5jZSA6IHRvbGVyYW5jZSkpKSB7XG4gICAgICAgIHRpbGUubnVtUG9pbnRzICs9IGdlb20ubGVuZ3RoIC8gMztcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByaW5nID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgaWYgKG5vU2ltcGxpZnkgfHwgZ2VvbVtpICsgMl0gPiBzcVRvbGVyYW5jZSkge1xuICAgICAgICAgICAgdGlsZS5udW1TaW1wbGlmaWVkKys7XG4gICAgICAgICAgICByaW5nLnB1c2goZ2VvbVtpXSk7XG4gICAgICAgICAgICByaW5nLnB1c2goZ2VvbVtpICsgMV0pO1xuICAgICAgICB9XG4gICAgICAgIHRpbGUubnVtUG9pbnRzKys7XG4gICAgfVxuXG4gICAgaWYgKGlzUG9seWdvbikgcmV3aW5kKHJpbmcsIGlzT3V0ZXIpO1xuXG4gICAgcmVzdWx0LnB1c2gocmluZyk7XG59XG5cbmZ1bmN0aW9uIHJld2luZChyaW5nLCBjbG9ja3dpc2UpIHtcbiAgICB2YXIgYXJlYSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJpbmcubGVuZ3RoLCBqID0gbGVuIC0gMjsgaSA8IGxlbjsgaiA9IGksIGkgKz0gMikge1xuICAgICAgICBhcmVhICs9IChyaW5nW2ldIC0gcmluZ1tqXSkgKiAocmluZ1tpICsgMV0gKyByaW5nW2ogKyAxXSk7XG4gICAgfVxuICAgIGlmIChhcmVhID4gMCA9PT0gY2xvY2t3aXNlKSB7XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHJpbmcubGVuZ3RoOyBpIDwgbGVuIC8gMjsgaSArPSAyKSB7XG4gICAgICAgICAgICB2YXIgeCA9IHJpbmdbaV07XG4gICAgICAgICAgICB2YXIgeSA9IHJpbmdbaSArIDFdO1xuICAgICAgICAgICAgcmluZ1tpXSA9IHJpbmdbbGVuIC0gMiAtIGldO1xuICAgICAgICAgICAgcmluZ1tpICsgMV0gPSByaW5nW2xlbiAtIDEgLSBpXTtcbiAgICAgICAgICAgIHJpbmdbbGVuIC0gMiAtIGldID0geDtcbiAgICAgICAgICAgIHJpbmdbbGVuIC0gMSAtIGldID0geTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy50aWxlID0gdHJhbnNmb3JtVGlsZTtcbmV4cG9ydHMucG9pbnQgPSB0cmFuc2Zvcm1Qb2ludDtcblxuLy8gVHJhbnNmb3JtcyB0aGUgY29vcmRpbmF0ZXMgb2YgZWFjaCBmZWF0dXJlIGluIHRoZSBnaXZlbiB0aWxlIGZyb21cbi8vIG1lcmNhdG9yLXByb2plY3RlZCBzcGFjZSBpbnRvIChleHRlbnQgeCBleHRlbnQpIHRpbGUgc3BhY2UuXG5mdW5jdGlvbiB0cmFuc2Zvcm1UaWxlKHRpbGUsIGV4dGVudCkge1xuICAgIGlmICh0aWxlLnRyYW5zZm9ybWVkKSByZXR1cm4gdGlsZTtcblxuICAgIHZhciB6MiA9IHRpbGUuejIsXG4gICAgICAgIHR4ID0gdGlsZS54LFxuICAgICAgICB0eSA9IHRpbGUueSxcbiAgICAgICAgaSwgaiwgaztcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0aWxlLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gdGlsZS5mZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICBmZWF0dXJlLmdlb21ldHJ5ID0gW107XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tLmxlbmd0aDsgaiArPSAyKSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZS5nZW9tZXRyeS5wdXNoKHRyYW5zZm9ybVBvaW50KGdlb21bal0sIGdlb21baiArIDFdLCBleHRlbnQsIHoyLCB0eCwgdHkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJpbmcgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZ2VvbVtqXS5sZW5ndGg7IGsgKz0gMikge1xuICAgICAgICAgICAgICAgICAgICByaW5nLnB1c2godHJhbnNmb3JtUG9pbnQoZ2VvbVtqXVtrXSwgZ2VvbVtqXVtrICsgMV0sIGV4dGVudCwgejIsIHR4LCB0eSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmZWF0dXJlLmdlb21ldHJ5LnB1c2gocmluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aWxlLnRyYW5zZm9ybWVkID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aWxlO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Qb2ludCh4LCB5LCBleHRlbnQsIHoyLCB0eCwgdHkpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBNYXRoLnJvdW5kKGV4dGVudCAqICh4ICogejIgLSB0eCkpLFxuICAgICAgICBNYXRoLnJvdW5kKGV4dGVudCAqICh5ICogejIgLSB0eSkpXTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNsaXAgPSByZXF1aXJlKCcuL2NsaXAnKTtcbnZhciBjcmVhdGVGZWF0dXJlID0gcmVxdWlyZSgnLi9mZWF0dXJlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gd3JhcDtcblxuZnVuY3Rpb24gd3JhcChmZWF0dXJlcywgYnVmZmVyKSB7XG4gICAgdmFyIG1lcmdlZCA9IGZlYXR1cmVzLFxuICAgICAgICBsZWZ0ICA9IGNsaXAoZmVhdHVyZXMsIDEsIC0xIC0gYnVmZmVyLCBidWZmZXIsICAgICAwLCAtMSwgMiksIC8vIGxlZnQgd29ybGQgY29weVxuICAgICAgICByaWdodCA9IGNsaXAoZmVhdHVyZXMsIDEsICAxIC0gYnVmZmVyLCAyICsgYnVmZmVyLCAwLCAtMSwgMik7IC8vIHJpZ2h0IHdvcmxkIGNvcHlcblxuICAgIGlmIChsZWZ0IHx8IHJpZ2h0KSB7XG4gICAgICAgIG1lcmdlZCA9IGNsaXAoZmVhdHVyZXMsIDEsIC1idWZmZXIsIDEgKyBidWZmZXIsIDAsIC0xLCAyKSB8fCBbXTsgLy8gY2VudGVyIHdvcmxkIGNvcHlcblxuICAgICAgICBpZiAobGVmdCkgbWVyZ2VkID0gc2hpZnRGZWF0dXJlQ29vcmRzKGxlZnQsIDEpLmNvbmNhdChtZXJnZWQpOyAvLyBtZXJnZSBsZWZ0IGludG8gY2VudGVyXG4gICAgICAgIGlmIChyaWdodCkgbWVyZ2VkID0gbWVyZ2VkLmNvbmNhdChzaGlmdEZlYXR1cmVDb29yZHMocmlnaHQsIC0xKSk7IC8vIG1lcmdlIHJpZ2h0IGludG8gY2VudGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZDtcbn1cblxuZnVuY3Rpb24gc2hpZnRGZWF0dXJlQ29vcmRzKGZlYXR1cmVzLCBvZmZzZXQpIHtcbiAgICB2YXIgbmV3RmVhdHVyZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGU7XG5cbiAgICAgICAgdmFyIG5ld0dlb21ldHJ5O1xuXG4gICAgICAgIGlmICh0eXBlID09PSAnUG9pbnQnIHx8IHR5cGUgPT09ICdNdWx0aVBvaW50JyB8fCB0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgIG5ld0dlb21ldHJ5ID0gc2hpZnRDb29yZHMoZmVhdHVyZS5nZW9tZXRyeSwgb2Zmc2V0KTtcblxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZmVhdHVyZS5nZW9tZXRyeS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIG5ld0dlb21ldHJ5LnB1c2goc2hpZnRDb29yZHMoZmVhdHVyZS5nZW9tZXRyeVtqXSwgb2Zmc2V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgICAgIG5ld0dlb21ldHJ5ID0gW107XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmVhdHVyZS5nZW9tZXRyeS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciBuZXdQb2x5Z29uID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBmZWF0dXJlLmdlb21ldHJ5W2pdLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1BvbHlnb24ucHVzaChzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5W2pdW2tdLCBvZmZzZXQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV3R2VvbWV0cnkucHVzaChuZXdQb2x5Z29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5ld0ZlYXR1cmVzLnB1c2goY3JlYXRlRmVhdHVyZShmZWF0dXJlLmlkLCB0eXBlLCBuZXdHZW9tZXRyeSwgZmVhdHVyZS50YWdzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0ZlYXR1cmVzO1xufVxuXG5mdW5jdGlvbiBzaGlmdENvb3Jkcyhwb2ludHMsIG9mZnNldCkge1xuICAgIHZhciBuZXdQb2ludHMgPSBbXTtcbiAgICBuZXdQb2ludHMuc2l6ZSA9IHBvaW50cy5zaXplO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgbmV3UG9pbnRzLnB1c2gocG9pbnRzW2ldICsgb2Zmc2V0LCBwb2ludHNbaSArIDFdLCBwb2ludHNbaSArIDJdKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1BvaW50cztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBHcmlkSW5kZXg7XG5cbnZhciBOVU1fUEFSQU1TID0gMztcblxuZnVuY3Rpb24gR3JpZEluZGV4KGV4dGVudCwgbiwgcGFkZGluZykge1xuICAgIHZhciBjZWxscyA9IHRoaXMuY2VsbHMgPSBbXTtcblxuICAgIGlmIChleHRlbnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICB0aGlzLmFycmF5QnVmZmVyID0gZXh0ZW50O1xuICAgICAgICB2YXIgYXJyYXkgPSBuZXcgSW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgZXh0ZW50ID0gYXJyYXlbMF07XG4gICAgICAgIG4gPSBhcnJheVsxXTtcbiAgICAgICAgcGFkZGluZyA9IGFycmF5WzJdO1xuXG4gICAgICAgIHRoaXMuZCA9IG4gKyAyICogcGFkZGluZztcbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmQgKiB0aGlzLmQ7IGsrKykge1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gYXJyYXlbTlVNX1BBUkFNUyArIGtdO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGFycmF5W05VTV9QQVJBTVMgKyBrICsgMV07XG4gICAgICAgICAgICBjZWxscy5wdXNoKHN0YXJ0ID09PSBlbmQgP1xuICAgICAgICAgICAgICAgICAgICBudWxsIDpcbiAgICAgICAgICAgICAgICAgICAgYXJyYXkuc3ViYXJyYXkoc3RhcnQsIGVuZCkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBrZXlzT2Zmc2V0ID0gYXJyYXlbTlVNX1BBUkFNUyArIGNlbGxzLmxlbmd0aF07XG4gICAgICAgIHZhciBiYm94ZXNPZmZzZXQgPSBhcnJheVtOVU1fUEFSQU1TICsgY2VsbHMubGVuZ3RoICsgMV07XG4gICAgICAgIHRoaXMua2V5cyA9IGFycmF5LnN1YmFycmF5KGtleXNPZmZzZXQsIGJib3hlc09mZnNldCk7XG4gICAgICAgIHRoaXMuYmJveGVzID0gYXJyYXkuc3ViYXJyYXkoYmJveGVzT2Zmc2V0KTtcblxuICAgICAgICB0aGlzLmluc2VydCA9IHRoaXMuX2luc2VydFJlYWRvbmx5O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kID0gbiArIDIgKiBwYWRkaW5nO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZCAqIHRoaXMuZDsgaSsrKSB7XG4gICAgICAgICAgICBjZWxscy5wdXNoKFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmtleXMgPSBbXTtcbiAgICAgICAgdGhpcy5iYm94ZXMgPSBbXTtcbiAgICB9XG5cbiAgICB0aGlzLm4gPSBuO1xuICAgIHRoaXMuZXh0ZW50ID0gZXh0ZW50O1xuICAgIHRoaXMucGFkZGluZyA9IHBhZGRpbmc7XG4gICAgdGhpcy5zY2FsZSA9IG4gLyBleHRlbnQ7XG4gICAgdGhpcy51aWQgPSAwO1xuXG4gICAgdmFyIHAgPSAocGFkZGluZyAvIG4pICogZXh0ZW50O1xuICAgIHRoaXMubWluID0gLXA7XG4gICAgdGhpcy5tYXggPSBleHRlbnQgKyBwO1xufVxuXG5cbkdyaWRJbmRleC5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24oa2V5LCB4MSwgeTEsIHgyLCB5Mikge1xuICAgIHRoaXMuX2ZvckVhY2hDZWxsKHgxLCB5MSwgeDIsIHkyLCB0aGlzLl9pbnNlcnRDZWxsLCB0aGlzLnVpZCsrKTtcbiAgICB0aGlzLmtleXMucHVzaChrZXkpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeDEpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeTEpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeDIpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeTIpO1xufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5faW5zZXJ0UmVhZG9ubHkgPSBmdW5jdGlvbigpIHtcbiAgICB0aHJvdyAnQ2Fubm90IGluc2VydCBpbnRvIGEgR3JpZEluZGV4IGNyZWF0ZWQgZnJvbSBhbiBBcnJheUJ1ZmZlci4nO1xufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5faW5zZXJ0Q2VsbCA9IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCBjZWxsSW5kZXgsIHVpZCkge1xuICAgIHRoaXMuY2VsbHNbY2VsbEluZGV4XS5wdXNoKHVpZCk7XG59O1xuXG5HcmlkSW5kZXgucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIpIHtcbiAgICB2YXIgbWluID0gdGhpcy5taW47XG4gICAgdmFyIG1heCA9IHRoaXMubWF4O1xuICAgIGlmICh4MSA8PSBtaW4gJiYgeTEgPD0gbWluICYmIG1heCA8PSB4MiAmJiBtYXggPD0geTIpIHtcbiAgICAgICAgLy8gV2UgdXNlIGBBcnJheSNzbGljZWAgYmVjYXVzZSBgdGhpcy5rZXlzYCBtYXkgYmUgYSBgSW50MzJBcnJheWAgYW5kXG4gICAgICAgIC8vIHNvbWUgYnJvd3NlcnMgKFNhZmFyaSBhbmQgSUUpIGRvIG5vdCBzdXBwb3J0IGBUeXBlZEFycmF5I3NsaWNlYFxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9UeXBlZEFycmF5L3NsaWNlI0Jyb3dzZXJfY29tcGF0aWJpbGl0eVxuICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5rZXlzKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgdmFyIHNlZW5VaWRzID0ge307XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDZWxsKHgxLCB5MSwgeDIsIHkyLCB0aGlzLl9xdWVyeUNlbGwsIHJlc3VsdCwgc2VlblVpZHMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn07XG5cbkdyaWRJbmRleC5wcm90b3R5cGUuX3F1ZXJ5Q2VsbCA9IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCBjZWxsSW5kZXgsIHJlc3VsdCwgc2VlblVpZHMpIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuY2VsbHNbY2VsbEluZGV4XTtcbiAgICBpZiAoY2VsbCAhPT0gbnVsbCkge1xuICAgICAgICB2YXIga2V5cyA9IHRoaXMua2V5cztcbiAgICAgICAgdmFyIGJib3hlcyA9IHRoaXMuYmJveGVzO1xuICAgICAgICBmb3IgKHZhciB1ID0gMDsgdSA8IGNlbGwubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgIHZhciB1aWQgPSBjZWxsW3VdO1xuICAgICAgICAgICAgaWYgKHNlZW5VaWRzW3VpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSB1aWQgKiA0O1xuICAgICAgICAgICAgICAgIGlmICgoeDEgPD0gYmJveGVzW29mZnNldCArIDJdKSAmJlxuICAgICAgICAgICAgICAgICAgICAoeTEgPD0gYmJveGVzW29mZnNldCArIDNdKSAmJlxuICAgICAgICAgICAgICAgICAgICAoeDIgPj0gYmJveGVzW29mZnNldCArIDBdKSAmJlxuICAgICAgICAgICAgICAgICAgICAoeTIgPj0gYmJveGVzW29mZnNldCArIDFdKSkge1xuICAgICAgICAgICAgICAgICAgICBzZWVuVWlkc1t1aWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goa2V5c1t1aWRdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZWVuVWlkc1t1aWRdID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5fZm9yRWFjaENlbGwgPSBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MiwgZm4sIGFyZzEsIGFyZzIpIHtcbiAgICB2YXIgY3gxID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHgxKTtcbiAgICB2YXIgY3kxID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHkxKTtcbiAgICB2YXIgY3gyID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHgyKTtcbiAgICB2YXIgY3kyID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHkyKTtcbiAgICBmb3IgKHZhciB4ID0gY3gxOyB4IDw9IGN4MjsgeCsrKSB7XG4gICAgICAgIGZvciAodmFyIHkgPSBjeTE7IHkgPD0gY3kyOyB5KyspIHtcbiAgICAgICAgICAgIHZhciBjZWxsSW5kZXggPSB0aGlzLmQgKiB5ICsgeDtcbiAgICAgICAgICAgIGlmIChmbi5jYWxsKHRoaXMsIHgxLCB5MSwgeDIsIHkyLCBjZWxsSW5kZXgsIGFyZzEsIGFyZzIpKSByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5HcmlkSW5kZXgucHJvdG90eXBlLl9jb252ZXJ0VG9DZWxsQ29vcmQgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMuZCAtIDEsIE1hdGguZmxvb3IoeCAqIHRoaXMuc2NhbGUpICsgdGhpcy5wYWRkaW5nKSk7XG59O1xuXG5HcmlkSW5kZXgucHJvdG90eXBlLnRvQXJyYXlCdWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5hcnJheUJ1ZmZlcikgcmV0dXJuIHRoaXMuYXJyYXlCdWZmZXI7XG5cbiAgICB2YXIgY2VsbHMgPSB0aGlzLmNlbGxzO1xuXG4gICAgdmFyIG1ldGFkYXRhTGVuZ3RoID0gTlVNX1BBUkFNUyArIHRoaXMuY2VsbHMubGVuZ3RoICsgMSArIDE7XG4gICAgdmFyIHRvdGFsQ2VsbExlbmd0aCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRvdGFsQ2VsbExlbmd0aCArPSB0aGlzLmNlbGxzW2ldLmxlbmd0aDtcbiAgICB9XG5cbiAgICB2YXIgYXJyYXkgPSBuZXcgSW50MzJBcnJheShtZXRhZGF0YUxlbmd0aCArIHRvdGFsQ2VsbExlbmd0aCArIHRoaXMua2V5cy5sZW5ndGggKyB0aGlzLmJib3hlcy5sZW5ndGgpO1xuICAgIGFycmF5WzBdID0gdGhpcy5leHRlbnQ7XG4gICAgYXJyYXlbMV0gPSB0aGlzLm47XG4gICAgYXJyYXlbMl0gPSB0aGlzLnBhZGRpbmc7XG5cbiAgICB2YXIgb2Zmc2V0ID0gbWV0YWRhdGFMZW5ndGg7XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBjZWxscy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgY2VsbCA9IGNlbGxzW2tdO1xuICAgICAgICBhcnJheVtOVU1fUEFSQU1TICsga10gPSBvZmZzZXQ7XG4gICAgICAgIGFycmF5LnNldChjZWxsLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gY2VsbC5sZW5ndGg7XG4gICAgfVxuXG4gICAgYXJyYXlbTlVNX1BBUkFNUyArIGNlbGxzLmxlbmd0aF0gPSBvZmZzZXQ7XG4gICAgYXJyYXkuc2V0KHRoaXMua2V5cywgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gdGhpcy5rZXlzLmxlbmd0aDtcblxuICAgIGFycmF5W05VTV9QQVJBTVMgKyBjZWxscy5sZW5ndGggKyAxXSA9IG9mZnNldDtcbiAgICBhcnJheS5zZXQodGhpcy5iYm94ZXMsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IHRoaXMuYmJveGVzLmxlbmd0aDtcblxuICAgIHJldHVybiBhcnJheS5idWZmZXI7XG59O1xuIiwiZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gZSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IG0gKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAodmFsdWUgKiBjIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzb3J0ID0gcmVxdWlyZSgnLi9zb3J0Jyk7XG52YXIgcmFuZ2UgPSByZXF1aXJlKCcuL3JhbmdlJyk7XG52YXIgd2l0aGluID0gcmVxdWlyZSgnLi93aXRoaW4nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBrZGJ1c2g7XG5cbmZ1bmN0aW9uIGtkYnVzaChwb2ludHMsIGdldFgsIGdldFksIG5vZGVTaXplLCBBcnJheVR5cGUpIHtcbiAgICByZXR1cm4gbmV3IEtEQnVzaChwb2ludHMsIGdldFgsIGdldFksIG5vZGVTaXplLCBBcnJheVR5cGUpO1xufVxuXG5mdW5jdGlvbiBLREJ1c2gocG9pbnRzLCBnZXRYLCBnZXRZLCBub2RlU2l6ZSwgQXJyYXlUeXBlKSB7XG4gICAgZ2V0WCA9IGdldFggfHwgZGVmYXVsdEdldFg7XG4gICAgZ2V0WSA9IGdldFkgfHwgZGVmYXVsdEdldFk7XG4gICAgQXJyYXlUeXBlID0gQXJyYXlUeXBlIHx8IEFycmF5O1xuXG4gICAgdGhpcy5ub2RlU2l6ZSA9IG5vZGVTaXplIHx8IDY0O1xuICAgIHRoaXMucG9pbnRzID0gcG9pbnRzO1xuXG4gICAgdGhpcy5pZHMgPSBuZXcgQXJyYXlUeXBlKHBvaW50cy5sZW5ndGgpO1xuICAgIHRoaXMuY29vcmRzID0gbmV3IEFycmF5VHlwZShwb2ludHMubGVuZ3RoICogMik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmlkc1tpXSA9IGk7XG4gICAgICAgIHRoaXMuY29vcmRzWzIgKiBpXSA9IGdldFgocG9pbnRzW2ldKTtcbiAgICAgICAgdGhpcy5jb29yZHNbMiAqIGkgKyAxXSA9IGdldFkocG9pbnRzW2ldKTtcbiAgICB9XG5cbiAgICBzb3J0KHRoaXMuaWRzLCB0aGlzLmNvb3JkcywgdGhpcy5ub2RlU2l6ZSwgMCwgdGhpcy5pZHMubGVuZ3RoIC0gMSwgMCk7XG59XG5cbktEQnVzaC5wcm90b3R5cGUgPSB7XG4gICAgcmFuZ2U6IGZ1bmN0aW9uIChtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZKSB7XG4gICAgICAgIHJldHVybiByYW5nZSh0aGlzLmlkcywgdGhpcy5jb29yZHMsIG1pblgsIG1pblksIG1heFgsIG1heFksIHRoaXMubm9kZVNpemUpO1xuICAgIH0sXG5cbiAgICB3aXRoaW46IGZ1bmN0aW9uICh4LCB5LCByKSB7XG4gICAgICAgIHJldHVybiB3aXRoaW4odGhpcy5pZHMsIHRoaXMuY29vcmRzLCB4LCB5LCByLCB0aGlzLm5vZGVTaXplKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBkZWZhdWx0R2V0WChwKSB7IHJldHVybiBwWzBdOyB9XG5mdW5jdGlvbiBkZWZhdWx0R2V0WShwKSB7IHJldHVybiBwWzFdOyB9XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmFuZ2U7XG5cbmZ1bmN0aW9uIHJhbmdlKGlkcywgY29vcmRzLCBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCBub2RlU2l6ZSkge1xuICAgIHZhciBzdGFjayA9IFswLCBpZHMubGVuZ3RoIC0gMSwgMF07XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciB4LCB5O1xuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICB2YXIgYXhpcyA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB2YXIgcmlnaHQgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgdmFyIGxlZnQgPSBzdGFjay5wb3AoKTtcblxuICAgICAgICBpZiAocmlnaHQgLSBsZWZ0IDw9IG5vZGVTaXplKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gbGVmdDsgaSA8PSByaWdodDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgeCA9IGNvb3Jkc1syICogaV07XG4gICAgICAgICAgICAgICAgeSA9IGNvb3Jkc1syICogaSArIDFdO1xuICAgICAgICAgICAgICAgIGlmICh4ID49IG1pblggJiYgeCA8PSBtYXhYICYmIHkgPj0gbWluWSAmJiB5IDw9IG1heFkpIHJlc3VsdC5wdXNoKGlkc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtID0gTWF0aC5mbG9vcigobGVmdCArIHJpZ2h0KSAvIDIpO1xuXG4gICAgICAgIHggPSBjb29yZHNbMiAqIG1dO1xuICAgICAgICB5ID0gY29vcmRzWzIgKiBtICsgMV07XG5cbiAgICAgICAgaWYgKHggPj0gbWluWCAmJiB4IDw9IG1heFggJiYgeSA+PSBtaW5ZICYmIHkgPD0gbWF4WSkgcmVzdWx0LnB1c2goaWRzW21dKTtcblxuICAgICAgICB2YXIgbmV4dEF4aXMgPSAoYXhpcyArIDEpICUgMjtcblxuICAgICAgICBpZiAoYXhpcyA9PT0gMCA/IG1pblggPD0geCA6IG1pblkgPD0geSkge1xuICAgICAgICAgICAgc3RhY2sucHVzaChsZWZ0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSAtIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXh0QXhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF4aXMgPT09IDAgPyBtYXhYID49IHggOiBtYXhZID49IHkpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSArIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChyaWdodCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG5leHRBeGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gc29ydEtEO1xuXG5mdW5jdGlvbiBzb3J0S0QoaWRzLCBjb29yZHMsIG5vZGVTaXplLCBsZWZ0LCByaWdodCwgZGVwdGgpIHtcbiAgICBpZiAocmlnaHQgLSBsZWZ0IDw9IG5vZGVTaXplKSByZXR1cm47XG5cbiAgICB2YXIgbSA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcblxuICAgIHNlbGVjdChpZHMsIGNvb3JkcywgbSwgbGVmdCwgcmlnaHQsIGRlcHRoICUgMik7XG5cbiAgICBzb3J0S0QoaWRzLCBjb29yZHMsIG5vZGVTaXplLCBsZWZ0LCBtIC0gMSwgZGVwdGggKyAxKTtcbiAgICBzb3J0S0QoaWRzLCBjb29yZHMsIG5vZGVTaXplLCBtICsgMSwgcmlnaHQsIGRlcHRoICsgMSk7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdChpZHMsIGNvb3JkcywgaywgbGVmdCwgcmlnaHQsIGluYykge1xuXG4gICAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkge1xuICAgICAgICBpZiAocmlnaHQgLSBsZWZ0ID4gNjAwKSB7XG4gICAgICAgICAgICB2YXIgbiA9IHJpZ2h0IC0gbGVmdCArIDE7XG4gICAgICAgICAgICB2YXIgbSA9IGsgLSBsZWZ0ICsgMTtcbiAgICAgICAgICAgIHZhciB6ID0gTWF0aC5sb2cobik7XG4gICAgICAgICAgICB2YXIgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7XG4gICAgICAgICAgICB2YXIgc2QgPSAwLjUgKiBNYXRoLnNxcnQoeiAqIHMgKiAobiAtIHMpIC8gbikgKiAobSAtIG4gLyAyIDwgMCA/IC0xIDogMSk7XG4gICAgICAgICAgICB2YXIgbmV3TGVmdCA9IE1hdGgubWF4KGxlZnQsIE1hdGguZmxvb3IoayAtIG0gKiBzIC8gbiArIHNkKSk7XG4gICAgICAgICAgICB2YXIgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTtcbiAgICAgICAgICAgIHNlbGVjdChpZHMsIGNvb3JkcywgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGluYyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdCA9IGNvb3Jkc1syICogayArIGluY107XG4gICAgICAgIHZhciBpID0gbGVmdDtcbiAgICAgICAgdmFyIGogPSByaWdodDtcblxuICAgICAgICBzd2FwSXRlbShpZHMsIGNvb3JkcywgbGVmdCwgayk7XG4gICAgICAgIGlmIChjb29yZHNbMiAqIHJpZ2h0ICsgaW5jXSA+IHQpIHN3YXBJdGVtKGlkcywgY29vcmRzLCBsZWZ0LCByaWdodCk7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBqKSB7XG4gICAgICAgICAgICBzd2FwSXRlbShpZHMsIGNvb3JkcywgaSwgaik7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBqLS07XG4gICAgICAgICAgICB3aGlsZSAoY29vcmRzWzIgKiBpICsgaW5jXSA8IHQpIGkrKztcbiAgICAgICAgICAgIHdoaWxlIChjb29yZHNbMiAqIGogKyBpbmNdID4gdCkgai0tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvb3Jkc1syICogbGVmdCArIGluY10gPT09IHQpIHN3YXBJdGVtKGlkcywgY29vcmRzLCBsZWZ0LCBqKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBqKys7XG4gICAgICAgICAgICBzd2FwSXRlbShpZHMsIGNvb3JkcywgaiwgcmlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGogPD0gaykgbGVmdCA9IGogKyAxO1xuICAgICAgICBpZiAoayA8PSBqKSByaWdodCA9IGogLSAxO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc3dhcEl0ZW0oaWRzLCBjb29yZHMsIGksIGopIHtcbiAgICBzd2FwKGlkcywgaSwgaik7XG4gICAgc3dhcChjb29yZHMsIDIgKiBpLCAyICogaik7XG4gICAgc3dhcChjb29yZHMsIDIgKiBpICsgMSwgMiAqIGogKyAxKTtcbn1cblxuZnVuY3Rpb24gc3dhcChhcnIsIGksIGopIHtcbiAgICB2YXIgdG1wID0gYXJyW2ldO1xuICAgIGFycltpXSA9IGFycltqXTtcbiAgICBhcnJbal0gPSB0bXA7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gd2l0aGluO1xuXG5mdW5jdGlvbiB3aXRoaW4oaWRzLCBjb29yZHMsIHF4LCBxeSwgciwgbm9kZVNpemUpIHtcbiAgICB2YXIgc3RhY2sgPSBbMCwgaWRzLmxlbmd0aCAtIDEsIDBdO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgcjIgPSByICogcjtcblxuICAgIHdoaWxlIChzdGFjay5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGF4aXMgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgdmFyIHJpZ2h0ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIHZhciBsZWZ0ID0gc3RhY2sucG9wKCk7XG5cbiAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCA8PSBub2RlU2l6ZSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGxlZnQ7IGkgPD0gcmlnaHQ7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChzcURpc3QoY29vcmRzWzIgKiBpXSwgY29vcmRzWzIgKiBpICsgMV0sIHF4LCBxeSkgPD0gcjIpIHJlc3VsdC5wdXNoKGlkc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtID0gTWF0aC5mbG9vcigobGVmdCArIHJpZ2h0KSAvIDIpO1xuXG4gICAgICAgIHZhciB4ID0gY29vcmRzWzIgKiBtXTtcbiAgICAgICAgdmFyIHkgPSBjb29yZHNbMiAqIG0gKyAxXTtcblxuICAgICAgICBpZiAoc3FEaXN0KHgsIHksIHF4LCBxeSkgPD0gcjIpIHJlc3VsdC5wdXNoKGlkc1ttXSk7XG5cbiAgICAgICAgdmFyIG5leHRBeGlzID0gKGF4aXMgKyAxKSAlIDI7XG5cbiAgICAgICAgaWYgKGF4aXMgPT09IDAgPyBxeCAtIHIgPD0geCA6IHF5IC0gciA8PSB5KSB7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGxlZnQpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChtIC0gMSk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG5leHRBeGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXhpcyA9PT0gMCA/IHF4ICsgciA+PSB4IDogcXkgKyByID49IHkpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSArIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChyaWdodCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG5leHRBeGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHNxRGlzdChheCwgYXksIGJ4LCBieSkge1xuICAgIHZhciBkeCA9IGF4IC0gYng7XG4gICAgdmFyIGR5ID0gYXkgLSBieTtcbiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUGJmO1xuXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKTtcblxuZnVuY3Rpb24gUGJmKGJ1Zikge1xuICAgIHRoaXMuYnVmID0gQXJyYXlCdWZmZXIuaXNWaWV3ICYmIEFycmF5QnVmZmVyLmlzVmlldyhidWYpID8gYnVmIDogbmV3IFVpbnQ4QXJyYXkoYnVmIHx8IDApO1xuICAgIHRoaXMucG9zID0gMDtcbiAgICB0aGlzLnR5cGUgPSAwO1xuICAgIHRoaXMubGVuZ3RoID0gdGhpcy5idWYubGVuZ3RoO1xufVxuXG5QYmYuVmFyaW50ICA9IDA7IC8vIHZhcmludDogaW50MzIsIGludDY0LCB1aW50MzIsIHVpbnQ2NCwgc2ludDMyLCBzaW50NjQsIGJvb2wsIGVudW1cblBiZi5GaXhlZDY0ID0gMTsgLy8gNjQtYml0OiBkb3VibGUsIGZpeGVkNjQsIHNmaXhlZDY0XG5QYmYuQnl0ZXMgICA9IDI7IC8vIGxlbmd0aC1kZWxpbWl0ZWQ6IHN0cmluZywgYnl0ZXMsIGVtYmVkZGVkIG1lc3NhZ2VzLCBwYWNrZWQgcmVwZWF0ZWQgZmllbGRzXG5QYmYuRml4ZWQzMiA9IDU7IC8vIDMyLWJpdDogZmxvYXQsIGZpeGVkMzIsIHNmaXhlZDMyXG5cbnZhciBTSElGVF9MRUZUXzMyID0gKDEgPDwgMTYpICogKDEgPDwgMTYpLFxuICAgIFNISUZUX1JJR0hUXzMyID0gMSAvIFNISUZUX0xFRlRfMzI7XG5cblBiZi5wcm90b3R5cGUgPSB7XG5cbiAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5idWYgPSBudWxsO1xuICAgIH0sXG5cbiAgICAvLyA9PT0gUkVBRElORyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgcmVhZEZpZWxkczogZnVuY3Rpb24ocmVhZEZpZWxkLCByZXN1bHQsIGVuZCkge1xuICAgICAgICBlbmQgPSBlbmQgfHwgdGhpcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5yZWFkVmFyaW50KCksXG4gICAgICAgICAgICAgICAgdGFnID0gdmFsID4+IDMsXG4gICAgICAgICAgICAgICAgc3RhcnRQb3MgPSB0aGlzLnBvcztcblxuICAgICAgICAgICAgdGhpcy50eXBlID0gdmFsICYgMHg3O1xuICAgICAgICAgICAgcmVhZEZpZWxkKHRhZywgcmVzdWx0LCB0aGlzKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucG9zID09PSBzdGFydFBvcykgdGhpcy5za2lwKHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgcmVhZE1lc3NhZ2U6IGZ1bmN0aW9uKHJlYWRGaWVsZCwgcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRGaWVsZHMocmVhZEZpZWxkLCByZXN1bHQsIHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MpO1xuICAgIH0sXG5cbiAgICByZWFkRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSByZWFkVUludDMyKHRoaXMuYnVmLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRTRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSByZWFkSW50MzIodGhpcy5idWYsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgLy8gNjQtYml0IGludCBoYW5kbGluZyBpcyBiYXNlZCBvbiBnaXRodWIuY29tL2Rwdy9ub2RlLWJ1ZmZlci1tb3JlLWludHMgKE1JVC1saWNlbnNlZClcblxuICAgIHJlYWRGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHJlYWRVSW50MzIodGhpcy5idWYsIHRoaXMucG9zKSArIHJlYWRVSW50MzIodGhpcy5idWYsIHRoaXMucG9zICsgNCkgKiBTSElGVF9MRUZUXzMyO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkU0ZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gcmVhZFVJbnQzMih0aGlzLmJ1ZiwgdGhpcy5wb3MpICsgcmVhZEludDMyKHRoaXMuYnVmLCB0aGlzLnBvcyArIDQpICogU0hJRlRfTEVGVF8zMjtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZEZsb2F0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IGllZWU3NTQucmVhZCh0aGlzLmJ1ZiwgdGhpcy5wb3MsIHRydWUsIDIzLCA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZERvdWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSBpZWVlNzU0LnJlYWQodGhpcy5idWYsIHRoaXMucG9zLCB0cnVlLCA1MiwgOCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRWYXJpbnQ6IGZ1bmN0aW9uKGlzU2lnbmVkKSB7XG4gICAgICAgIHZhciBidWYgPSB0aGlzLmJ1ZixcbiAgICAgICAgICAgIHZhbCwgYjtcblxuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgID0gIGIgJiAweDdmOyAgICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgfD0gKGIgJiAweDdmKSA8PCA3OyAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgfD0gKGIgJiAweDdmKSA8PCAxNDsgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgfD0gKGIgJiAweDdmKSA8PCAyMTsgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zXTsgICB2YWwgfD0gKGIgJiAweDBmKSA8PCAyODtcblxuICAgICAgICByZXR1cm4gcmVhZFZhcmludFJlbWFpbmRlcih2YWwsIGlzU2lnbmVkLCB0aGlzKTtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDY0OiBmdW5jdGlvbigpIHsgLy8gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2Mi4wLjFcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFZhcmludCh0cnVlKTtcbiAgICB9LFxuXG4gICAgcmVhZFNWYXJpbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbnVtID0gdGhpcy5yZWFkVmFyaW50KCk7XG4gICAgICAgIHJldHVybiBudW0gJSAyID09PSAxID8gKG51bSArIDEpIC8gLTIgOiBudW0gLyAyOyAvLyB6aWd6YWcgZW5jb2RpbmdcbiAgICB9LFxuXG4gICAgcmVhZEJvb2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLnJlYWRWYXJpbnQoKSk7XG4gICAgfSxcblxuICAgIHJlYWRTdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcyxcbiAgICAgICAgICAgIHN0ciA9IHJlYWRVdGY4KHRoaXMuYnVmLCB0aGlzLnBvcywgZW5kKTtcbiAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfSxcblxuICAgIHJlYWRCeXRlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLFxuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5idWYuc3ViYXJyYXkodGhpcy5wb3MsIGVuZCk7XG4gICAgICAgIHRoaXMucG9zID0gZW5kO1xuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH0sXG5cbiAgICAvLyB2ZXJib3NlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOyBkb2Vzbid0IGFmZmVjdCBnemlwcGVkIHNpemVcblxuICAgIHJlYWRQYWNrZWRWYXJpbnQ6IGZ1bmN0aW9uKGFyciwgaXNTaWduZWQpIHtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgICAgIGFyciA9IGFyciB8fCBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRWYXJpbnQoaXNTaWduZWQpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRTVmFyaW50OiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgICAgIGFyciA9IGFyciB8fCBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEJvb2xlYW46IGZ1bmN0aW9uKGFycikge1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEJvb2xlYW4oKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRmxvYXQ6IGZ1bmN0aW9uKGFycikge1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZsb2F0KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZERvdWJsZTogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRG91YmxlKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEZpeGVkMzI6IGZ1bmN0aW9uKGFycikge1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkMzIoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU0ZpeGVkMzI6IGZ1bmN0aW9uKGFycikge1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDMyKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEZpeGVkNjQ6IGZ1bmN0aW9uKGFycikge1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKGFycikge1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG5cbiAgICBza2lwOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdmFyIHR5cGUgPSB2YWwgJiAweDc7XG4gICAgICAgIGlmICh0eXBlID09PSBQYmYuVmFyaW50KSB3aGlsZSAodGhpcy5idWZbdGhpcy5wb3MrK10gPiAweDdmKSB7fVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuQnl0ZXMpIHRoaXMucG9zID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcztcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkZpeGVkMzIpIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5GaXhlZDY0KSB0aGlzLnBvcyArPSA4O1xuICAgICAgICBlbHNlIHRocm93IG5ldyBFcnJvcignVW5pbXBsZW1lbnRlZCB0eXBlOiAnICsgdHlwZSk7XG4gICAgfSxcblxuICAgIC8vID09PSBXUklUSU5HID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICB3cml0ZVRhZzogZnVuY3Rpb24odGFnLCB0eXBlKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQoKHRhZyA8PCAzKSB8IHR5cGUpO1xuICAgIH0sXG5cbiAgICByZWFsbG9jOiBmdW5jdGlvbihtaW4pIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHx8IDE2O1xuXG4gICAgICAgIHdoaWxlIChsZW5ndGggPCB0aGlzLnBvcyArIG1pbikgbGVuZ3RoICo9IDI7XG5cbiAgICAgICAgaWYgKGxlbmd0aCAhPT0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICAgICAgICAgICAgYnVmLnNldCh0aGlzLmJ1Zik7XG4gICAgICAgICAgICB0aGlzLmJ1ZiA9IGJ1ZjtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5wb3M7XG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLnN1YmFycmF5KDAsIHRoaXMubGVuZ3RoKTtcbiAgICB9LFxuXG4gICAgd3JpdGVGaXhlZDMyOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB3cml0ZUludDMyKHRoaXMuYnVmLCB2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICB9LFxuXG4gICAgd3JpdGVTRml4ZWQzMjogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgd3JpdGVJbnQzMih0aGlzLmJ1ZiwgdmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlRml4ZWQ2NDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgd3JpdGVJbnQzMih0aGlzLmJ1ZiwgdmFsICYgLTEsIHRoaXMucG9zKTtcbiAgICAgICAgd3JpdGVJbnQzMih0aGlzLmJ1ZiwgTWF0aC5mbG9vcih2YWwgKiBTSElGVF9SSUdIVF8zMiksIHRoaXMucG9zICsgNCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgfSxcblxuICAgIHdyaXRlU0ZpeGVkNjQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoOCk7XG4gICAgICAgIHdyaXRlSW50MzIodGhpcy5idWYsIHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgICAgIHdyaXRlSW50MzIodGhpcy5idWYsIE1hdGguZmxvb3IodmFsICogU0hJRlRfUklHSFRfMzIpLCB0aGlzLnBvcyArIDQpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgIH0sXG5cbiAgICB3cml0ZVZhcmludDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHZhbCA9ICt2YWwgfHwgMDtcblxuICAgICAgICBpZiAodmFsID4gMHhmZmZmZmZmIHx8IHZhbCA8IDApIHtcbiAgICAgICAgICAgIHdyaXRlQmlnVmFyaW50KHZhbCwgdGhpcyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG5cbiAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAgICAgICAgICAgdmFsICYgMHg3ZiAgfCAodmFsID4gMHg3ZiA/IDB4ODAgOiAwKTsgaWYgKHZhbCA8PSAweDdmKSByZXR1cm47XG4gICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+PSA3KSAmIDB4N2YpIHwgKHZhbCA+IDB4N2YgPyAweDgwIDogMCk7IGlmICh2YWwgPD0gMHg3ZikgcmV0dXJuO1xuICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+Pj0gNykgJiAweDdmKSB8ICh2YWwgPiAweDdmID8gMHg4MCA6IDApOyBpZiAodmFsIDw9IDB4N2YpIHJldHVybjtcbiAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAgICh2YWwgPj4+IDcpICYgMHg3ZjtcbiAgICB9LFxuXG4gICAgd3JpdGVTVmFyaW50OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCh2YWwgPCAwID8gLXZhbCAqIDIgLSAxIDogdmFsICogMik7XG4gICAgfSxcblxuICAgIHdyaXRlQm9vbGVhbjogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQoQm9vbGVhbih2YWwpKTtcbiAgICB9LFxuXG4gICAgd3JpdGVTdHJpbmc6IGZ1bmN0aW9uKHN0cikge1xuICAgICAgICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgICAgICAgdGhpcy5yZWFsbG9jKHN0ci5sZW5ndGggKiA0KTtcblxuICAgICAgICB0aGlzLnBvcysrOyAvLyByZXNlcnZlIDEgYnl0ZSBmb3Igc2hvcnQgc3RyaW5nIGxlbmd0aFxuXG4gICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMucG9zO1xuICAgICAgICAvLyB3cml0ZSB0aGUgc3RyaW5nIGRpcmVjdGx5IHRvIHRoZSBidWZmZXIgYW5kIHNlZSBob3cgbXVjaCB3YXMgd3JpdHRlblxuICAgICAgICB0aGlzLnBvcyA9IHdyaXRlVXRmOCh0aGlzLmJ1Ziwgc3RyLCB0aGlzLnBvcyk7XG4gICAgICAgIHZhciBsZW4gPSB0aGlzLnBvcyAtIHN0YXJ0UG9zO1xuXG4gICAgICAgIGlmIChsZW4gPj0gMHg4MCkgbWFrZVJvb21Gb3JFeHRyYUxlbmd0aChzdGFydFBvcywgbGVuLCB0aGlzKTtcblxuICAgICAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgbWVzc2FnZSBsZW5ndGggaW4gdGhlIHJlc2VydmVkIHBsYWNlIGFuZCByZXN0b3JlIHRoZSBwb3NpdGlvblxuICAgICAgICB0aGlzLnBvcyA9IHN0YXJ0UG9zIC0gMTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChsZW4pO1xuICAgICAgICB0aGlzLnBvcyArPSBsZW47XG4gICAgfSxcblxuICAgIHdyaXRlRmxvYXQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIGllZWU3NTQud3JpdGUodGhpcy5idWYsIHZhbCwgdGhpcy5wb3MsIHRydWUsIDIzLCA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICB9LFxuXG4gICAgd3JpdGVEb3VibGU6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoOCk7XG4gICAgICAgIGllZWU3NTQud3JpdGUodGhpcy5idWYsIHZhbCwgdGhpcy5wb3MsIHRydWUsIDUyLCA4KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVCeXRlczogZnVuY3Rpb24oYnVmZmVyKSB7XG4gICAgICAgIHZhciBsZW4gPSBidWZmZXIubGVuZ3RoO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGxlbik7XG4gICAgICAgIHRoaXMucmVhbGxvYyhsZW4pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9IGJ1ZmZlcltpXTtcbiAgICB9LFxuXG4gICAgd3JpdGVSYXdNZXNzYWdlOiBmdW5jdGlvbihmbiwgb2JqKSB7XG4gICAgICAgIHRoaXMucG9zKys7IC8vIHJlc2VydmUgMSBieXRlIGZvciBzaG9ydCBtZXNzYWdlIGxlbmd0aFxuXG4gICAgICAgIC8vIHdyaXRlIHRoZSBtZXNzYWdlIGRpcmVjdGx5IHRvIHRoZSBidWZmZXIgYW5kIHNlZSBob3cgbXVjaCB3YXMgd3JpdHRlblxuICAgICAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLnBvcztcbiAgICAgICAgZm4ob2JqLCB0aGlzKTtcbiAgICAgICAgdmFyIGxlbiA9IHRoaXMucG9zIC0gc3RhcnRQb3M7XG5cbiAgICAgICAgaWYgKGxlbiA+PSAweDgwKSBtYWtlUm9vbUZvckV4dHJhTGVuZ3RoKHN0YXJ0UG9zLCBsZW4sIHRoaXMpO1xuXG4gICAgICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSBtZXNzYWdlIGxlbmd0aCBpbiB0aGUgcmVzZXJ2ZWQgcGxhY2UgYW5kIHJlc3RvcmUgdGhlIHBvc2l0aW9uXG4gICAgICAgIHRoaXMucG9zID0gc3RhcnRQb3MgLSAxO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGxlbik7XG4gICAgICAgIHRoaXMucG9zICs9IGxlbjtcbiAgICB9LFxuXG4gICAgd3JpdGVNZXNzYWdlOiBmdW5jdGlvbih0YWcsIGZuLCBvYmopIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVSYXdNZXNzYWdlKGZuLCBvYmopO1xuICAgIH0sXG5cbiAgICB3cml0ZVBhY2tlZFZhcmludDogICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkVmFyaW50LCBhcnIpOyAgIH0sXG4gICAgd3JpdGVQYWNrZWRTVmFyaW50OiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNWYXJpbnQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkQm9vbGVhbjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRCb29sZWFuLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZEZsb2F0OiAgICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRmxvYXQsIGFycik7ICAgIH0sXG4gICAgd3JpdGVQYWNrZWREb3VibGU6ICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZERvdWJsZSwgYXJyKTsgICB9LFxuICAgIHdyaXRlUGFja2VkRml4ZWQzMjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGaXhlZDMyLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZFNGaXhlZDMyOiBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU0ZpeGVkMzIsIGFycik7IH0sXG4gICAgd3JpdGVQYWNrZWRGaXhlZDY0OiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZpeGVkNjQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTRml4ZWQ2NCwgYXJyKTsgfSxcblxuICAgIHdyaXRlQnl0ZXNGaWVsZDogZnVuY3Rpb24odGFnLCBidWZmZXIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVCeXRlcyhidWZmZXIpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDMyKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQzMih2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDY0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQ2NCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlU1ZhcmludCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTdHJpbmdGaWVsZDogZnVuY3Rpb24odGFnLCBzdHIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVTdHJpbmcoc3RyKTtcbiAgICB9LFxuICAgIHdyaXRlRmxvYXRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDMyKTtcbiAgICAgICAgdGhpcy53cml0ZUZsb2F0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZURvdWJsZUZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlRG91YmxlKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZUJvb2xlYW5GaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludEZpZWxkKHRhZywgQm9vbGVhbih2YWwpKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiByZWFkVmFyaW50UmVtYWluZGVyKGwsIHMsIHApIHtcbiAgICB2YXIgYnVmID0gcC5idWYsXG4gICAgICAgIGgsIGI7XG5cbiAgICBiID0gYnVmW3AucG9zKytdOyBoICA9IChiICYgMHg3MCkgPj4gNDsgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHRvTnVtKGwsIGgsIHMpO1xuICAgIGIgPSBidWZbcC5wb3MrK107IGggfD0gKGIgJiAweDdmKSA8PCAzOyAgaWYgKGIgPCAweDgwKSByZXR1cm4gdG9OdW0obCwgaCwgcyk7XG4gICAgYiA9IGJ1ZltwLnBvcysrXTsgaCB8PSAoYiAmIDB4N2YpIDw8IDEwOyBpZiAoYiA8IDB4ODApIHJldHVybiB0b051bShsLCBoLCBzKTtcbiAgICBiID0gYnVmW3AucG9zKytdOyBoIHw9IChiICYgMHg3ZikgPDwgMTc7IGlmIChiIDwgMHg4MCkgcmV0dXJuIHRvTnVtKGwsIGgsIHMpO1xuICAgIGIgPSBidWZbcC5wb3MrK107IGggfD0gKGIgJiAweDdmKSA8PCAyNDsgaWYgKGIgPCAweDgwKSByZXR1cm4gdG9OdW0obCwgaCwgcyk7XG4gICAgYiA9IGJ1ZltwLnBvcysrXTsgaCB8PSAoYiAmIDB4MDEpIDw8IDMxOyBpZiAoYiA8IDB4ODApIHJldHVybiB0b051bShsLCBoLCBzKTtcblxuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXMnKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2tlZEVuZChwYmYpIHtcbiAgICByZXR1cm4gcGJmLnR5cGUgPT09IFBiZi5CeXRlcyA/XG4gICAgICAgIHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zIDogcGJmLnBvcyArIDE7XG59XG5cbmZ1bmN0aW9uIHRvTnVtKGxvdywgaGlnaCwgaXNTaWduZWQpIHtcbiAgICBpZiAoaXNTaWduZWQpIHtcbiAgICAgICAgcmV0dXJuIGhpZ2ggKiAweDEwMDAwMDAwMCArIChsb3cgPj4+IDApO1xuICAgIH1cblxuICAgIHJldHVybiAoKGhpZ2ggPj4+IDApICogMHgxMDAwMDAwMDApICsgKGxvdyA+Pj4gMCk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlQmlnVmFyaW50KHZhbCwgcGJmKSB7XG4gICAgdmFyIGxvdywgaGlnaDtcblxuICAgIGlmICh2YWwgPj0gMCkge1xuICAgICAgICBsb3cgID0gKHZhbCAlIDB4MTAwMDAwMDAwKSB8IDA7XG4gICAgICAgIGhpZ2ggPSAodmFsIC8gMHgxMDAwMDAwMDApIHwgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsb3cgID0gfigtdmFsICUgMHgxMDAwMDAwMDApO1xuICAgICAgICBoaWdoID0gfigtdmFsIC8gMHgxMDAwMDAwMDApO1xuXG4gICAgICAgIGlmIChsb3cgXiAweGZmZmZmZmZmKSB7XG4gICAgICAgICAgICBsb3cgPSAobG93ICsgMSkgfCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG93ID0gMDtcbiAgICAgICAgICAgIGhpZ2ggPSAoaGlnaCArIDEpIHwgMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWwgPj0gMHgxMDAwMDAwMDAwMDAwMDAwMCB8fCB2YWwgPCAtMHgxMDAwMDAwMDAwMDAwMDAwMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdmVuIHZhcmludCBkb2VzblxcJ3QgZml0IGludG8gMTAgYnl0ZXMnKTtcbiAgICB9XG5cbiAgICBwYmYucmVhbGxvYygxMCk7XG5cbiAgICB3cml0ZUJpZ1ZhcmludExvdyhsb3csIGhpZ2gsIHBiZik7XG4gICAgd3JpdGVCaWdWYXJpbnRIaWdoKGhpZ2gsIHBiZik7XG59XG5cbmZ1bmN0aW9uIHdyaXRlQmlnVmFyaW50TG93KGxvdywgaGlnaCwgcGJmKSB7XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdID0gbG93ICYgMHg3ZiB8IDB4ODA7IGxvdyA+Pj49IDc7XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdID0gbG93ICYgMHg3ZiB8IDB4ODA7IGxvdyA+Pj49IDc7XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdID0gbG93ICYgMHg3ZiB8IDB4ODA7IGxvdyA+Pj49IDc7XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdID0gbG93ICYgMHg3ZiB8IDB4ODA7IGxvdyA+Pj49IDc7XG4gICAgcGJmLmJ1ZltwYmYucG9zXSAgID0gbG93ICYgMHg3Zjtcbn1cblxuZnVuY3Rpb24gd3JpdGVCaWdWYXJpbnRIaWdoKGhpZ2gsIHBiZikge1xuICAgIHZhciBsc2IgPSAoaGlnaCAmIDB4MDcpIDw8IDQ7XG5cbiAgICBwYmYuYnVmW3BiZi5wb3MrK10gfD0gbHNiICAgICAgICAgfCAoKGhpZ2ggPj4+PSAzKSA/IDB4ODAgOiAwKTsgaWYgKCFoaWdoKSByZXR1cm47XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdICA9IGhpZ2ggJiAweDdmIHwgKChoaWdoID4+Pj0gNykgPyAweDgwIDogMCk7IGlmICghaGlnaCkgcmV0dXJuO1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSAgPSBoaWdoICYgMHg3ZiB8ICgoaGlnaCA+Pj49IDcpID8gMHg4MCA6IDApOyBpZiAoIWhpZ2gpIHJldHVybjtcbiAgICBwYmYuYnVmW3BiZi5wb3MrK10gID0gaGlnaCAmIDB4N2YgfCAoKGhpZ2ggPj4+PSA3KSA/IDB4ODAgOiAwKTsgaWYgKCFoaWdoKSByZXR1cm47XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdICA9IGhpZ2ggJiAweDdmIHwgKChoaWdoID4+Pj0gNykgPyAweDgwIDogMCk7IGlmICghaGlnaCkgcmV0dXJuO1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSAgPSBoaWdoICYgMHg3Zjtcbn1cblxuZnVuY3Rpb24gbWFrZVJvb21Gb3JFeHRyYUxlbmd0aChzdGFydFBvcywgbGVuLCBwYmYpIHtcbiAgICB2YXIgZXh0cmFMZW4gPVxuICAgICAgICBsZW4gPD0gMHgzZmZmID8gMSA6XG4gICAgICAgIGxlbiA8PSAweDFmZmZmZiA/IDIgOlxuICAgICAgICBsZW4gPD0gMHhmZmZmZmZmID8gMyA6IE1hdGguY2VpbChNYXRoLmxvZyhsZW4pIC8gKE1hdGguTE4yICogNykpO1xuXG4gICAgLy8gaWYgMSBieXRlIGlzbid0IGVub3VnaCBmb3IgZW5jb2RpbmcgbWVzc2FnZSBsZW5ndGgsIHNoaWZ0IHRoZSBkYXRhIHRvIHRoZSByaWdodFxuICAgIHBiZi5yZWFsbG9jKGV4dHJhTGVuKTtcbiAgICBmb3IgKHZhciBpID0gcGJmLnBvcyAtIDE7IGkgPj0gc3RhcnRQb3M7IGktLSkgcGJmLmJ1ZltpICsgZXh0cmFMZW5dID0gcGJmLmJ1ZltpXTtcbn1cblxuZnVuY3Rpb24gd3JpdGVQYWNrZWRWYXJpbnQoYXJyLCBwYmYpICAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlVmFyaW50KGFycltpXSk7ICAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRTVmFyaW50KGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlU1ZhcmludChhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRGbG9hdChhcnIsIHBiZikgICAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRmxvYXQoYXJyW2ldKTsgICAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWREb3VibGUoYXJyLCBwYmYpICAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRG91YmxlKGFycltpXSk7ICAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRCb29sZWFuKGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlQm9vbGVhbihhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRGaXhlZDMyKGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRml4ZWQzMihhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRTRml4ZWQzMihhcnIsIHBiZikgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlU0ZpeGVkMzIoYXJyW2ldKTsgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRGaXhlZDY0KGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRml4ZWQ2NChhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRTRml4ZWQ2NChhcnIsIHBiZikgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlU0ZpeGVkNjQoYXJyW2ldKTsgfVxuXG4vLyBCdWZmZXIgY29kZSBiZWxvdyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyLCBNSVQtbGljZW5zZWRcblxuZnVuY3Rpb24gcmVhZFVJbnQzMihidWYsIHBvcykge1xuICAgIHJldHVybiAoKGJ1Zltwb3NdKSB8XG4gICAgICAgIChidWZbcG9zICsgMV0gPDwgOCkgfFxuICAgICAgICAoYnVmW3BvcyArIDJdIDw8IDE2KSkgK1xuICAgICAgICAoYnVmW3BvcyArIDNdICogMHgxMDAwMDAwKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVJbnQzMihidWYsIHZhbCwgcG9zKSB7XG4gICAgYnVmW3Bvc10gPSB2YWw7XG4gICAgYnVmW3BvcyArIDFdID0gKHZhbCA+Pj4gOCk7XG4gICAgYnVmW3BvcyArIDJdID0gKHZhbCA+Pj4gMTYpO1xuICAgIGJ1Zltwb3MgKyAzXSA9ICh2YWwgPj4+IDI0KTtcbn1cblxuZnVuY3Rpb24gcmVhZEludDMyKGJ1ZiwgcG9zKSB7XG4gICAgcmV0dXJuICgoYnVmW3Bvc10pIHxcbiAgICAgICAgKGJ1Zltwb3MgKyAxXSA8PCA4KSB8XG4gICAgICAgIChidWZbcG9zICsgMl0gPDwgMTYpKSArXG4gICAgICAgIChidWZbcG9zICsgM10gPDwgMjQpO1xufVxuXG5mdW5jdGlvbiByZWFkVXRmOChidWYsIHBvcywgZW5kKSB7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIHZhciBpID0gcG9zO1xuXG4gICAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICAgICAgdmFyIGIwID0gYnVmW2ldO1xuICAgICAgICB2YXIgYyA9IG51bGw7IC8vIGNvZGVwb2ludFxuICAgICAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9XG4gICAgICAgICAgICBiMCA+IDB4RUYgPyA0IDpcbiAgICAgICAgICAgIGIwID4gMHhERiA/IDMgOlxuICAgICAgICAgICAgYjAgPiAweEJGID8gMiA6IDE7XG5cbiAgICAgICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlID4gZW5kKSBicmVhaztcblxuICAgICAgICB2YXIgYjEsIGIyLCBiMztcblxuICAgICAgICBpZiAoYnl0ZXNQZXJTZXF1ZW5jZSA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKGIwIDwgMHg4MCkge1xuICAgICAgICAgICAgICAgIGMgPSBiMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChieXRlc1BlclNlcXVlbmNlID09PSAyKSB7XG4gICAgICAgICAgICBiMSA9IGJ1ZltpICsgMV07XG4gICAgICAgICAgICBpZiAoKGIxICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgICAgICBjID0gKGIwICYgMHgxRikgPDwgMHg2IHwgKGIxICYgMHgzRik7XG4gICAgICAgICAgICAgICAgaWYgKGMgPD0gMHg3Rikge1xuICAgICAgICAgICAgICAgICAgICBjID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYnl0ZXNQZXJTZXF1ZW5jZSA9PT0gMykge1xuICAgICAgICAgICAgYjEgPSBidWZbaSArIDFdO1xuICAgICAgICAgICAgYjIgPSBidWZbaSArIDJdO1xuICAgICAgICAgICAgaWYgKChiMSAmIDB4QzApID09PSAweDgwICYmIChiMiAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICAgICAgYyA9IChiMCAmIDB4RikgPDwgMHhDIHwgKGIxICYgMHgzRikgPDwgMHg2IHwgKGIyICYgMHgzRik7XG4gICAgICAgICAgICAgICAgaWYgKGMgPD0gMHg3RkYgfHwgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhERkZGKSkge1xuICAgICAgICAgICAgICAgICAgICBjID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYnl0ZXNQZXJTZXF1ZW5jZSA9PT0gNCkge1xuICAgICAgICAgICAgYjEgPSBidWZbaSArIDFdO1xuICAgICAgICAgICAgYjIgPSBidWZbaSArIDJdO1xuICAgICAgICAgICAgYjMgPSBidWZbaSArIDNdO1xuICAgICAgICAgICAgaWYgKChiMSAmIDB4QzApID09PSAweDgwICYmIChiMiAmIDB4QzApID09PSAweDgwICYmIChiMyAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICAgICAgYyA9IChiMCAmIDB4RikgPDwgMHgxMiB8IChiMSAmIDB4M0YpIDw8IDB4QyB8IChiMiAmIDB4M0YpIDw8IDB4NiB8IChiMyAmIDB4M0YpO1xuICAgICAgICAgICAgICAgIGlmIChjIDw9IDB4RkZGRiB8fCBjID49IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjID09PSBudWxsKSB7XG4gICAgICAgICAgICBjID0gMHhGRkZEO1xuICAgICAgICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDE7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjID4gMHhGRkZGKSB7XG4gICAgICAgICAgICBjIC09IDB4MTAwMDA7XG4gICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKTtcbiAgICAgICAgICAgIGMgPSAweERDMDAgfCBjICYgMHgzRkY7XG4gICAgICAgIH1cblxuICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcbiAgICAgICAgaSArPSBieXRlc1BlclNlcXVlbmNlO1xuICAgIH1cblxuICAgIHJldHVybiBzdHI7XG59XG5cbmZ1bmN0aW9uIHdyaXRlVXRmOChidWYsIHN0ciwgcG9zKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGMsIGxlYWQ7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpOyAvLyBjb2RlIHBvaW50XG5cbiAgICAgICAgaWYgKGMgPiAweEQ3RkYgJiYgYyA8IDB4RTAwMCkge1xuICAgICAgICAgICAgaWYgKGxlYWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA8IDB4REMwMCkge1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gMHhFRjtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4QkY7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEJEO1xuICAgICAgICAgICAgICAgICAgICBsZWFkID0gYztcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IGxlYWQgLSAweEQ4MDAgPDwgMTAgfCBjIC0gMHhEQzAwIHwgMHgxMDAwMDtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA+IDB4REJGRiB8fCAoaSArIDEgPT09IHN0ci5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEVGO1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gMHhCRjtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4QkQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IGM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGxlYWQpIHtcbiAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEVGO1xuICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4QkY7XG4gICAgICAgICAgICBidWZbcG9zKytdID0gMHhCRDtcbiAgICAgICAgICAgIGxlYWQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAgICAgICBidWZbcG9zKytdID0gYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjIDwgMHg4MDApIHtcbiAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gYyA+PiAweDYgfCAweEMwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IGMgPj4gMHhDIHwgMHhFMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gYyA+PiAweDEyIHwgMHhGMDtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IGMgPj4gMHhDICYgMHgzRiB8IDB4ODA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSBjID4+IDB4NiAmIDB4M0YgfCAweDgwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVmW3BvcysrXSA9IGMgJiAweDNGIHwgMHg4MDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcG9zO1xufVxuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJ0aWFsU29ydDtcblxuLy8gRmxveWQtUml2ZXN0IHNlbGVjdGlvbiBhbGdvcml0aG06XG4vLyBSZWFycmFuZ2UgaXRlbXMgc28gdGhhdCBhbGwgaXRlbXMgaW4gdGhlIFtsZWZ0LCBrXSByYW5nZSBhcmUgc21hbGxlciB0aGFuIGFsbCBpdGVtcyBpbiAoaywgcmlnaHRdO1xuLy8gVGhlIGstdGggZWxlbWVudCB3aWxsIGhhdmUgdGhlIChrIC0gbGVmdCArIDEpdGggc21hbGxlc3QgdmFsdWUgaW4gW2xlZnQsIHJpZ2h0XVxuXG5mdW5jdGlvbiBwYXJ0aWFsU29ydChhcnIsIGssIGxlZnQsIHJpZ2h0LCBjb21wYXJlKSB7XG4gICAgbGVmdCA9IGxlZnQgfHwgMDtcbiAgICByaWdodCA9IHJpZ2h0IHx8IChhcnIubGVuZ3RoIC0gMSk7XG4gICAgY29tcGFyZSA9IGNvbXBhcmUgfHwgZGVmYXVsdENvbXBhcmU7XG5cbiAgICB3aGlsZSAocmlnaHQgPiBsZWZ0KSB7XG4gICAgICAgIGlmIChyaWdodCAtIGxlZnQgPiA2MDApIHtcbiAgICAgICAgICAgIHZhciBuID0gcmlnaHQgLSBsZWZ0ICsgMTtcbiAgICAgICAgICAgIHZhciBtID0gayAtIGxlZnQgKyAxO1xuICAgICAgICAgICAgdmFyIHogPSBNYXRoLmxvZyhuKTtcbiAgICAgICAgICAgIHZhciBzID0gMC41ICogTWF0aC5leHAoMiAqIHogLyAzKTtcbiAgICAgICAgICAgIHZhciBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgICAgICAgIHZhciBuZXdMZWZ0ID0gTWF0aC5tYXgobGVmdCwgTWF0aC5mbG9vcihrIC0gbSAqIHMgLyBuICsgc2QpKTtcbiAgICAgICAgICAgIHZhciBuZXdSaWdodCA9IE1hdGgubWluKHJpZ2h0LCBNYXRoLmZsb29yKGsgKyAobiAtIG0pICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgcGFydGlhbFNvcnQoYXJyLCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdCA9IGFycltrXTtcbiAgICAgICAgdmFyIGkgPSBsZWZ0O1xuICAgICAgICB2YXIgaiA9IHJpZ2h0O1xuXG4gICAgICAgIHN3YXAoYXJyLCBsZWZ0LCBrKTtcbiAgICAgICAgaWYgKGNvbXBhcmUoYXJyW3JpZ2h0XSwgdCkgPiAwKSBzd2FwKGFyciwgbGVmdCwgcmlnaHQpO1xuXG4gICAgICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgICAgICAgc3dhcChhcnIsIGksIGopO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyW2ldLCB0KSA8IDApIGkrKztcbiAgICAgICAgICAgIHdoaWxlIChjb21wYXJlKGFycltqXSwgdCkgPiAwKSBqLS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tcGFyZShhcnJbbGVmdF0sIHQpID09PSAwKSBzd2FwKGFyciwgbGVmdCwgaik7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaisrO1xuICAgICAgICAgICAgc3dhcChhcnIsIGosIHJpZ2h0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqIDw9IGspIGxlZnQgPSBqICsgMTtcbiAgICAgICAgaWYgKGsgPD0gaikgcmlnaHQgPSBqIC0gMTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHN3YXAoYXJyLCBpLCBqKSB7XG4gICAgdmFyIHRtcCA9IGFycltpXTtcbiAgICBhcnJbaV0gPSBhcnJbal07XG4gICAgYXJyW2pdID0gdG1wO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29tcGFyZShhLCBiKSB7XG4gICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIga2RidXNoID0gcmVxdWlyZSgna2RidXNoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc3VwZXJjbHVzdGVyO1xuXG5mdW5jdGlvbiBzdXBlcmNsdXN0ZXIob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgU3VwZXJDbHVzdGVyKG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBTdXBlckNsdXN0ZXIob3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IGV4dGVuZChPYmplY3QuY3JlYXRlKHRoaXMub3B0aW9ucyksIG9wdGlvbnMpO1xuICAgIHRoaXMudHJlZXMgPSBuZXcgQXJyYXkodGhpcy5vcHRpb25zLm1heFpvb20gKyAxKTtcbn1cblxuU3VwZXJDbHVzdGVyLnByb3RvdHlwZSA9IHtcbiAgICBvcHRpb25zOiB7XG4gICAgICAgIG1pblpvb206IDAsICAgLy8gbWluIHpvb20gdG8gZ2VuZXJhdGUgY2x1c3RlcnMgb25cbiAgICAgICAgbWF4Wm9vbTogMTYsICAvLyBtYXggem9vbSBsZXZlbCB0byBjbHVzdGVyIHRoZSBwb2ludHMgb25cbiAgICAgICAgcmFkaXVzOiA0MCwgICAvLyBjbHVzdGVyIHJhZGl1cyBpbiBwaXhlbHNcbiAgICAgICAgZXh0ZW50OiA1MTIsICAvLyB0aWxlIGV4dGVudCAocmFkaXVzIGlzIGNhbGN1bGF0ZWQgcmVsYXRpdmUgdG8gaXQpXG4gICAgICAgIG5vZGVTaXplOiA2NCwgLy8gc2l6ZSBvZiB0aGUgS0QtdHJlZSBsZWFmIG5vZGUsIGFmZmVjdHMgcGVyZm9ybWFuY2VcbiAgICAgICAgbG9nOiBmYWxzZSwgICAvLyB3aGV0aGVyIHRvIGxvZyB0aW1pbmcgaW5mb1xuXG4gICAgICAgIC8vIGEgcmVkdWNlIGZ1bmN0aW9uIGZvciBjYWxjdWxhdGluZyBjdXN0b20gY2x1c3RlciBwcm9wZXJ0aWVzXG4gICAgICAgIHJlZHVjZTogbnVsbCwgLy8gZnVuY3Rpb24gKGFjY3VtdWxhdGVkLCBwcm9wcykgeyBhY2N1bXVsYXRlZC5zdW0gKz0gcHJvcHMuc3VtOyB9XG5cbiAgICAgICAgLy8gaW5pdGlhbCBwcm9wZXJ0aWVzIG9mIGEgY2x1c3RlciAoYmVmb3JlIHJ1bm5pbmcgdGhlIHJlZHVjZXIpXG4gICAgICAgIGluaXRpYWw6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHt9OyB9LCAvLyBmdW5jdGlvbiAoKSB7IHJldHVybiB7c3VtOiAwfTsgfSxcblxuICAgICAgICAvLyBwcm9wZXJ0aWVzIHRvIHVzZSBmb3IgaW5kaXZpZHVhbCBwb2ludHMgd2hlbiBydW5uaW5nIHRoZSByZWR1Y2VyXG4gICAgICAgIG1hcDogZnVuY3Rpb24gKHByb3BzKSB7IHJldHVybiBwcm9wczsgfSAvLyBmdW5jdGlvbiAocHJvcHMpIHsgcmV0dXJuIHtzdW06IHByb3BzLm15X3ZhbHVlfTsgfSxcbiAgICB9LFxuXG4gICAgbG9hZDogZnVuY3Rpb24gKHBvaW50cykge1xuICAgICAgICB2YXIgbG9nID0gdGhpcy5vcHRpb25zLmxvZztcblxuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWUoJ3RvdGFsIHRpbWUnKTtcblxuICAgICAgICB2YXIgdGltZXJJZCA9ICdwcmVwYXJlICcgKyBwb2ludHMubGVuZ3RoICsgJyBwb2ludHMnO1xuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWUodGltZXJJZCk7XG5cbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XG5cbiAgICAgICAgLy8gZ2VuZXJhdGUgYSBjbHVzdGVyIG9iamVjdCBmb3IgZWFjaCBwb2ludFxuICAgICAgICB2YXIgY2x1c3RlcnMgPSBwb2ludHMubWFwKGNyZWF0ZVBvaW50Q2x1c3Rlcik7XG4gICAgICAgIGlmIChsb2cpIGNvbnNvbGUudGltZUVuZCh0aW1lcklkKTtcblxuICAgICAgICAvLyBjbHVzdGVyIHBvaW50cyBvbiBtYXggem9vbSwgdGhlbiBjbHVzdGVyIHRoZSByZXN1bHRzIG9uIHByZXZpb3VzIHpvb20sIGV0Yy47XG4gICAgICAgIC8vIHJlc3VsdHMgaW4gYSBjbHVzdGVyIGhpZXJhcmNoeSBhY3Jvc3Mgem9vbSBsZXZlbHNcbiAgICAgICAgZm9yICh2YXIgeiA9IHRoaXMub3B0aW9ucy5tYXhab29tOyB6ID49IHRoaXMub3B0aW9ucy5taW5ab29tOyB6LS0pIHtcbiAgICAgICAgICAgIHZhciBub3cgPSArRGF0ZS5ub3coKTtcblxuICAgICAgICAgICAgLy8gaW5kZXggaW5wdXQgcG9pbnRzIGludG8gYSBLRC10cmVlXG4gICAgICAgICAgICB0aGlzLnRyZWVzW3ogKyAxXSA9IGtkYnVzaChjbHVzdGVycywgZ2V0WCwgZ2V0WSwgdGhpcy5vcHRpb25zLm5vZGVTaXplLCBGbG9hdDMyQXJyYXkpO1xuXG4gICAgICAgICAgICBjbHVzdGVycyA9IHRoaXMuX2NsdXN0ZXIoY2x1c3RlcnMsIHopOyAvLyBjcmVhdGUgYSBuZXcgc2V0IG9mIGNsdXN0ZXJzIGZvciB0aGUgem9vbVxuXG4gICAgICAgICAgICBpZiAobG9nKSBjb25zb2xlLmxvZygneiVkOiAlZCBjbHVzdGVycyBpbiAlZG1zJywgeiwgY2x1c3RlcnMubGVuZ3RoLCArRGF0ZS5ub3coKSAtIG5vdyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbmRleCB0b3AtbGV2ZWwgY2x1c3RlcnNcbiAgICAgICAgdGhpcy50cmVlc1t0aGlzLm9wdGlvbnMubWluWm9vbV0gPSBrZGJ1c2goY2x1c3RlcnMsIGdldFgsIGdldFksIHRoaXMub3B0aW9ucy5ub2RlU2l6ZSwgRmxvYXQzMkFycmF5KTtcblxuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWVFbmQoJ3RvdGFsIHRpbWUnKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgZ2V0Q2x1c3RlcnM6IGZ1bmN0aW9uIChiYm94LCB6b29tKSB7XG4gICAgICAgIHZhciB0cmVlID0gdGhpcy50cmVlc1t0aGlzLl9saW1pdFpvb20oem9vbSldO1xuICAgICAgICB2YXIgaWRzID0gdHJlZS5yYW5nZShsbmdYKGJib3hbMF0pLCBsYXRZKGJib3hbM10pLCBsbmdYKGJib3hbMl0pLCBsYXRZKGJib3hbMV0pKTtcbiAgICAgICAgdmFyIGNsdXN0ZXJzID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYyA9IHRyZWUucG9pbnRzW2lkc1tpXV07XG4gICAgICAgICAgICBjbHVzdGVycy5wdXNoKGMubnVtUG9pbnRzID8gZ2V0Q2x1c3RlckpTT04oYykgOiB0aGlzLnBvaW50c1tjLmlkXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsdXN0ZXJzO1xuICAgIH0sXG5cbiAgICBnZXRDaGlsZHJlbjogZnVuY3Rpb24gKGNsdXN0ZXJJZCwgY2x1c3Rlclpvb20pIHtcbiAgICAgICAgdmFyIG9yaWdpbiA9IHRoaXMudHJlZXNbY2x1c3Rlclpvb20gKyAxXS5wb2ludHNbY2x1c3RlcklkXTtcbiAgICAgICAgdmFyIHIgPSB0aGlzLm9wdGlvbnMucmFkaXVzIC8gKHRoaXMub3B0aW9ucy5leHRlbnQgKiBNYXRoLnBvdygyLCBjbHVzdGVyWm9vbSkpO1xuICAgICAgICB2YXIgcG9pbnRzID0gdGhpcy50cmVlc1tjbHVzdGVyWm9vbSArIDFdLndpdGhpbihvcmlnaW4ueCwgb3JpZ2luLnksIHIpO1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjID0gdGhpcy50cmVlc1tjbHVzdGVyWm9vbSArIDFdLnBvaW50c1twb2ludHNbaV1dO1xuICAgICAgICAgICAgaWYgKGMucGFyZW50SWQgPT09IGNsdXN0ZXJJZCkge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goYy5udW1Qb2ludHMgPyBnZXRDbHVzdGVySlNPTihjKSA6IHRoaXMucG9pbnRzW2MuaWRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgfSxcblxuICAgIGdldExlYXZlczogZnVuY3Rpb24gKGNsdXN0ZXJJZCwgY2x1c3Rlclpvb20sIGxpbWl0LCBvZmZzZXQpIHtcbiAgICAgICAgbGltaXQgPSBsaW1pdCB8fCAxMDtcbiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICAgICAgdmFyIGxlYXZlcyA9IFtdO1xuICAgICAgICB0aGlzLl9hcHBlbmRMZWF2ZXMobGVhdmVzLCBjbHVzdGVySWQsIGNsdXN0ZXJab29tLCBsaW1pdCwgb2Zmc2V0LCAwKTtcblxuICAgICAgICByZXR1cm4gbGVhdmVzO1xuICAgIH0sXG5cbiAgICBnZXRUaWxlOiBmdW5jdGlvbiAoeiwgeCwgeSkge1xuICAgICAgICB2YXIgdHJlZSA9IHRoaXMudHJlZXNbdGhpcy5fbGltaXRab29tKHopXTtcbiAgICAgICAgdmFyIHoyID0gTWF0aC5wb3coMiwgeik7XG4gICAgICAgIHZhciBleHRlbnQgPSB0aGlzLm9wdGlvbnMuZXh0ZW50O1xuICAgICAgICB2YXIgciA9IHRoaXMub3B0aW9ucy5yYWRpdXM7XG4gICAgICAgIHZhciBwID0gciAvIGV4dGVudDtcbiAgICAgICAgdmFyIHRvcCA9ICh5IC0gcCkgLyB6MjtcbiAgICAgICAgdmFyIGJvdHRvbSA9ICh5ICsgMSArIHApIC8gejI7XG5cbiAgICAgICAgdmFyIHRpbGUgPSB7XG4gICAgICAgICAgICBmZWF0dXJlczogW11cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9hZGRUaWxlRmVhdHVyZXMoXG4gICAgICAgICAgICB0cmVlLnJhbmdlKCh4IC0gcCkgLyB6MiwgdG9wLCAoeCArIDEgKyBwKSAvIHoyLCBib3R0b20pLFxuICAgICAgICAgICAgdHJlZS5wb2ludHMsIHgsIHksIHoyLCB0aWxlKTtcblxuICAgICAgICBpZiAoeCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fYWRkVGlsZUZlYXR1cmVzKFxuICAgICAgICAgICAgICAgIHRyZWUucmFuZ2UoMSAtIHAgLyB6MiwgdG9wLCAxLCBib3R0b20pLFxuICAgICAgICAgICAgICAgIHRyZWUucG9pbnRzLCB6MiwgeSwgejIsIHRpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4ID09PSB6MiAtIDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZFRpbGVGZWF0dXJlcyhcbiAgICAgICAgICAgICAgICB0cmVlLnJhbmdlKDAsIHRvcCwgcCAvIHoyLCBib3R0b20pLFxuICAgICAgICAgICAgICAgIHRyZWUucG9pbnRzLCAtMSwgeSwgejIsIHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbGUuZmVhdHVyZXMubGVuZ3RoID8gdGlsZSA6IG51bGw7XG4gICAgfSxcblxuICAgIGdldENsdXN0ZXJFeHBhbnNpb25ab29tOiBmdW5jdGlvbiAoY2x1c3RlcklkLCBjbHVzdGVyWm9vbSkge1xuICAgICAgICB3aGlsZSAoY2x1c3Rlclpvb20gPCB0aGlzLm9wdGlvbnMubWF4Wm9vbSkge1xuICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbihjbHVzdGVySWQsIGNsdXN0ZXJab29tKTtcbiAgICAgICAgICAgIGNsdXN0ZXJab29tKys7XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoICE9PSAxKSBicmVhaztcbiAgICAgICAgICAgIGNsdXN0ZXJJZCA9IGNoaWxkcmVuWzBdLnByb3BlcnRpZXMuY2x1c3Rlcl9pZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2x1c3Rlclpvb207XG4gICAgfSxcblxuICAgIF9hcHBlbmRMZWF2ZXM6IGZ1bmN0aW9uIChyZXN1bHQsIGNsdXN0ZXJJZCwgY2x1c3Rlclpvb20sIGxpbWl0LCBvZmZzZXQsIHNraXBwZWQpIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbihjbHVzdGVySWQsIGNsdXN0ZXJab29tKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcHJvcHMgPSBjaGlsZHJlbltpXS5wcm9wZXJ0aWVzO1xuXG4gICAgICAgICAgICBpZiAocHJvcHMuY2x1c3Rlcikge1xuICAgICAgICAgICAgICAgIGlmIChza2lwcGVkICsgcHJvcHMucG9pbnRfY291bnQgPD0gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNraXAgdGhlIHdob2xlIGNsdXN0ZXJcbiAgICAgICAgICAgICAgICAgICAgc2tpcHBlZCArPSBwcm9wcy5wb2ludF9jb3VudDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBlbnRlciB0aGUgY2x1c3RlclxuICAgICAgICAgICAgICAgICAgICBza2lwcGVkID0gdGhpcy5fYXBwZW5kTGVhdmVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBwcm9wcy5jbHVzdGVyX2lkLCBjbHVzdGVyWm9vbSArIDEsIGxpbWl0LCBvZmZzZXQsIHNraXBwZWQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBleGl0IHRoZSBjbHVzdGVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChza2lwcGVkIDwgb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgLy8gc2tpcCBhIHNpbmdsZSBwb2ludFxuICAgICAgICAgICAgICAgIHNraXBwZWQrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gYWRkIGEgc2luZ2xlIHBvaW50XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IGxpbWl0KSBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBza2lwcGVkO1xuICAgIH0sXG5cbiAgICBfYWRkVGlsZUZlYXR1cmVzOiBmdW5jdGlvbiAoaWRzLCBwb2ludHMsIHgsIHksIHoyLCB0aWxlKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYyA9IHBvaW50c1tpZHNbaV1dO1xuICAgICAgICAgICAgdGlsZS5mZWF0dXJlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBbW1xuICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKHRoaXMub3B0aW9ucy5leHRlbnQgKiAoYy54ICogejIgLSB4KSksXG4gICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQodGhpcy5vcHRpb25zLmV4dGVudCAqIChjLnkgKiB6MiAtIHkpKVxuICAgICAgICAgICAgICAgIF1dLFxuICAgICAgICAgICAgICAgIHRhZ3M6IGMubnVtUG9pbnRzID8gZ2V0Q2x1c3RlclByb3BlcnRpZXMoYykgOiB0aGlzLnBvaW50c1tjLmlkXS5wcm9wZXJ0aWVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfbGltaXRab29tOiBmdW5jdGlvbiAoeikge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5vcHRpb25zLm1pblpvb20sIE1hdGgubWluKHosIHRoaXMub3B0aW9ucy5tYXhab29tICsgMSkpO1xuICAgIH0sXG5cbiAgICBfY2x1c3RlcjogZnVuY3Rpb24gKHBvaW50cywgem9vbSkge1xuICAgICAgICB2YXIgY2x1c3RlcnMgPSBbXTtcbiAgICAgICAgdmFyIHIgPSB0aGlzLm9wdGlvbnMucmFkaXVzIC8gKHRoaXMub3B0aW9ucy5leHRlbnQgKiBNYXRoLnBvdygyLCB6b29tKSk7XG5cbiAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGVhY2ggcG9pbnRcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBwID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgLy8gaWYgd2UndmUgYWxyZWFkeSB2aXNpdGVkIHRoZSBwb2ludCBhdCB0aGlzIHpvb20gbGV2ZWwsIHNraXAgaXRcbiAgICAgICAgICAgIGlmIChwLnpvb20gPD0gem9vbSkgY29udGludWU7XG4gICAgICAgICAgICBwLnpvb20gPSB6b29tO1xuXG4gICAgICAgICAgICAvLyBmaW5kIGFsbCBuZWFyYnkgcG9pbnRzXG4gICAgICAgICAgICB2YXIgdHJlZSA9IHRoaXMudHJlZXNbem9vbSArIDFdO1xuICAgICAgICAgICAgdmFyIG5laWdoYm9ySWRzID0gdHJlZS53aXRoaW4ocC54LCBwLnksIHIpO1xuXG4gICAgICAgICAgICB2YXIgbnVtUG9pbnRzID0gcC5udW1Qb2ludHMgfHwgMTtcbiAgICAgICAgICAgIHZhciB3eCA9IHAueCAqIG51bVBvaW50cztcbiAgICAgICAgICAgIHZhciB3eSA9IHAueSAqIG51bVBvaW50cztcblxuICAgICAgICAgICAgdmFyIGNsdXN0ZXJQcm9wZXJ0aWVzID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWR1Y2UpIHtcbiAgICAgICAgICAgICAgICBjbHVzdGVyUHJvcGVydGllcyA9IHRoaXMub3B0aW9ucy5pbml0aWFsKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWNjdW11bGF0ZShjbHVzdGVyUHJvcGVydGllcywgcCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbmVpZ2hib3JJZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgYiA9IHRyZWUucG9pbnRzW25laWdoYm9ySWRzW2pdXTtcbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IG5laWdoYm9ycyB0aGF0IGFyZSB0b28gZmFyIG9yIGFscmVhZHkgcHJvY2Vzc2VkXG4gICAgICAgICAgICAgICAgaWYgKHpvb20gPCBiLnpvb20pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG51bVBvaW50czIgPSBiLm51bVBvaW50cyB8fCAxO1xuICAgICAgICAgICAgICAgICAgICBiLnpvb20gPSB6b29tOyAvLyBzYXZlIHRoZSB6b29tIChzbyBpdCBkb2Vzbid0IGdldCBwcm9jZXNzZWQgdHdpY2UpXG4gICAgICAgICAgICAgICAgICAgIHd4ICs9IGIueCAqIG51bVBvaW50czI7IC8vIGFjY3VtdWxhdGUgY29vcmRpbmF0ZXMgZm9yIGNhbGN1bGF0aW5nIHdlaWdodGVkIGNlbnRlclxuICAgICAgICAgICAgICAgICAgICB3eSArPSBiLnkgKiBudW1Qb2ludHMyO1xuICAgICAgICAgICAgICAgICAgICBudW1Qb2ludHMgKz0gbnVtUG9pbnRzMjtcbiAgICAgICAgICAgICAgICAgICAgYi5wYXJlbnRJZCA9IGk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWR1Y2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FjY3VtdWxhdGUoY2x1c3RlclByb3BlcnRpZXMsIGIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobnVtUG9pbnRzID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY2x1c3RlcnMucHVzaChwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcC5wYXJlbnRJZCA9IGk7XG4gICAgICAgICAgICAgICAgY2x1c3RlcnMucHVzaChjcmVhdGVDbHVzdGVyKHd4IC8gbnVtUG9pbnRzLCB3eSAvIG51bVBvaW50cywgbnVtUG9pbnRzLCBpLCBjbHVzdGVyUHJvcGVydGllcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNsdXN0ZXJzO1xuICAgIH0sXG5cbiAgICBfYWNjdW11bGF0ZTogZnVuY3Rpb24gKGNsdXN0ZXJQcm9wZXJ0aWVzLCBwb2ludCkge1xuICAgICAgICB2YXIgcHJvcGVydGllcyA9IHBvaW50Lm51bVBvaW50cyA/XG4gICAgICAgICAgICBwb2ludC5wcm9wZXJ0aWVzIDpcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5tYXAodGhpcy5wb2ludHNbcG9pbnQuaWRdLnByb3BlcnRpZXMpO1xuXG4gICAgICAgIHRoaXMub3B0aW9ucy5yZWR1Y2UoY2x1c3RlclByb3BlcnRpZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUNsdXN0ZXIoeCwgeSwgbnVtUG9pbnRzLCBpZCwgcHJvcGVydGllcykge1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IHgsIC8vIHdlaWdodGVkIGNsdXN0ZXIgY2VudGVyXG4gICAgICAgIHk6IHksXG4gICAgICAgIHpvb206IEluZmluaXR5LCAvLyB0aGUgbGFzdCB6b29tIHRoZSBjbHVzdGVyIHdhcyBwcm9jZXNzZWQgYXRcbiAgICAgICAgaWQ6IGlkLCAvLyBpbmRleCBvZiB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGNsdXN0ZXIgaW4gdGhlIHpvb20gbGV2ZWwgdHJlZVxuICAgICAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxuICAgICAgICBwYXJlbnRJZDogLTEsIC8vIHBhcmVudCBjbHVzdGVyIGlkXG4gICAgICAgIG51bVBvaW50czogbnVtUG9pbnRzXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUG9pbnRDbHVzdGVyKHAsIGlkKSB7XG4gICAgdmFyIGNvb3JkcyA9IHAuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogbG5nWChjb29yZHNbMF0pLCAvLyBwcm9qZWN0ZWQgcG9pbnQgY29vcmRpbmF0ZXNcbiAgICAgICAgeTogbGF0WShjb29yZHNbMV0pLFxuICAgICAgICB6b29tOiBJbmZpbml0eSwgLy8gdGhlIGxhc3Qgem9vbSB0aGUgcG9pbnQgd2FzIHByb2Nlc3NlZCBhdFxuICAgICAgICBpZDogaWQsIC8vIGluZGV4IG9mIHRoZSBzb3VyY2UgZmVhdHVyZSBpbiB0aGUgb3JpZ2luYWwgaW5wdXQgYXJyYXlcbiAgICAgICAgcGFyZW50SWQ6IC0xIC8vIHBhcmVudCBjbHVzdGVyIGlkXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2x1c3RlckpTT04oY2x1c3Rlcikge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdGZWF0dXJlJyxcbiAgICAgICAgcHJvcGVydGllczogZ2V0Q2x1c3RlclByb3BlcnRpZXMoY2x1c3RlciksXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IFt4TG5nKGNsdXN0ZXIueCksIHlMYXQoY2x1c3Rlci55KV1cbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldENsdXN0ZXJQcm9wZXJ0aWVzKGNsdXN0ZXIpIHtcbiAgICB2YXIgY291bnQgPSBjbHVzdGVyLm51bVBvaW50cztcbiAgICB2YXIgYWJicmV2ID0gY291bnQgPj0gMTAwMDAgPyBNYXRoLnJvdW5kKGNvdW50IC8gMTAwMCkgKyAnaycgOlxuICAgICAgICAgICAgICAgICBjb3VudCA+PSAxMDAwID8gKE1hdGgucm91bmQoY291bnQgLyAxMDApIC8gMTApICsgJ2snIDogY291bnQ7XG4gICAgcmV0dXJuIGV4dGVuZChleHRlbmQoe30sIGNsdXN0ZXIucHJvcGVydGllcyksIHtcbiAgICAgICAgY2x1c3RlcjogdHJ1ZSxcbiAgICAgICAgY2x1c3Rlcl9pZDogY2x1c3Rlci5pZCxcbiAgICAgICAgcG9pbnRfY291bnQ6IGNvdW50LFxuICAgICAgICBwb2ludF9jb3VudF9hYmJyZXZpYXRlZDogYWJicmV2XG4gICAgfSk7XG59XG5cbi8vIGxvbmdpdHVkZS9sYXRpdHVkZSB0byBzcGhlcmljYWwgbWVyY2F0b3IgaW4gWzAuLjFdIHJhbmdlXG5mdW5jdGlvbiBsbmdYKGxuZykge1xuICAgIHJldHVybiBsbmcgLyAzNjAgKyAwLjU7XG59XG5mdW5jdGlvbiBsYXRZKGxhdCkge1xuICAgIHZhciBzaW4gPSBNYXRoLnNpbihsYXQgKiBNYXRoLlBJIC8gMTgwKSxcbiAgICAgICAgeSA9ICgwLjUgLSAwLjI1ICogTWF0aC5sb2coKDEgKyBzaW4pIC8gKDEgLSBzaW4pKSAvIE1hdGguUEkpO1xuICAgIHJldHVybiB5IDwgMCA/IDAgOlxuICAgICAgICAgICB5ID4gMSA/IDEgOiB5O1xufVxuXG4vLyBzcGhlcmljYWwgbWVyY2F0b3IgdG8gbG9uZ2l0dWRlL2xhdGl0dWRlXG5mdW5jdGlvbiB4TG5nKHgpIHtcbiAgICByZXR1cm4gKHggLSAwLjUpICogMzYwO1xufVxuZnVuY3Rpb24geUxhdCh5KSB7XG4gICAgdmFyIHkyID0gKDE4MCAtIHkgKiAzNjApICogTWF0aC5QSSAvIDE4MDtcbiAgICByZXR1cm4gMzYwICogTWF0aC5hdGFuKE1hdGguZXhwKHkyKSkgLyBNYXRoLlBJIC0gOTA7XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMpIHtcbiAgICBmb3IgKHZhciBpZCBpbiBzcmMpIGRlc3RbaWRdID0gc3JjW2lkXTtcbiAgICByZXR1cm4gZGVzdDtcbn1cblxuZnVuY3Rpb24gZ2V0WChwKSB7XG4gICAgcmV0dXJuIHAueDtcbn1cbmZ1bmN0aW9uIGdldFkocCkge1xuICAgIHJldHVybiBwLnk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gVGlueVF1ZXVlO1xuXG5mdW5jdGlvbiBUaW55UXVldWUoZGF0YSwgY29tcGFyZSkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUaW55UXVldWUpKSByZXR1cm4gbmV3IFRpbnlRdWV1ZShkYXRhLCBjb21wYXJlKTtcblxuICAgIHRoaXMuZGF0YSA9IGRhdGEgfHwgW107XG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLmRhdGEubGVuZ3RoO1xuICAgIHRoaXMuY29tcGFyZSA9IGNvbXBhcmUgfHwgZGVmYXVsdENvbXBhcmU7XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAodGhpcy5sZW5ndGggPj4gMSk7IGkgPj0gMDsgaS0tKSB0aGlzLl9kb3duKGkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbXBhcmUoYSwgYikge1xuICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDtcbn1cblxuVGlueVF1ZXVlLnByb3RvdHlwZSA9IHtcblxuICAgIHB1c2g6IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHRoaXMuZGF0YS5wdXNoKGl0ZW0pO1xuICAgICAgICB0aGlzLmxlbmd0aCsrO1xuICAgICAgICB0aGlzLl91cCh0aGlzLmxlbmd0aCAtIDEpO1xuICAgIH0sXG5cbiAgICBwb3A6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgdG9wID0gdGhpcy5kYXRhWzBdO1xuICAgICAgICB0aGlzLmxlbmd0aC0tO1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFbMF0gPSB0aGlzLmRhdGFbdGhpcy5sZW5ndGhdO1xuICAgICAgICAgICAgdGhpcy5fZG93bigwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGEucG9wKCk7XG4gICAgICAgIHJldHVybiB0b3A7XG4gICAgfSxcblxuICAgIHBlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVswXTtcbiAgICB9LFxuXG4gICAgX3VwOiBmdW5jdGlvbiAocG9zKSB7XG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5kYXRhO1xuICAgICAgICB2YXIgY29tcGFyZSA9IHRoaXMuY29tcGFyZTtcbiAgICAgICAgdmFyIGl0ZW0gPSBkYXRhW3Bvc107XG5cbiAgICAgICAgd2hpbGUgKHBvcyA+IDApIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSAocG9zIC0gMSkgPj4gMTtcbiAgICAgICAgICAgIHZhciBjdXJyZW50ID0gZGF0YVtwYXJlbnRdO1xuICAgICAgICAgICAgaWYgKGNvbXBhcmUoaXRlbSwgY3VycmVudCkgPj0gMCkgYnJlYWs7XG4gICAgICAgICAgICBkYXRhW3Bvc10gPSBjdXJyZW50O1xuICAgICAgICAgICAgcG9zID0gcGFyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVtwb3NdID0gaXRlbTtcbiAgICB9LFxuXG4gICAgX2Rvd246IGZ1bmN0aW9uIChwb3MpIHtcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIHZhciBjb21wYXJlID0gdGhpcy5jb21wYXJlO1xuICAgICAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHZhciBoYWxmTGVuID0gbGVuID4+IDE7XG4gICAgICAgIHZhciBpdGVtID0gZGF0YVtwb3NdO1xuXG4gICAgICAgIHdoaWxlIChwb3MgPCBoYWxmTGVuKSB7XG4gICAgICAgICAgICB2YXIgbGVmdCA9IChwb3MgPDwgMSkgKyAxO1xuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gbGVmdCArIDE7XG4gICAgICAgICAgICB2YXIgYmVzdCA9IGRhdGFbbGVmdF07XG5cbiAgICAgICAgICAgIGlmIChyaWdodCA8IGxlbiAmJiBjb21wYXJlKGRhdGFbcmlnaHRdLCBiZXN0KSA8IDApIHtcbiAgICAgICAgICAgICAgICBsZWZ0ID0gcmlnaHQ7XG4gICAgICAgICAgICAgICAgYmVzdCA9IGRhdGFbcmlnaHRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbXBhcmUoYmVzdCwgaXRlbSkgPj0gMCkgYnJlYWs7XG5cbiAgICAgICAgICAgIGRhdGFbcG9zXSA9IGJlc3Q7XG4gICAgICAgICAgICBwb3MgPSBsZWZ0O1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVtwb3NdID0gaXRlbTtcbiAgICB9XG59O1xuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQnVmZmVyKGFyZykge1xuICByZXR1cm4gYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIGFyZy5jb3B5ID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5maWxsID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5yZWFkVUludDggPT09ICdmdW5jdGlvbic7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xuZXhwb3J0cy5mb3JtYXQgPSBmdW5jdGlvbihmKSB7XG4gIGlmICghaXNTdHJpbmcoZikpIHtcbiAgICB2YXIgb2JqZWN0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmplY3RzLnB1c2goaW5zcGVjdChhcmd1bWVudHNbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdHMuam9pbignICcpO1xuICB9XG5cbiAgdmFyIGkgPSAxO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICB2YXIgc3RyID0gU3RyaW5nKGYpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLCBmdW5jdGlvbih4KSB7XG4gICAgaWYgKHggPT09ICclJScpIHJldHVybiAnJSc7XG4gICAgaWYgKGkgPj0gbGVuKSByZXR1cm4geDtcbiAgICBzd2l0Y2ggKHgpIHtcbiAgICAgIGNhc2UgJyVzJzogcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWQnOiByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclaic6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZ3NbaSsrXSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gIH0pO1xuICBmb3IgKHZhciB4ID0gYXJnc1tpXTsgaSA8IGxlbjsgeCA9IGFyZ3NbKytpXSkge1xuICAgIGlmIChpc051bGwoeCkgfHwgIWlzT2JqZWN0KHgpKSB7XG4gICAgICBzdHIgKz0gJyAnICsgeDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyICs9ICcgJyArIGluc3BlY3QoeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHI7XG59O1xuXG5cbi8vIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4vLyBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuLy8gSWYgLS1uby1kZXByZWNhdGlvbiBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbmV4cG9ydHMuZGVwcmVjYXRlID0gZnVuY3Rpb24oZm4sIG1zZykge1xuICAvLyBBbGxvdyBmb3IgZGVwcmVjYXRpbmcgdGhpbmdzIGluIHRoZSBwcm9jZXNzIG9mIHN0YXJ0aW5nIHVwLlxuICBpZiAoaXNVbmRlZmluZWQoZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV4cG9ydHMuZGVwcmVjYXRlKGZuLCBtc2cpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLm5vRGVwcmVjYXRpb24gPT09IHRydWUpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufTtcblxuXG52YXIgZGVidWdzID0ge307XG52YXIgZGVidWdFbnZpcm9uO1xuZXhwb3J0cy5kZWJ1Z2xvZyA9IGZ1bmN0aW9uKHNldCkge1xuICBpZiAoaXNVbmRlZmluZWQoZGVidWdFbnZpcm9uKSlcbiAgICBkZWJ1Z0Vudmlyb24gPSBwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnO1xuICBzZXQgPSBzZXQudG9VcHBlckNhc2UoKTtcbiAgaWYgKCFkZWJ1Z3Nbc2V0XSkge1xuICAgIGlmIChuZXcgUmVnRXhwKCdcXFxcYicgKyBzZXQgKyAnXFxcXGInLCAnaScpLnRlc3QoZGVidWdFbnZpcm9uKSkge1xuICAgICAgdmFyIHBpZCA9IHByb2Nlc3MucGlkO1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG1zZyA9IGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyVzICVkOiAlcycsIHNldCwgcGlkLCBtc2cpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHt9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVidWdzW3NldF07XG59O1xuXG5cbi8qKlxuICogRWNob3MgdGhlIHZhbHVlIG9mIGEgdmFsdWUuIFRyeXMgdG8gcHJpbnQgdGhlIHZhbHVlIG91dFxuICogaW4gdGhlIGJlc3Qgd2F5IHBvc3NpYmxlIGdpdmVuIHRoZSBkaWZmZXJlbnQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHByaW50IG91dC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSBvdXRwdXQuXG4gKi9cbi8qIGxlZ2FjeTogb2JqLCBzaG93SGlkZGVuLCBkZXB0aCwgY29sb3JzKi9cbmZ1bmN0aW9uIGluc3BlY3Qob2JqLCBvcHRzKSB7XG4gIC8vIGRlZmF1bHQgb3B0aW9uc1xuICB2YXIgY3R4ID0ge1xuICAgIHNlZW46IFtdLFxuICAgIHN0eWxpemU6IHN0eWxpemVOb0NvbG9yXG4gIH07XG4gIC8vIGxlZ2FjeS4uLlxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSBjdHguZGVwdGggPSBhcmd1bWVudHNbMl07XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIGN0eC5jb2xvcnMgPSBhcmd1bWVudHNbM107XG4gIGlmIChpc0Jvb2xlYW4ob3B0cykpIHtcbiAgICAvLyBsZWdhY3kuLi5cbiAgICBjdHguc2hvd0hpZGRlbiA9IG9wdHM7XG4gIH0gZWxzZSBpZiAob3B0cykge1xuICAgIC8vIGdvdCBhbiBcIm9wdGlvbnNcIiBvYmplY3RcbiAgICBleHBvcnRzLl9leHRlbmQoY3R4LCBvcHRzKTtcbiAgfVxuICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG4gIGlmIChpc1VuZGVmaW5lZChjdHguc2hvd0hpZGRlbikpIGN0eC5zaG93SGlkZGVuID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguZGVwdGgpKSBjdHguZGVwdGggPSAyO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmNvbG9ycykpIGN0eC5jb2xvcnMgPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jdXN0b21JbnNwZWN0KSkgY3R4LmN1c3RvbUluc3BlY3QgPSB0cnVlO1xuICBpZiAoY3R4LmNvbG9ycykgY3R4LnN0eWxpemUgPSBzdHlsaXplV2l0aENvbG9yO1xuICByZXR1cm4gZm9ybWF0VmFsdWUoY3R4LCBvYmosIGN0eC5kZXB0aCk7XG59XG5leHBvcnRzLmluc3BlY3QgPSBpbnNwZWN0O1xuXG5cbi8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQU5TSV9lc2NhcGVfY29kZSNncmFwaGljc1xuaW5zcGVjdC5jb2xvcnMgPSB7XG4gICdib2xkJyA6IFsxLCAyMl0sXG4gICdpdGFsaWMnIDogWzMsIDIzXSxcbiAgJ3VuZGVybGluZScgOiBbNCwgMjRdLFxuICAnaW52ZXJzZScgOiBbNywgMjddLFxuICAnd2hpdGUnIDogWzM3LCAzOV0sXG4gICdncmV5JyA6IFs5MCwgMzldLFxuICAnYmxhY2snIDogWzMwLCAzOV0sXG4gICdibHVlJyA6IFszNCwgMzldLFxuICAnY3lhbicgOiBbMzYsIDM5XSxcbiAgJ2dyZWVuJyA6IFszMiwgMzldLFxuICAnbWFnZW50YScgOiBbMzUsIDM5XSxcbiAgJ3JlZCcgOiBbMzEsIDM5XSxcbiAgJ3llbGxvdycgOiBbMzMsIDM5XVxufTtcblxuLy8gRG9uJ3QgdXNlICdibHVlJyBub3QgdmlzaWJsZSBvbiBjbWQuZXhlXG5pbnNwZWN0LnN0eWxlcyA9IHtcbiAgJ3NwZWNpYWwnOiAnY3lhbicsXG4gICdudW1iZXInOiAneWVsbG93JyxcbiAgJ2Jvb2xlYW4nOiAneWVsbG93JyxcbiAgJ3VuZGVmaW5lZCc6ICdncmV5JyxcbiAgJ251bGwnOiAnYm9sZCcsXG4gICdzdHJpbmcnOiAnZ3JlZW4nLFxuICAnZGF0ZSc6ICdtYWdlbnRhJyxcbiAgLy8gXCJuYW1lXCI6IGludGVudGlvbmFsbHkgbm90IHN0eWxpbmdcbiAgJ3JlZ2V4cCc6ICdyZWQnXG59O1xuXG5cbmZ1bmN0aW9uIHN0eWxpemVXaXRoQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgdmFyIHN0eWxlID0gaW5zcGVjdC5zdHlsZXNbc3R5bGVUeXBlXTtcblxuICBpZiAoc3R5bGUpIHtcbiAgICByZXR1cm4gJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVswXSArICdtJyArIHN0ciArXG4gICAgICAgICAgICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMV0gKyAnbSc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHN0eWxpemVOb0NvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHJldHVybiBzdHI7XG59XG5cblxuZnVuY3Rpb24gYXJyYXlUb0hhc2goYXJyYXkpIHtcbiAgdmFyIGhhc2ggPSB7fTtcblxuICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uKHZhbCwgaWR4KSB7XG4gICAgaGFzaFt2YWxdID0gdHJ1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGhhc2g7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0VmFsdWUoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzKSB7XG4gIC8vIFByb3ZpZGUgYSBob29rIGZvciB1c2VyLXNwZWNpZmllZCBpbnNwZWN0IGZ1bmN0aW9ucy5cbiAgLy8gQ2hlY2sgdGhhdCB2YWx1ZSBpcyBhbiBvYmplY3Qgd2l0aCBhbiBpbnNwZWN0IGZ1bmN0aW9uIG9uIGl0XG4gIGlmIChjdHguY3VzdG9tSW5zcGVjdCAmJlxuICAgICAgdmFsdWUgJiZcbiAgICAgIGlzRnVuY3Rpb24odmFsdWUuaW5zcGVjdCkgJiZcbiAgICAgIC8vIEZpbHRlciBvdXQgdGhlIHV0aWwgbW9kdWxlLCBpdCdzIGluc3BlY3QgZnVuY3Rpb24gaXMgc3BlY2lhbFxuICAgICAgdmFsdWUuaW5zcGVjdCAhPT0gZXhwb3J0cy5pbnNwZWN0ICYmXG4gICAgICAvLyBBbHNvIGZpbHRlciBvdXQgYW55IHByb3RvdHlwZSBvYmplY3RzIHVzaW5nIHRoZSBjaXJjdWxhciBjaGVjay5cbiAgICAgICEodmFsdWUuY29uc3RydWN0b3IgJiYgdmFsdWUuY29uc3RydWN0b3IucHJvdG90eXBlID09PSB2YWx1ZSkpIHtcbiAgICB2YXIgcmV0ID0gdmFsdWUuaW5zcGVjdChyZWN1cnNlVGltZXMsIGN0eCk7XG4gICAgaWYgKCFpc1N0cmluZyhyZXQpKSB7XG4gICAgICByZXQgPSBmb3JtYXRWYWx1ZShjdHgsIHJldCwgcmVjdXJzZVRpbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIFByaW1pdGl2ZSB0eXBlcyBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzXG4gIHZhciBwcmltaXRpdmUgPSBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSk7XG4gIGlmIChwcmltaXRpdmUpIHtcbiAgICByZXR1cm4gcHJpbWl0aXZlO1xuICB9XG5cbiAgLy8gTG9vayB1cCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0LlxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgdmFyIHZpc2libGVLZXlzID0gYXJyYXlUb0hhc2goa2V5cyk7XG5cbiAgaWYgKGN0eC5zaG93SGlkZGVuKSB7XG4gICAga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTtcbiAgfVxuXG4gIC8vIElFIGRvZXNuJ3QgbWFrZSBlcnJvciBmaWVsZHMgbm9uLWVudW1lcmFibGVcbiAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2R3dzUyc2J0KHY9dnMuOTQpLmFzcHhcbiAgaWYgKGlzRXJyb3IodmFsdWUpXG4gICAgICAmJiAoa2V5cy5pbmRleE9mKCdtZXNzYWdlJykgPj0gMCB8fCBrZXlzLmluZGV4T2YoJ2Rlc2NyaXB0aW9uJykgPj0gMCkpIHtcbiAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgLy8gU29tZSB0eXBlIG9mIG9iamVjdCB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHZhciBuYW1lID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lICsgJ10nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAnZGF0ZScpO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2UgPSAnJywgYXJyYXkgPSBmYWxzZSwgYnJhY2VzID0gWyd7JywgJ30nXTtcblxuICAvLyBNYWtlIEFycmF5IHNheSB0aGF0IHRoZXkgYXJlIEFycmF5XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGFycmF5ID0gdHJ1ZTtcbiAgICBicmFjZXMgPSBbJ1snLCAnXSddO1xuICB9XG5cbiAgLy8gTWFrZSBmdW5jdGlvbnMgc2F5IHRoYXQgdGhleSBhcmUgZnVuY3Rpb25zXG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHZhciBuID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgYmFzZSA9ICcgW0Z1bmN0aW9uJyArIG4gKyAnXSc7XG4gIH1cblxuICAvLyBNYWtlIFJlZ0V4cHMgc2F5IHRoYXQgdGhleSBhcmUgUmVnRXhwc1xuICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGRhdGVzIHdpdGggcHJvcGVydGllcyBmaXJzdCBzYXkgdGhlIGRhdGVcbiAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGVycm9yIHdpdGggbWVzc2FnZSBmaXJzdCBzYXkgdGhlIGVycm9yXG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgJiYgKCFhcnJheSB8fCB2YWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArIGJyYWNlc1sxXTtcbiAgfVxuXG4gIGlmIChyZWN1cnNlVGltZXMgPCAwKSB7XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbT2JqZWN0XScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG5cbiAgY3R4LnNlZW4ucHVzaCh2YWx1ZSk7XG5cbiAgdmFyIG91dHB1dDtcbiAgaWYgKGFycmF5KSB7XG4gICAgb3V0cHV0ID0gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cyk7XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSk7XG4gICAgfSk7XG4gIH1cblxuICBjdHguc2Vlbi5wb3AoKTtcblxuICByZXR1cm4gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKSB7XG4gIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICB2YXIgc2ltcGxlID0gJ1xcJycgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkucmVwbGFjZSgvXlwifFwiJC9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykgKyAnXFwnJztcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoc2ltcGxlLCAnc3RyaW5nJyk7XG4gIH1cbiAgaWYgKGlzTnVtYmVyKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ251bWJlcicpO1xuICBpZiAoaXNCb29sZWFuKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ2Jvb2xlYW4nKTtcbiAgLy8gRm9yIHNvbWUgcmVhc29uIHR5cGVvZiBudWxsIGlzIFwib2JqZWN0XCIsIHNvIHNwZWNpYWwgY2FzZSBoZXJlLlxuICBpZiAoaXNOdWxsKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ251bGwnLCAnbnVsbCcpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEVycm9yKHZhbHVlKSB7XG4gIHJldHVybiAnWycgKyBFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgKyAnXSc7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KHZhbHVlLCBTdHJpbmcoaSkpKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIFN0cmluZyhpKSwgdHJ1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgfVxuICB9XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoIWtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAga2V5LCB0cnVlKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KSB7XG4gIHZhciBuYW1lLCBzdHIsIGRlc2M7XG4gIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpIHx8IHsgdmFsdWU6IHZhbHVlW2tleV0gfTtcbiAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlci9TZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoIWhhc093blByb3BlcnR5KHZpc2libGVLZXlzLCBrZXkpKSB7XG4gICAgbmFtZSA9ICdbJyArIGtleSArICddJztcbiAgfVxuICBpZiAoIXN0cikge1xuICAgIGlmIChjdHguc2Vlbi5pbmRleE9mKGRlc2MudmFsdWUpIDwgMCkge1xuICAgICAgaWYgKGlzTnVsbChyZWN1cnNlVGltZXMpKSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIHJlY3Vyc2VUaW1lcyAtIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKS5zdWJzdHIoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgaWYgKGFycmF5ICYmIGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG4gICAgaWYgKG5hbWUubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pKSB7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSwgbmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnbmFtZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5hbWUgKyAnOiAnICsgc3RyO1xufVxuXG5cbmZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKSB7XG4gIHZhciBudW1MaW5lc0VzdCA9IDA7XG4gIHZhciBsZW5ndGggPSBvdXRwdXQucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGN1cikge1xuICAgIG51bUxpbmVzRXN0Kys7XG4gICAgaWYgKGN1ci5pbmRleE9mKCdcXG4nKSA+PSAwKSBudW1MaW5lc0VzdCsrO1xuICAgIHJldHVybiBwcmV2ICsgY3VyLnJlcGxhY2UoL1xcdTAwMWJcXFtcXGRcXGQ/bS9nLCAnJykubGVuZ3RoICsgMTtcbiAgfSwgMCk7XG5cbiAgaWYgKGxlbmd0aCA+IDYwKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArXG4gICAgICAgICAgIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBvdXRwdXQuam9pbignLFxcbiAgJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBicmFjZXNbMV07XG4gIH1cblxuICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArICcgJyArIG91dHB1dC5qb2luKCcsICcpICsgJyAnICsgYnJhY2VzWzFdO1xufVxuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5mdW5jdGlvbiBpc0FycmF5KGFyKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFyKTtcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJlKSAmJiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGQpICYmIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiBpc09iamVjdChlKSAmJlxuICAgICAgKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gcmVxdWlyZSgnLi9zdXBwb3J0L2lzQnVmZmVyJyk7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cblxuXG5mdW5jdGlvbiBwYWQobikge1xuICByZXR1cm4gbiA8IDEwID8gJzAnICsgbi50b1N0cmluZygxMCkgOiBuLnRvU3RyaW5nKDEwKTtcbn1cblxuXG52YXIgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsXG4gICAgICAgICAgICAgICdPY3QnLCAnTm92JywgJ0RlYyddO1xuXG4vLyAyNiBGZWIgMTY6MTk6MzRcbmZ1bmN0aW9uIHRpbWVzdGFtcCgpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICB2YXIgdGltZSA9IFtwYWQoZC5nZXRIb3VycygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0TWludXRlcygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0U2Vjb25kcygpKV0uam9pbignOicpO1xuICByZXR1cm4gW2QuZ2V0RGF0ZSgpLCBtb250aHNbZC5nZXRNb250aCgpXSwgdGltZV0uam9pbignICcpO1xufVxuXG5cbi8vIGxvZyBpcyBqdXN0IGEgdGhpbiB3cmFwcGVyIHRvIGNvbnNvbGUubG9nIHRoYXQgcHJlcGVuZHMgYSB0aW1lc3RhbXBcbmV4cG9ydHMubG9nID0gZnVuY3Rpb24oKSB7XG4gIGNvbnNvbGUubG9nKCclcyAtICVzJywgdGltZXN0YW1wKCksIGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cykpO1xufTtcblxuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlci5cbiAqXG4gKiBUaGUgRnVuY3Rpb24ucHJvdG90eXBlLmluaGVyaXRzIGZyb20gbGFuZy5qcyByZXdyaXR0ZW4gYXMgYSBzdGFuZGFsb25lXG4gKiBmdW5jdGlvbiAobm90IG9uIEZ1bmN0aW9uLnByb3RvdHlwZSkuIE5PVEU6IElmIHRoaXMgZmlsZSBpcyB0byBiZSBsb2FkZWRcbiAqIGR1cmluZyBib290c3RyYXBwaW5nIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcmV3cml0dGVuIHVzaW5nIHNvbWUgbmF0aXZlXG4gKiBmdW5jdGlvbnMgYXMgcHJvdG90eXBlIHNldHVwIHVzaW5nIG5vcm1hbCBKYXZhU2NyaXB0IGRvZXMgbm90IHdvcmsgYXNcbiAqIGV4cGVjdGVkIGR1cmluZyBib290c3RyYXBwaW5nIChzZWUgbWlycm9yLmpzIGluIHIxMTQ5MDMpLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gd2hpY2ggbmVlZHMgdG8gaW5oZXJpdCB0aGVcbiAqICAgICBwcm90b3R5cGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gdG8gaW5oZXJpdCBwcm90b3R5cGUgZnJvbS5cbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmV4cG9ydHMuX2V4dGVuZCA9IGZ1bmN0aW9uKG9yaWdpbiwgYWRkKSB7XG4gIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGFkZCBpc24ndCBhbiBvYmplY3RcbiAgaWYgKCFhZGQgfHwgIWlzT2JqZWN0KGFkZCkpIHJldHVybiBvcmlnaW47XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhZGQpO1xuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgb3JpZ2luW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuICB9XG4gIHJldHVybiBvcmlnaW47XG59O1xuXG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuIiwidmFyIFBiZiA9IHJlcXVpcmUoJ3BiZicpXG52YXIgR2VvSlNPTldyYXBwZXIgPSByZXF1aXJlKCcuL2xpYi9nZW9qc29uX3dyYXBwZXInKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZyb21WZWN0b3JUaWxlSnNcbm1vZHVsZS5leHBvcnRzLmZyb21WZWN0b3JUaWxlSnMgPSBmcm9tVmVjdG9yVGlsZUpzXG5tb2R1bGUuZXhwb3J0cy5mcm9tR2VvanNvblZ0ID0gZnJvbUdlb2pzb25WdFxubW9kdWxlLmV4cG9ydHMuR2VvSlNPTldyYXBwZXIgPSBHZW9KU09OV3JhcHBlclxuXG4vKipcbiAqIFNlcmlhbGl6ZSBhIHZlY3Rvci10aWxlLWpzLWNyZWF0ZWQgdGlsZSB0byBwYmZcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGlsZVxuICogQHJldHVybiB7QnVmZmVyfSB1bmNvbXByZXNzZWQsIHBiZi1zZXJpYWxpemVkIHRpbGUgZGF0YVxuICovXG5mdW5jdGlvbiBmcm9tVmVjdG9yVGlsZUpzICh0aWxlKSB7XG4gIHZhciBvdXQgPSBuZXcgUGJmKClcbiAgd3JpdGVUaWxlKHRpbGUsIG91dClcbiAgcmV0dXJuIG91dC5maW5pc2goKVxufVxuXG4vKipcbiAqIFNlcmlhbGl6ZWQgYSBnZW9qc29uLXZ0LWNyZWF0ZWQgdGlsZSB0byBwYmYuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGxheWVycyAtIEFuIG9iamVjdCBtYXBwaW5nIGxheWVyIG5hbWVzIHRvIGdlb2pzb24tdnQtY3JlYXRlZCB2ZWN0b3IgdGlsZSBvYmplY3RzXG4gKiBAcmV0dXJuIHtCdWZmZXJ9IHVuY29tcHJlc3NlZCwgcGJmLXNlcmlhbGl6ZWQgdGlsZSBkYXRhXG4gKi9cbmZ1bmN0aW9uIGZyb21HZW9qc29uVnQgKGxheWVycykge1xuICB2YXIgbCA9IHt9XG4gIGZvciAodmFyIGsgaW4gbGF5ZXJzKSB7XG4gICAgbFtrXSA9IG5ldyBHZW9KU09OV3JhcHBlcihsYXllcnNba10uZmVhdHVyZXMpXG4gICAgbFtrXS5uYW1lID0ga1xuICB9XG4gIHJldHVybiBmcm9tVmVjdG9yVGlsZUpzKHtsYXllcnM6IGx9KVxufVxuXG5mdW5jdGlvbiB3cml0ZVRpbGUgKHRpbGUsIHBiZikge1xuICBmb3IgKHZhciBrZXkgaW4gdGlsZS5sYXllcnMpIHtcbiAgICBwYmYud3JpdGVNZXNzYWdlKDMsIHdyaXRlTGF5ZXIsIHRpbGUubGF5ZXJzW2tleV0pXG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVMYXllciAobGF5ZXIsIHBiZikge1xuICBwYmYud3JpdGVWYXJpbnRGaWVsZCgxNSwgbGF5ZXIudmVyc2lvbiB8fCAxKVxuICBwYmYud3JpdGVTdHJpbmdGaWVsZCgxLCBsYXllci5uYW1lIHx8ICcnKVxuICBwYmYud3JpdGVWYXJpbnRGaWVsZCg1LCBsYXllci5leHRlbnQgfHwgNDA5NilcblxuICB2YXIgaVxuICB2YXIgY29udGV4dCA9IHtcbiAgICBrZXlzOiBbXSxcbiAgICB2YWx1ZXM6IFtdLFxuICAgIGtleWNhY2hlOiB7fSxcbiAgICB2YWx1ZWNhY2hlOiB7fVxuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IGxheWVyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29udGV4dC5mZWF0dXJlID0gbGF5ZXIuZmVhdHVyZShpKVxuICAgIHBiZi53cml0ZU1lc3NhZ2UoMiwgd3JpdGVGZWF0dXJlLCBjb250ZXh0KVxuICB9XG5cbiAgdmFyIGtleXMgPSBjb250ZXh0LmtleXNcbiAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBwYmYud3JpdGVTdHJpbmdGaWVsZCgzLCBrZXlzW2ldKVxuICB9XG5cbiAgdmFyIHZhbHVlcyA9IGNvbnRleHQudmFsdWVzXG4gIGZvciAoaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBwYmYud3JpdGVNZXNzYWdlKDQsIHdyaXRlVmFsdWUsIHZhbHVlc1tpXSlcbiAgfVxufVxuXG5mdW5jdGlvbiB3cml0ZUZlYXR1cmUgKGNvbnRleHQsIHBiZikge1xuICB2YXIgZmVhdHVyZSA9IGNvbnRleHQuZmVhdHVyZVxuXG4gIGlmIChmZWF0dXJlLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBwYmYud3JpdGVWYXJpbnRGaWVsZCgxLCBmZWF0dXJlLmlkKVxuICB9XG5cbiAgcGJmLndyaXRlTWVzc2FnZSgyLCB3cml0ZVByb3BlcnRpZXMsIGNvbnRleHQpXG4gIHBiZi53cml0ZVZhcmludEZpZWxkKDMsIGZlYXR1cmUudHlwZSlcbiAgcGJmLndyaXRlTWVzc2FnZSg0LCB3cml0ZUdlb21ldHJ5LCBmZWF0dXJlKVxufVxuXG5mdW5jdGlvbiB3cml0ZVByb3BlcnRpZXMgKGNvbnRleHQsIHBiZikge1xuICB2YXIgZmVhdHVyZSA9IGNvbnRleHQuZmVhdHVyZVxuICB2YXIga2V5cyA9IGNvbnRleHQua2V5c1xuICB2YXIgdmFsdWVzID0gY29udGV4dC52YWx1ZXNcbiAgdmFyIGtleWNhY2hlID0gY29udGV4dC5rZXljYWNoZVxuICB2YXIgdmFsdWVjYWNoZSA9IGNvbnRleHQudmFsdWVjYWNoZVxuXG4gIGZvciAodmFyIGtleSBpbiBmZWF0dXJlLnByb3BlcnRpZXMpIHtcbiAgICB2YXIga2V5SW5kZXggPSBrZXljYWNoZVtrZXldXG4gICAgaWYgKHR5cGVvZiBrZXlJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGtleXMucHVzaChrZXkpXG4gICAgICBrZXlJbmRleCA9IGtleXMubGVuZ3RoIC0gMVxuICAgICAga2V5Y2FjaGVba2V5XSA9IGtleUluZGV4XG4gICAgfVxuICAgIHBiZi53cml0ZVZhcmludChrZXlJbmRleClcblxuICAgIHZhciB2YWx1ZSA9IGZlYXR1cmUucHJvcGVydGllc1trZXldXG4gICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWVcbiAgICBpZiAodHlwZSAhPT0gJ3N0cmluZycgJiYgdHlwZSAhPT0gJ2Jvb2xlYW4nICYmIHR5cGUgIT09ICdudW1iZXInKSB7XG4gICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgIH1cbiAgICB2YXIgdmFsdWVLZXkgPSB0eXBlICsgJzonICsgdmFsdWVcbiAgICB2YXIgdmFsdWVJbmRleCA9IHZhbHVlY2FjaGVbdmFsdWVLZXldXG4gICAgaWYgKHR5cGVvZiB2YWx1ZUluZGV4ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFsdWVzLnB1c2godmFsdWUpXG4gICAgICB2YWx1ZUluZGV4ID0gdmFsdWVzLmxlbmd0aCAtIDFcbiAgICAgIHZhbHVlY2FjaGVbdmFsdWVLZXldID0gdmFsdWVJbmRleFxuICAgIH1cbiAgICBwYmYud3JpdGVWYXJpbnQodmFsdWVJbmRleClcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21tYW5kIChjbWQsIGxlbmd0aCkge1xuICByZXR1cm4gKGxlbmd0aCA8PCAzKSArIChjbWQgJiAweDcpXG59XG5cbmZ1bmN0aW9uIHppZ3phZyAobnVtKSB7XG4gIHJldHVybiAobnVtIDw8IDEpIF4gKG51bSA+PiAzMSlcbn1cblxuZnVuY3Rpb24gd3JpdGVHZW9tZXRyeSAoZmVhdHVyZSwgcGJmKSB7XG4gIHZhciBnZW9tZXRyeSA9IGZlYXR1cmUubG9hZEdlb21ldHJ5KClcbiAgdmFyIHR5cGUgPSBmZWF0dXJlLnR5cGVcbiAgdmFyIHggPSAwXG4gIHZhciB5ID0gMFxuICB2YXIgcmluZ3MgPSBnZW9tZXRyeS5sZW5ndGhcbiAgZm9yICh2YXIgciA9IDA7IHIgPCByaW5nczsgcisrKSB7XG4gICAgdmFyIHJpbmcgPSBnZW9tZXRyeVtyXVxuICAgIHZhciBjb3VudCA9IDFcbiAgICBpZiAodHlwZSA9PT0gMSkge1xuICAgICAgY291bnQgPSByaW5nLmxlbmd0aFxuICAgIH1cbiAgICBwYmYud3JpdGVWYXJpbnQoY29tbWFuZCgxLCBjb3VudCkpIC8vIG1vdmV0b1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGkgPT09IDEgJiYgdHlwZSAhPT0gMSkge1xuICAgICAgICBwYmYud3JpdGVWYXJpbnQoY29tbWFuZCgyLCByaW5nLmxlbmd0aCAtIDEpKSAvLyBsaW5ldG9cbiAgICAgIH1cbiAgICAgIHZhciBkeCA9IHJpbmdbaV0ueCAtIHhcbiAgICAgIHZhciBkeSA9IHJpbmdbaV0ueSAtIHlcbiAgICAgIHBiZi53cml0ZVZhcmludCh6aWd6YWcoZHgpKVxuICAgICAgcGJmLndyaXRlVmFyaW50KHppZ3phZyhkeSkpXG4gICAgICB4ICs9IGR4XG4gICAgICB5ICs9IGR5XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdyaXRlVmFsdWUgKHZhbHVlLCBwYmYpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWVcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcGJmLndyaXRlU3RyaW5nRmllbGQoMSwgdmFsdWUpXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcGJmLndyaXRlQm9vbGVhbkZpZWxkKDcsIHZhbHVlKVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHZhbHVlICUgMSAhPT0gMCkge1xuICAgICAgcGJmLndyaXRlRG91YmxlRmllbGQoMywgdmFsdWUpXG4gICAgfSBlbHNlIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgIHBiZi53cml0ZVNWYXJpbnRGaWVsZCg2LCB2YWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcGJmLndyaXRlVmFyaW50RmllbGQoNSwgdmFsdWUpXG4gICAgfVxuICB9XG59XG4iLCIndXNlIHN0cmljdCdcblxudmFyIFBvaW50ID0gcmVxdWlyZSgnQG1hcGJveC9wb2ludC1nZW9tZXRyeScpXG52YXIgVmVjdG9yVGlsZUZlYXR1cmUgPSByZXF1aXJlKCdAbWFwYm94L3ZlY3Rvci10aWxlJykuVmVjdG9yVGlsZUZlYXR1cmVcblxubW9kdWxlLmV4cG9ydHMgPSBHZW9KU09OV3JhcHBlclxuXG4vLyBjb25mb3JtIHRvIHZlY3RvcnRpbGUgYXBpXG5mdW5jdGlvbiBHZW9KU09OV3JhcHBlciAoZmVhdHVyZXMpIHtcbiAgdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzXG4gIHRoaXMubGVuZ3RoID0gZmVhdHVyZXMubGVuZ3RoXG59XG5cbkdlb0pTT05XcmFwcGVyLnByb3RvdHlwZS5mZWF0dXJlID0gZnVuY3Rpb24gKGkpIHtcbiAgcmV0dXJuIG5ldyBGZWF0dXJlV3JhcHBlcih0aGlzLmZlYXR1cmVzW2ldKVxufVxuXG5mdW5jdGlvbiBGZWF0dXJlV3JhcHBlciAoZmVhdHVyZSkge1xuICB0aGlzLmlkID0gdHlwZW9mIGZlYXR1cmUuaWQgPT09ICdudW1iZXInID8gZmVhdHVyZS5pZCA6IHVuZGVmaW5lZFxuICB0aGlzLnR5cGUgPSBmZWF0dXJlLnR5cGVcbiAgdGhpcy5yYXdHZW9tZXRyeSA9IGZlYXR1cmUudHlwZSA9PT0gMSA/IFtmZWF0dXJlLmdlb21ldHJ5XSA6IGZlYXR1cmUuZ2VvbWV0cnlcbiAgdGhpcy5wcm9wZXJ0aWVzID0gZmVhdHVyZS50YWdzXG4gIHRoaXMuZXh0ZW50ID0gNDA5NlxufVxuXG5GZWF0dXJlV3JhcHBlci5wcm90b3R5cGUubG9hZEdlb21ldHJ5ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcmluZ3MgPSB0aGlzLnJhd0dlb21ldHJ5XG4gIHRoaXMuZ2VvbWV0cnkgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmluZyA9IHJpbmdzW2ldXG4gICAgdmFyIG5ld1JpbmcgPSBbXVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgbmV3UmluZy5wdXNoKG5ldyBQb2ludChyaW5nW2pdWzBdLCByaW5nW2pdWzFdKSlcbiAgICB9XG4gICAgdGhpcy5nZW9tZXRyeS5wdXNoKG5ld1JpbmcpXG4gIH1cbiAgcmV0dXJuIHRoaXMuZ2VvbWV0cnlcbn1cblxuRmVhdHVyZVdyYXBwZXIucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5nZW9tZXRyeSkgdGhpcy5sb2FkR2VvbWV0cnkoKVxuXG4gIHZhciByaW5ncyA9IHRoaXMuZ2VvbWV0cnlcbiAgdmFyIHgxID0gSW5maW5pdHlcbiAgdmFyIHgyID0gLUluZmluaXR5XG4gIHZhciB5MSA9IEluZmluaXR5XG4gIHZhciB5MiA9IC1JbmZpbml0eVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmluZyA9IHJpbmdzW2ldXG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBjb29yZCA9IHJpbmdbal1cblxuICAgICAgeDEgPSBNYXRoLm1pbih4MSwgY29vcmQueClcbiAgICAgIHgyID0gTWF0aC5tYXgoeDIsIGNvb3JkLngpXG4gICAgICB5MSA9IE1hdGgubWluKHkxLCBjb29yZC55KVxuICAgICAgeTIgPSBNYXRoLm1heCh5MiwgY29vcmQueSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyXVxufVxuXG5GZWF0dXJlV3JhcHBlci5wcm90b3R5cGUudG9HZW9KU09OID0gVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTlxuIiwidmFyIGJ1bmRsZUZuID0gYXJndW1lbnRzWzNdO1xudmFyIHNvdXJjZXMgPSBhcmd1bWVudHNbNF07XG52YXIgY2FjaGUgPSBhcmd1bWVudHNbNV07XG5cbnZhciBzdHJpbmdpZnkgPSBKU09OLnN0cmluZ2lmeTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIG9wdGlvbnMpIHtcbiAgICB2YXIgd2tleTtcbiAgICB2YXIgY2FjaGVLZXlzID0gT2JqZWN0LmtleXMoY2FjaGUpO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjYWNoZUtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBrZXkgPSBjYWNoZUtleXNbaV07XG4gICAgICAgIHZhciBleHAgPSBjYWNoZVtrZXldLmV4cG9ydHM7XG4gICAgICAgIC8vIFVzaW5nIGJhYmVsIGFzIGEgdHJhbnNwaWxlciB0byB1c2UgZXNtb2R1bGUsIHRoZSBleHBvcnQgd2lsbCBhbHdheXNcbiAgICAgICAgLy8gYmUgYW4gb2JqZWN0IHdpdGggdGhlIGRlZmF1bHQgZXhwb3J0IGFzIGEgcHJvcGVydHkgb2YgaXQuIFRvIGVuc3VyZVxuICAgICAgICAvLyB0aGUgZXhpc3RpbmcgYXBpIGFuZCBiYWJlbCBlc21vZHVsZSBleHBvcnRzIGFyZSBib3RoIHN1cHBvcnRlZCB3ZVxuICAgICAgICAvLyBjaGVjayBmb3IgYm90aFxuICAgICAgICBpZiAoZXhwID09PSBmbiB8fCBleHAgJiYgZXhwLmRlZmF1bHQgPT09IGZuKSB7XG4gICAgICAgICAgICB3a2V5ID0ga2V5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXdrZXkpIHtcbiAgICAgICAgd2tleSA9IE1hdGguZmxvb3IoTWF0aC5wb3coMTYsIDgpICogTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoMTYpO1xuICAgICAgICB2YXIgd2NhY2hlID0ge307XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2FjaGVLZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgdmFyIGtleSA9IGNhY2hlS2V5c1tpXTtcbiAgICAgICAgICAgIHdjYWNoZVtrZXldID0ga2V5O1xuICAgICAgICB9XG4gICAgICAgIHNvdXJjZXNbd2tleV0gPSBbXG4gICAgICAgICAgICAnZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7JyArIGZuICsgJyhzZWxmKTsgfScsXG4gICAgICAgICAgICB3Y2FjaGVcbiAgICAgICAgXTtcbiAgICB9XG4gICAgdmFyIHNrZXkgPSBNYXRoLmZsb29yKE1hdGgucG93KDE2LCA4KSAqIE1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDE2KTtcblxuICAgIHZhciBzY2FjaGUgPSB7fTsgc2NhY2hlW3drZXldID0gd2tleTtcbiAgICBzb3VyY2VzW3NrZXldID0gW1xuICAgICAgICAnZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7JyArXG4gICAgICAgICAgICAvLyB0cnkgdG8gY2FsbCBkZWZhdWx0IGlmIGRlZmluZWQgdG8gYWxzbyBzdXBwb3J0IGJhYmVsIGVzbW9kdWxlIGV4cG9ydHNcbiAgICAgICAgICAgICd2YXIgZiA9IHJlcXVpcmUoJyArIHN0cmluZ2lmeSh3a2V5KSArICcpOycgK1xuICAgICAgICAgICAgJyhmLmRlZmF1bHQgPyBmLmRlZmF1bHQgOiBmKShzZWxmKTsnICtcbiAgICAgICAgJ30nLFxuICAgICAgICBzY2FjaGVcbiAgICBdO1xuXG4gICAgdmFyIHdvcmtlclNvdXJjZXMgPSB7fTtcbiAgICByZXNvbHZlU291cmNlcyhza2V5KTtcblxuICAgIGZ1bmN0aW9uIHJlc29sdmVTb3VyY2VzKGtleSkge1xuICAgICAgICB3b3JrZXJTb3VyY2VzW2tleV0gPSB0cnVlO1xuXG4gICAgICAgIGZvciAodmFyIGRlcFBhdGggaW4gc291cmNlc1trZXldWzFdKSB7XG4gICAgICAgICAgICB2YXIgZGVwS2V5ID0gc291cmNlc1trZXldWzFdW2RlcFBhdGhdO1xuICAgICAgICAgICAgaWYgKCF3b3JrZXJTb3VyY2VzW2RlcEtleV0pIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlU291cmNlcyhkZXBLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNyYyA9ICcoJyArIGJ1bmRsZUZuICsgJykoeydcbiAgICAgICAgKyBPYmplY3Qua2V5cyh3b3JrZXJTb3VyY2VzKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ2lmeShrZXkpICsgJzpbJ1xuICAgICAgICAgICAgICAgICsgc291cmNlc1trZXldWzBdXG4gICAgICAgICAgICAgICAgKyAnLCcgKyBzdHJpbmdpZnkoc291cmNlc1trZXldWzFdKSArICddJ1xuICAgICAgICAgICAgO1xuICAgICAgICB9KS5qb2luKCcsJylcbiAgICAgICAgKyAnfSx7fSxbJyArIHN0cmluZ2lmeShza2V5KSArICddKSdcbiAgICA7XG5cbiAgICB2YXIgVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMIHx8IHdpbmRvdy5tb3pVUkwgfHwgd2luZG93Lm1zVVJMO1xuXG4gICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbc3JjXSwgeyB0eXBlOiAndGV4dC9qYXZhc2NyaXB0JyB9KTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmJhcmUpIHsgcmV0dXJuIGJsb2I7IH1cbiAgICB2YXIgd29ya2VyVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJVcmwpO1xuICAgIHdvcmtlci5vYmplY3RVUkwgPSB3b3JrZXJVcmw7XG4gICAgcmV0dXJuIHdvcmtlcjtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cy5SQURJVVMgPSA2Mzc4MTM3O1xubW9kdWxlLmV4cG9ydHMuRkxBVFRFTklORyA9IDEvMjk4LjI1NzIyMzU2Mztcbm1vZHVsZS5leHBvcnRzLlBPTEFSX1JBRElVUyA9IDYzNTY3NTIuMzE0MjtcbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgXCJ2ZXJzaW9uXCI6IFwiMC40NC4xXCJcbn0iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0cnVjdC1hcnJheXMuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vICAgICAgXG5cbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuY29uc3Qge1N0cnVjdEFycmF5fSA9IHJlcXVpcmUoJy4uL3V0aWwvc3RydWN0X2FycmF5Jyk7XG5jb25zdCB7U3RydWN0fSA9IHJlcXVpcmUoJy4uL3V0aWwvc3RydWN0X2FycmF5Jyk7XG5jb25zdCB7cmVnaXN0ZXJ9ID0gcmVxdWlyZSgnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJyk7XG5jb25zdCBQb2ludCA9IHJlcXVpcmUoJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknKTtcblxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEludDE2WzJdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQyaTQgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MCAgICAgICAgLCB2MSAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICBjb25zdCBvMiA9IGkgKiAyO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cblxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDJpNC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNDtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDJpNCcsIFN0cnVjdEFycmF5TGF5b3V0Mmk0KTtcblxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEludDE2WzRdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQ0aTggZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MCAgICAgICAgLCB2MSAgICAgICAgLCB2MiAgICAgICAgLCB2MyAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICBjb25zdCBvMiA9IGkgKiA0O1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLmludDE2W28yICsgM10gPSB2MztcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG59XG5cblN0cnVjdEFycmF5TGF5b3V0NGk4LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA4O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0NGk4JywgU3RydWN0QXJyYXlMYXlvdXQ0aTgpO1xuXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbMl1cbiAqIFs0XTogSW50MTZbNF1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDJpNGkxMiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwICAgICAgICAsIHYxICAgICAgICAsIHYyICAgICAgICAsIHYzICAgICAgICAsIHY0ICAgICAgICAsIHY1ICAgICAgICApIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDY7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAzXSA9IHYzO1xuICAgICAgICB0aGlzLmludDE2W28yICsgNF0gPSB2NDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDVdID0gdjU7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cblxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDJpNGkxMi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTI7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQyaTRpMTInLCBTdHJ1Y3RBcnJheUxheW91dDJpNGkxMik7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNls0XVxuICogWzhdOiBVaW50OFs0XVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0NGk0dWIxMiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwICAgICAgICAsIHYxICAgICAgICAsIHYyICAgICAgICAsIHYzICAgICAgICAsIHY0ICAgICAgICAsIHY1ICAgICAgICAsIHY2ICAgICAgICAsIHY3ICAgICAgICApIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDY7XG4gICAgICAgIGNvbnN0IG8xID0gaSAqIDEyO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLmludDE2W28yICsgM10gPSB2MztcbiAgICAgICAgdGhpcy51aW50OFtvMSArIDhdID0gdjQ7XG4gICAgICAgIHRoaXMudWludDhbbzEgKyA5XSA9IHY1O1xuICAgICAgICB0aGlzLnVpbnQ4W28xICsgMTBdID0gdjY7XG4gICAgICAgIHRoaXMudWludDhbbzEgKyAxMV0gPSB2NztcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG59XG5cblN0cnVjdEFycmF5TGF5b3V0NGk0dWIxMi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTI7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQ0aTR1YjEyJywgU3RydWN0QXJyYXlMYXlvdXQ0aTR1YjEyKTtcblxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEludDE2WzRdXG4gKiBbOF06IFVpbnQxNls0XVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0NGk0dWkxNiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwICAgICAgICAsIHYxICAgICAgICAsIHYyICAgICAgICAsIHYzICAgICAgICAsIHY0ICAgICAgICAsIHY1ICAgICAgICAsIHY2ICAgICAgICAsIHY3ICAgICAgICApIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDg7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAzXSA9IHYzO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDRdID0gdjQ7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgNV0gPSB2NTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA2XSA9IHY2O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDddID0gdjc7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cblxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDRpNHVpMTYucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDE2O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0NGk0dWkxNicsIFN0cnVjdEFycmF5TGF5b3V0NGk0dWkxNik7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBGbG9hdDMyWzNdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQzZjEyIGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MCAgICAgICAgLCB2MSAgICAgICAgLCB2MiAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICBjb25zdCBvNCA9IGkgKiAzO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAyXSA9IHYyO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG5cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQzZjEyLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAxMjtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDNmMTInLCBTdHJ1Y3RBcnJheUxheW91dDNmMTIpO1xuXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogVWludDMyWzFdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQxdWw0IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwICAgICAgICApIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDE7XG4gICAgICAgIHRoaXMudWludDMyW280ICsgMF0gPSB2MDtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG59XG5cblN0cnVjdEFycmF5TGF5b3V0MXVsNC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNDtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDF1bDQnLCBTdHJ1Y3RBcnJheUxheW91dDF1bDQpO1xuXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbNl1cbiAqIFsxMl06IFVpbnQzMlsxXVxuICogWzE2XTogVWludDE2WzJdXG4gKiBbMjBdOiBJbnQxNlsyXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0NmkxdWwydWkyaTI0IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQzMiA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjAgICAgICAgICwgdjEgICAgICAgICwgdjIgICAgICAgICwgdjMgICAgICAgICwgdjQgICAgICAgICwgdjUgICAgICAgICwgdjYgICAgICAgICwgdjcgICAgICAgICwgdjggICAgICAgICwgdjkgICAgICAgICwgdjEwICAgICAgICApIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDEyO1xuICAgICAgICBjb25zdCBvNCA9IGkgKiA2O1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLmludDE2W28yICsgM10gPSB2MztcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDRdID0gdjQ7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyA1XSA9IHY1O1xuICAgICAgICB0aGlzLnVpbnQzMltvNCArIDNdID0gdjY7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgOF0gPSB2NztcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA5XSA9IHY4O1xuICAgICAgICB0aGlzLmludDE2W28yICsgMTBdID0gdjk7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxMV0gPSB2MTA7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cblxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDZpMXVsMnVpMmkyNC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMjQ7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQ2aTF1bDJ1aTJpMjQnLCBTdHJ1Y3RBcnJheUxheW91dDZpMXVsMnVpMmkyNCk7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNlsyXVxuICogWzRdOiBJbnQxNlsyXVxuICogWzhdOiBJbnQxNlsyXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0MmkyaTJpMTIgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MCAgICAgICAgLCB2MSAgICAgICAgLCB2MiAgICAgICAgLCB2MyAgICAgICAgLCB2NCAgICAgICAgLCB2NSAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICBjb25zdCBvMiA9IGkgKiA2O1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLmludDE2W28yICsgM10gPSB2MztcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDRdID0gdjQ7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyA1XSA9IHY1O1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG5cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQyaTJpMmkxMi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTI7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQyaTJpMmkxMicsIFN0cnVjdEFycmF5TGF5b3V0MmkyaTJpMTIpO1xuXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogVWludDhbMl1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDJ1YjQgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjAgICAgICAgICwgdjEgICAgICAgICkge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgY29uc3QgbzEgPSBpICogNDtcbiAgICAgICAgdGhpcy51aW50OFtvMSArIDBdID0gdjA7XG4gICAgICAgIHRoaXMudWludDhbbzEgKyAxXSA9IHYxO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG5cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQydWI0LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA0O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0MnViNCcsIFN0cnVjdEFycmF5TGF5b3V0MnViNCk7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNlsyXVxuICogWzRdOiBVaW50MTZbMl1cbiAqIFs4XTogVWludDMyWzNdXG4gKiBbMjBdOiBVaW50MTZbM11cbiAqIFsyOF06IEZsb2F0MzJbMl1cbiAqIFszNl06IFVpbnQ4WzJdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQyaTJ1aTN1bDN1aTJmMnViNDAgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MzIgPSBuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjAgICAgICAgICwgdjEgICAgICAgICwgdjIgICAgICAgICwgdjMgICAgICAgICwgdjQgICAgICAgICwgdjUgICAgICAgICwgdjYgICAgICAgICwgdjcgICAgICAgICwgdjggICAgICAgICwgdjkgICAgICAgICwgdjEwICAgICAgICAsIHYxMSAgICAgICAgLCB2MTIgICAgICAgICwgdjEzICAgICAgICApIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDIwO1xuICAgICAgICBjb25zdCBvNCA9IGkgKiAxMDtcbiAgICAgICAgY29uc3QgbzEgPSBpICogNDA7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDNdID0gdjM7XG4gICAgICAgIHRoaXMudWludDMyW280ICsgMl0gPSB2NDtcbiAgICAgICAgdGhpcy51aW50MzJbbzQgKyAzXSA9IHY1O1xuICAgICAgICB0aGlzLnVpbnQzMltvNCArIDRdID0gdjY7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTBdID0gdjc7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTFdID0gdjg7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTJdID0gdjk7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDddID0gdjEwO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyA4XSA9IHYxMTtcbiAgICAgICAgdGhpcy51aW50OFtvMSArIDM2XSA9IHYxMjtcbiAgICAgICAgdGhpcy51aW50OFtvMSArIDM3XSA9IHYxMztcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG59XG5cblN0cnVjdEFycmF5TGF5b3V0MmkydWkzdWwzdWkyZjJ1YjQwLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA0MDtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDJpMnVpM3VsM3VpMmYydWI0MCcsIFN0cnVjdEFycmF5TGF5b3V0MmkydWkzdWwzdWkyZjJ1YjQwKTtcblxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEZsb2F0MzJbMV1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDFmNCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjAgICAgICAgICkge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgY29uc3QgbzQgPSBpICogMTtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMF0gPSB2MDtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG59XG5cblN0cnVjdEFycmF5TGF5b3V0MWY0LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA0O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0MWY0JywgU3RydWN0QXJyYXlMYXlvdXQxZjQpO1xuXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbM11cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDNpNiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwICAgICAgICAsIHYxICAgICAgICAsIHYyICAgICAgICApIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDM7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cblxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDNpNi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNjtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDNpNicsIFN0cnVjdEFycmF5TGF5b3V0M2k2KTtcblxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IFVpbnQzMlsxXVxuICogWzRdOiBVaW50MTZbMl1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDF1bDJ1aTggZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQzMiA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjAgICAgICAgICwgdjEgICAgICAgICwgdjIgICAgICAgICkge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgY29uc3QgbzQgPSBpICogMjtcbiAgICAgICAgY29uc3QgbzIgPSBpICogNDtcbiAgICAgICAgdGhpcy51aW50MzJbbzQgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDJdID0gdjE7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgM10gPSB2MjtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG59XG5cblN0cnVjdEFycmF5TGF5b3V0MXVsMnVpOC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gODtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDF1bDJ1aTgnLCBTdHJ1Y3RBcnJheUxheW91dDF1bDJ1aTgpO1xuXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogVWludDE2WzNdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQzdWk2IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwICAgICAgICAsIHYxICAgICAgICAsIHYyICAgICAgICApIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDM7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cblxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDN1aTYucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDY7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQzdWk2JywgU3RydWN0QXJyYXlMYXlvdXQzdWk2KTtcblxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IFVpbnQxNlsyXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0MnVpNCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MCAgICAgICAgLCB2MSAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICBjb25zdCBvMiA9IGkgKiAyO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG59XG5cblN0cnVjdEFycmF5TGF5b3V0MnVpNC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNDtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDJ1aTQnLCBTdHJ1Y3RBcnJheUxheW91dDJ1aTQpO1xuXG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogRmxvYXQzMlsyXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0MmY4IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MCAgICAgICAgLCB2MSAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICBjb25zdCBvNCA9IGkgKiAyO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAxXSA9IHYxO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG5cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQyZjgucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDg7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQyZjgnLCBTdHJ1Y3RBcnJheUxheW91dDJmOCk7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBGbG9hdDMyWzRdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQ0ZjE2IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MCAgICAgICAgLCB2MSAgICAgICAgLCB2MiAgICAgICAgLCB2MyAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICBjb25zdCBvNCA9IGkgKiA0O1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAzXSA9IHYzO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG5cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQ0ZjE2LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAxNjtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDRmMTYnLCBTdHJ1Y3RBcnJheUxheW91dDRmMTYpO1xuXG5cbmNsYXNzIENvbGxpc2lvbkJveFN0cnVjdCBleHRlbmRzIFN0cnVjdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICBnZXQgYW5jaG9yUG9pbnRYKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDBdOyB9XG4gICAgc2V0IGFuY2hvclBvaW50WCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAwXSA9IHg7IH1cbiAgICBnZXQgYW5jaG9yUG9pbnRZKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDFdOyB9XG4gICAgc2V0IGFuY2hvclBvaW50WSh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxXSA9IHg7IH1cbiAgICBnZXQgeDEoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMl07IH1cbiAgICBzZXQgeDEoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMl0gPSB4OyB9XG4gICAgZ2V0IHkxKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDNdOyB9XG4gICAgc2V0IHkxKHgpIHsgdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDNdID0geDsgfVxuICAgIGdldCB4MigpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyA0XTsgfVxuICAgIHNldCB4Mih4KSB7IHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyA0XSA9IHg7IH1cbiAgICBnZXQgeTIoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgNV07IH1cbiAgICBzZXQgeTIoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgNV0gPSB4OyB9XG4gICAgZ2V0IGZlYXR1cmVJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgM107IH1cbiAgICBzZXQgZmVhdHVyZUluZGV4KHgpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAzXSA9IHg7IH1cbiAgICBnZXQgc291cmNlTGF5ZXJJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgOF07IH1cbiAgICBzZXQgc291cmNlTGF5ZXJJbmRleCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgOF0gPSB4OyB9XG4gICAgZ2V0IGJ1Y2tldEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyA5XTsgfVxuICAgIHNldCBidWNrZXRJbmRleCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgOV0gPSB4OyB9XG4gICAgZ2V0IHJhZGl1cygpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxMF07IH1cbiAgICBzZXQgcmFkaXVzKHgpIHsgdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDEwXSA9IHg7IH1cbiAgICBnZXQgc2lnbmVkRGlzdGFuY2VGcm9tQW5jaG9yKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDExXTsgfVxuICAgIHNldCBzaWduZWREaXN0YW5jZUZyb21BbmNob3IoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMTFdID0geDsgfVxuICAgIGdldCBhbmNob3JQb2ludCgpIHsgcmV0dXJuIG5ldyBQb2ludCh0aGlzLmFuY2hvclBvaW50WCwgdGhpcy5hbmNob3JQb2ludFkpOyB9XG59XG5cbkNvbGxpc2lvbkJveFN0cnVjdC5wcm90b3R5cGUuc2l6ZSA9IDI0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBDb2xsaXNpb25Cb3hBcnJheSBleHRlbmRzIFN0cnVjdEFycmF5TGF5b3V0NmkxdWwydWkyaTI0IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIENvbGxpc2lvbkJveFN0cnVjdCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gaW4gdGhlIGFycmF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gICAgICovXG4gICAgZ2V0KGluZGV4ICAgICAgICApICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICBhc3NlcnQoIXRoaXMuaXNUcmFuc2ZlcnJlZCk7XG4gICAgICAgIHJldHVybiBuZXcgQ29sbGlzaW9uQm94U3RydWN0KHRoaXMsIGluZGV4KTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdDb2xsaXNpb25Cb3hBcnJheScsIENvbGxpc2lvbkJveEFycmF5KTtcblxuY2xhc3MgUGxhY2VkU3ltYm9sU3RydWN0IGV4dGVuZHMgU3RydWN0IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICBnZXQgYW5jaG9yWCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAwXTsgfVxuICAgIHNldCBhbmNob3JYKHgpIHsgdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDBdID0geDsgfVxuICAgIGdldCBhbmNob3JZKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDFdOyB9XG4gICAgc2V0IGFuY2hvclkoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMV0gPSB4OyB9XG4gICAgZ2V0IGdseXBoU3RhcnRJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMl07IH1cbiAgICBzZXQgZ2x5cGhTdGFydEluZGV4KHgpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAyXSA9IHg7IH1cbiAgICBnZXQgbnVtR2x5cGhzKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAzXTsgfVxuICAgIHNldCBudW1HbHlwaHMoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDNdID0geDsgfVxuICAgIGdldCB2ZXJ0ZXhTdGFydEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAyXTsgfVxuICAgIHNldCB2ZXJ0ZXhTdGFydEluZGV4KHgpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAyXSA9IHg7IH1cbiAgICBnZXQgbGluZVN0YXJ0SW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDNdOyB9XG4gICAgc2V0IGxpbmVTdGFydEluZGV4KHgpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAzXSA9IHg7IH1cbiAgICBnZXQgbGluZUxlbmd0aCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgNF07IH1cbiAgICBzZXQgbGluZUxlbmd0aCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgNF0gPSB4OyB9XG4gICAgZ2V0IHNlZ21lbnQoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDEwXTsgfVxuICAgIHNldCBzZWdtZW50KHgpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxMF0gPSB4OyB9XG4gICAgZ2V0IGxvd2VyU2l6ZSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTFdOyB9XG4gICAgc2V0IGxvd2VyU2l6ZSh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTFdID0geDsgfVxuICAgIGdldCB1cHBlclNpemUoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDEyXTsgfVxuICAgIHNldCB1cHBlclNpemUoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDEyXSA9IHg7IH1cbiAgICBnZXQgbGluZU9mZnNldFgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyA3XTsgfVxuICAgIHNldCBsaW5lT2Zmc2V0WCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDddID0geDsgfVxuICAgIGdldCBsaW5lT2Zmc2V0WSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDhdOyB9XG4gICAgc2V0IGxpbmVPZmZzZXRZKHgpIHsgdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0ICsgOF0gPSB4OyB9XG4gICAgZ2V0IHdyaXRpbmdNb2RlKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDhbdGhpcy5fcG9zMSArIDM2XTsgfVxuICAgIHNldCB3cml0aW5nTW9kZSh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczEgKyAzNl0gPSB4OyB9XG4gICAgZ2V0IGhpZGRlbigpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczEgKyAzN107IH1cbiAgICBzZXQgaGlkZGVuKHgpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDhbdGhpcy5fcG9zMSArIDM3XSA9IHg7IH1cbn1cblxuUGxhY2VkU3ltYm9sU3RydWN0LnByb3RvdHlwZS5zaXplID0gNDA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFBsYWNlZFN5bWJvbEFycmF5IGV4dGVuZHMgU3RydWN0QXJyYXlMYXlvdXQyaTJ1aTN1bDN1aTJmMnViNDAge1xuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgUGxhY2VkU3ltYm9sU3RydWN0IGF0IHRoZSBnaXZlbiBsb2NhdGlvbiBpbiB0aGUgYXJyYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKi9cbiAgICBnZXQoaW5kZXggICAgICAgICkgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgIGFzc2VydCghdGhpcy5pc1RyYW5zZmVycmVkKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQbGFjZWRTeW1ib2xTdHJ1Y3QodGhpcywgaW5kZXgpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ1BsYWNlZFN5bWJvbEFycmF5JywgUGxhY2VkU3ltYm9sQXJyYXkpO1xuXG5jbGFzcyBHbHlwaE9mZnNldFN0cnVjdCBleHRlbmRzIFN0cnVjdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICBnZXQgb2Zmc2V0WCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDBdOyB9XG4gICAgc2V0IG9mZnNldFgoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyAwXSA9IHg7IH1cbn1cblxuR2x5cGhPZmZzZXRTdHJ1Y3QucHJvdG90eXBlLnNpemUgPSA0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgR2x5cGhPZmZzZXRBcnJheSBleHRlbmRzIFN0cnVjdEFycmF5TGF5b3V0MWY0IHtcbiAgICBnZXRvZmZzZXRYKGluZGV4ICAgICAgICApIHsgcmV0dXJuIHRoaXMuZmxvYXQzMltpbmRleCAqIDEgKyAwXTsgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgR2x5cGhPZmZzZXRTdHJ1Y3QgYXQgdGhlIGdpdmVuIGxvY2F0aW9uIGluIHRoZSBhcnJheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50LlxuICAgICAqL1xuICAgIGdldChpbmRleCAgICAgICAgKSAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICBhc3NlcnQoIXRoaXMuaXNUcmFuc2ZlcnJlZCk7XG4gICAgICAgIHJldHVybiBuZXcgR2x5cGhPZmZzZXRTdHJ1Y3QodGhpcywgaW5kZXgpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0dseXBoT2Zmc2V0QXJyYXknLCBHbHlwaE9mZnNldEFycmF5KTtcblxuY2xhc3MgU3ltYm9sTGluZVZlcnRleFN0cnVjdCBleHRlbmRzIFN0cnVjdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgIGdldCB4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDBdOyB9XG4gICAgc2V0IHgoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMF0gPSB4OyB9XG4gICAgZ2V0IHkoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMV07IH1cbiAgICBzZXQgeSh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxXSA9IHg7IH1cbiAgICBnZXQgdGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3IoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMl07IH1cbiAgICBzZXQgdGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3IoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMl0gPSB4OyB9XG59XG5cblN5bWJvbExpbmVWZXJ0ZXhTdHJ1Y3QucHJvdG90eXBlLnNpemUgPSA2O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN5bWJvbExpbmVWZXJ0ZXhBcnJheSBleHRlbmRzIFN0cnVjdEFycmF5TGF5b3V0M2k2IHtcbiAgICBnZXR4KGluZGV4ICAgICAgICApIHsgcmV0dXJuIHRoaXMuaW50MTZbaW5kZXggKiAzICsgMF07IH1cbiAgICBnZXR5KGluZGV4ICAgICAgICApIHsgcmV0dXJuIHRoaXMuaW50MTZbaW5kZXggKiAzICsgMV07IH1cbiAgICBnZXR0aWxlVW5pdERpc3RhbmNlRnJvbUFuY2hvcihpbmRleCAgICAgICAgKSB7IHJldHVybiB0aGlzLmludDE2W2luZGV4ICogMyArIDJdOyB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBTeW1ib2xMaW5lVmVydGV4U3RydWN0IGF0IHRoZSBnaXZlbiBsb2NhdGlvbiBpbiB0aGUgYXJyYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKi9cbiAgICBnZXQoaW5kZXggICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICBhc3NlcnQoIXRoaXMuaXNUcmFuc2ZlcnJlZCk7XG4gICAgICAgIHJldHVybiBuZXcgU3ltYm9sTGluZVZlcnRleFN0cnVjdCh0aGlzLCBpbmRleCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignU3ltYm9sTGluZVZlcnRleEFycmF5JywgU3ltYm9sTGluZVZlcnRleEFycmF5KTtcblxuY2xhc3MgRmVhdHVyZUluZGV4U3RydWN0IGV4dGVuZHMgU3RydWN0IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgIGdldCBmZWF0dXJlSW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDBdOyB9XG4gICAgc2V0IGZlYXR1cmVJbmRleCh4KSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgMF0gPSB4OyB9XG4gICAgZ2V0IHNvdXJjZUxheWVySW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDJdOyB9XG4gICAgc2V0IHNvdXJjZUxheWVySW5kZXgoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDJdID0geDsgfVxuICAgIGdldCBidWNrZXRJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgM107IH1cbiAgICBzZXQgYnVja2V0SW5kZXgoeCkgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDNdID0geDsgfVxufVxuXG5GZWF0dXJlSW5kZXhTdHJ1Y3QucHJvdG90eXBlLnNpemUgPSA4O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBGZWF0dXJlSW5kZXhBcnJheSBleHRlbmRzIFN0cnVjdEFycmF5TGF5b3V0MXVsMnVpOCB7XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBGZWF0dXJlSW5kZXhTdHJ1Y3QgYXQgdGhlIGdpdmVuIGxvY2F0aW9uIGluIHRoZSBhcnJheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50LlxuICAgICAqL1xuICAgIGdldChpbmRleCAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLmlzVHJhbnNmZXJyZWQpO1xuICAgICAgICByZXR1cm4gbmV3IEZlYXR1cmVJbmRleFN0cnVjdCh0aGlzLCBpbmRleCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignRmVhdHVyZUluZGV4QXJyYXknLCBGZWF0dXJlSW5kZXhBcnJheSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgU3RydWN0QXJyYXlMYXlvdXQyaTQsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQ0aTgsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQyaTRpMTIsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQ0aTR1YjEyLFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NGk0dWkxNixcbiAgICBTdHJ1Y3RBcnJheUxheW91dDNmMTIsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQxdWw0LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NmkxdWwydWkyaTI0LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MmkyaTJpMTIsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQydWI0LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MmkydWkzdWwzdWkyZjJ1YjQwLFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MWY0LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0M2k2LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MXVsMnVpOCxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDN1aTYsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQydWk0LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MmY4LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NGYxNixcbiAgICBQb3NBcnJheTogU3RydWN0QXJyYXlMYXlvdXQyaTQsXG4gICAgUmFzdGVyQm91bmRzQXJyYXk6IFN0cnVjdEFycmF5TGF5b3V0NGk4LFxuICAgIENpcmNsZUxheW91dEFycmF5OiBTdHJ1Y3RBcnJheUxheW91dDJpNCxcbiAgICBGaWxsTGF5b3V0QXJyYXk6IFN0cnVjdEFycmF5TGF5b3V0Mmk0LFxuICAgIEZpbGxFeHRydXNpb25MYXlvdXRBcnJheTogU3RydWN0QXJyYXlMYXlvdXQyaTRpMTIsXG4gICAgSGVhdG1hcExheW91dEFycmF5OiBTdHJ1Y3RBcnJheUxheW91dDJpNCxcbiAgICBMaW5lTGF5b3V0QXJyYXk6IFN0cnVjdEFycmF5TGF5b3V0NGk0dWIxMixcbiAgICBTeW1ib2xMYXlvdXRBcnJheTogU3RydWN0QXJyYXlMYXlvdXQ0aTR1aTE2LFxuICAgIFN5bWJvbER5bmFtaWNMYXlvdXRBcnJheTogU3RydWN0QXJyYXlMYXlvdXQzZjEyLFxuICAgIFN5bWJvbE9wYWNpdHlBcnJheTogU3RydWN0QXJyYXlMYXlvdXQxdWw0LFxuICAgIENvbGxpc2lvbkJveExheW91dEFycmF5OiBTdHJ1Y3RBcnJheUxheW91dDJpMmkyaTEyLFxuICAgIENvbGxpc2lvbkNpcmNsZUxheW91dEFycmF5OiBTdHJ1Y3RBcnJheUxheW91dDJpMmkyaTEyLFxuICAgIENvbGxpc2lvblZlcnRleEFycmF5OiBTdHJ1Y3RBcnJheUxheW91dDJ1YjQsXG4gICAgVHJpYW5nbGVJbmRleEFycmF5OiBTdHJ1Y3RBcnJheUxheW91dDN1aTYsXG4gICAgTGluZUluZGV4QXJyYXk6IFN0cnVjdEFycmF5TGF5b3V0MnVpNCxcbiAgICBDb2xsaXNpb25Cb3hBcnJheSxcbiAgICBQbGFjZWRTeW1ib2xBcnJheSxcbiAgICBHbHlwaE9mZnNldEFycmF5LFxuICAgIFN5bWJvbExpbmVWZXJ0ZXhBcnJheSxcbiAgICBGZWF0dXJlSW5kZXhBcnJheVxufTtcbiIsIi8vICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gXG5cbi8qKlxuICogVGhlIGBCdWNrZXRgIGludGVyZmFjZSBpcyB0aGUgc2luZ2xlIHBvaW50IG9mIGtub3dsZWRnZSBhYm91dCB0dXJuaW5nIHZlY3RvclxuICogdGlsZXMgaW50byBXZWJHTCBidWZmZXJzLlxuICpcbiAqIGBCdWNrZXRgIGlzIGFuIGFic3RyYWN0IGludGVyZmFjZS4gQW4gaW1wbGVtZW50YXRpb24gZXhpc3RzIGZvciBlYWNoIHN0eWxlIGxheWVyIHR5cGUuXG4gKiBDcmVhdGUgYSBidWNrZXQgdmlhIHRoZSBgU3R5bGVMYXllciNjcmVhdGVCdWNrZXRgIG1ldGhvZC5cbiAqXG4gKiBUaGUgY29uY3JldGUgYnVja2V0IHR5cGVzLCB1c2luZyBsYXlvdXQgb3B0aW9ucyBmcm9tIHRoZSBzdHlsZSBsYXllcixcbiAqIHRyYW5zZm9ybSBmZWF0dXJlIGdlb21ldHJpZXMgaW50byB2ZXJ0ZXggYW5kIGluZGV4IGRhdGEgZm9yIHVzZSBieSB0aGVcbiAqIHZlcnRleCBzaGFkZXIuICBUaGV5IGFsc28gKHZpYSBgUHJvZ3JhbUNvbmZpZ3VyYXRpb25gKSB1c2UgZmVhdHVyZVxuICogcHJvcGVydGllcyBhbmQgdGhlIHpvb20gbGV2ZWwgdG8gcG9wdWxhdGUgdGhlIGF0dHJpYnV0ZXMgbmVlZGVkIGZvclxuICogZGF0YS1kcml2ZW4gc3R5bGluZy5cbiAqXG4gKiBCdWNrZXRzIGFyZSBkZXNpZ25lZCB0byBiZSBidWlsdCBvbiBhIHdvcmtlciB0aHJlYWQgYW5kIHRoZW4gc2VyaWFsaXplZCBhbmRcbiAqIHRyYW5zZmVycmVkIGJhY2sgdG8gdGhlIG1haW4gdGhyZWFkIGZvciByZW5kZXJpbmcuICBPbiB0aGUgd29ya2VyIHNpZGUsIGFcbiAqIGJ1Y2tldCdzIHZlcnRleCwgaW5kZXgsIGFuZCBhdHRyaWJ1dGUgZGF0YSBpcyBzdG9yZWQgaW4gYGJ1Y2tldC5hcnJheXM6XG4gKiBBcnJheUdyb3VwYC4gIFdoZW4gYSBidWNrZXQncyBkYXRhIGlzIHNlcmlhbGl6ZWQgYW5kIHNlbnQgYmFjayB0byB0aGUgbWFpblxuICogdGhyZWFkLCBpcyBnZXRzIGRlc2VyaWFsaXplZCAodXNpbmcgYG5ldyBCdWNrZXQoc2VyaWFsaXplZEJ1Y2tldERhdGEpYCwgd2l0aFxuICogdGhlIGFycmF5IGRhdGEgbm93IHN0b3JlZCBpbiBgYnVja2V0LmJ1ZmZlcnM6IEJ1ZmZlckdyb3VwYC4gIEJ1ZmZlckdyb3Vwc1xuICogaG9sZCB0aGUgc2FtZSBkYXRhIGFzIEFycmF5R3JvdXBzLCBidXQgYXJlIHR1bmVkIGZvciBjb25zdW1wdGlvbiBieSBXZWJHTC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgIFxuICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuIFxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBkZXNlcmlhbGl6ZShpbnB1dCAgICAgICAgICAgICAgICwgc3R5bGUgICAgICAgKSAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0ge307XG5cbiAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCB0aGUgY2FzZSB3aGVyZSB0aGUgbWFwJ3Mgc3R5bGUgaGFzIGJlZW4gc2V0IHRvIG51bGwgd2hpbGVcbiAgICAgICAgLy8gdGhpcyBidWNrZXQgaGFzIGJlZW4gcGFyc2luZy5cbiAgICAgICAgaWYgKCFzdHlsZSkgcmV0dXJuIG91dHB1dDtcblxuICAgICAgICBmb3IgKGNvbnN0IGJ1Y2tldCBvZiBpbnB1dCkge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJzID0gYnVja2V0LmxheWVySWRzXG4gICAgICAgICAgICAgICAgLm1hcCgoaWQpID0+IHN0eWxlLmdldExheWVyKGlkKSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgICAgICBpZiAobGF5ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBsb29rIHVwIFN0eWxlTGF5ZXIgb2JqZWN0cyBmcm9tIGxheWVyIGlkcyAoc2luY2Ugd2UgZG9uJ3RcbiAgICAgICAgICAgIC8vIHdhbnQgdG8gd2FzdGUgdGltZSBzZXJpYWxpemluZy9jb3B5aW5nIHRoZW0gZnJvbSB0aGUgd29ya2VyKVxuICAgICAgICAgICAgKGJ1Y2tldCAgICAgKS5sYXllcnMgPSBsYXllcnM7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W2xheWVyLmlkXSA9IGJ1Y2tldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxufTtcbiIsIi8vICAgICAgXG5jb25zdCB7Y3JlYXRlTGF5b3V0fSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvc3RydWN0X2FycmF5Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX3BvcycsIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9XG5dLCA0KTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IHtDaXJjbGVMYXlvdXRBcnJheX0gPSByZXF1aXJlKCcuLi9hcnJheV90eXBlcycpO1xuY29uc3QgbGF5b3V0QXR0cmlidXRlcyA9IHJlcXVpcmUoJy4vY2lyY2xlX2F0dHJpYnV0ZXMnKS5tZW1iZXJzO1xuY29uc3Qge1NlZ21lbnRWZWN0b3J9ID0gcmVxdWlyZSgnLi4vc2VnbWVudCcpO1xuY29uc3Qge1Byb2dyYW1Db25maWd1cmF0aW9uU2V0fSA9IHJlcXVpcmUoJy4uL3Byb2dyYW1fY29uZmlndXJhdGlvbicpO1xuY29uc3Qge1RyaWFuZ2xlSW5kZXhBcnJheX0gPSByZXF1aXJlKCcuLi9pbmRleF9hcnJheV90eXBlJyk7XG5jb25zdCBsb2FkR2VvbWV0cnkgPSByZXF1aXJlKCcuLi9sb2FkX2dlb21ldHJ5Jyk7XG5jb25zdCBFWFRFTlQgPSByZXF1aXJlKCcuLi9leHRlbnQnKTtcbmNvbnN0IHtyZWdpc3Rlcn0gPSByZXF1aXJlKCcuLi8uLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXInKTtcblxuICAgICAgICAgICAgIFxuICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5mdW5jdGlvbiBhZGRDaXJjbGVWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIHgsIHksIGV4dHJ1ZGVYLCBleHRydWRlWSkge1xuICAgIGxheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICAoeCAqIDIpICsgKChleHRydWRlWCArIDEpIC8gMiksXG4gICAgICAgICh5ICogMikgKyAoKGV4dHJ1ZGVZICsgMSkgLyAyKSk7XG59XG5cblxuLyoqXG4gKiBDaXJjbGVzIGFyZSByZXByZXNlbnRlZCBieSB0d28gdHJpYW5nbGVzLlxuICpcbiAqIEVhY2ggY29ybmVyIGhhcyBhIHBvcyB0aGF0IGlzIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZSBhbmQgYW4gZXh0cnVzaW9uXG4gKiB2ZWN0b3IgdGhhdCBpcyB3aGVyZSBpdCBwb2ludHMuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBDaXJjbGVCdWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLnpvb20gPSBvcHRpb25zLnpvb207XG4gICAgICAgIHRoaXMub3ZlcnNjYWxpbmcgPSBvcHRpb25zLm92ZXJzY2FsaW5nO1xuICAgICAgICB0aGlzLmxheWVycyA9IG9wdGlvbnMubGF5ZXJzO1xuICAgICAgICB0aGlzLmxheWVySWRzID0gdGhpcy5sYXllcnMubWFwKGxheWVyID0+IGxheWVyLmlkKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG9wdGlvbnMuaW5kZXg7XG5cbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSA9IG5ldyBDaXJjbGVMYXlvdXRBcnJheSgpO1xuICAgICAgICB0aGlzLmluZGV4QXJyYXkgPSBuZXcgVHJpYW5nbGVJbmRleEFycmF5KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSBuZXcgU2VnbWVudFZlY3RvcigpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvblNldChsYXlvdXRBdHRyaWJ1dGVzLCBvcHRpb25zLmxheWVycywgb3B0aW9ucy56b29tKTtcbiAgICB9XG5cbiAgICBwb3B1bGF0ZShmZWF0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgLCBvcHRpb25zICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgZm9yIChjb25zdCB7ZmVhdHVyZSwgaW5kZXgsIHNvdXJjZUxheWVySW5kZXh9IG9mIGZlYXR1cmVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIoe3pvb206IHRoaXMuem9vbX0sIGZlYXR1cmUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSBsb2FkR2VvbWV0cnkoZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGZlYXR1cmUsIGdlb21ldHJ5KTtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmZlYXR1cmVJbmRleC5pbnNlcnQoZmVhdHVyZSwgZ2VvbWV0cnksIGluZGV4LCBzb3VyY2VMYXllckluZGV4LCB0aGlzLmluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dCAgICAgICAgICkge1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIGxheW91dEF0dHJpYnV0ZXMpO1xuICAgICAgICB0aGlzLmluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGxvYWQoY29udGV4dCk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dFZlcnRleEJ1ZmZlcikgcmV0dXJuO1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGFkZEZlYXR1cmUoZmVhdHVyZSAgICAgICAgICAgICAgICAgICAsIGdlb21ldHJ5ICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmluZyBvZiBnZW9tZXRyeSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiByaW5nKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeCA9IHBvaW50Lng7XG4gICAgICAgICAgICAgICAgY29uc3QgeSA9IHBvaW50Lnk7XG5cbiAgICAgICAgICAgICAgICAvLyBEbyBub3QgaW5jbHVkZSBwb2ludHMgdGhhdCBhcmUgb3V0c2lkZSB0aGUgdGlsZSBib3VuZGFyaWVzLlxuICAgICAgICAgICAgICAgIGlmICh4IDwgMCB8fCB4ID49IEVYVEVOVCB8fCB5IDwgMCB8fCB5ID49IEVYVEVOVCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAvLyB0aGlzIGdlb21ldHJ5IHdpbGwgYmUgb2YgdGhlIFBvaW50IHR5cGUsIGFuZCB3ZSdsbCBkZXJpdmVcbiAgICAgICAgICAgICAgICAvLyB0d28gdHJpYW5nbGVzIGZyb20gaXQuXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAgICAgICAgICAgICAgICAvLyDilIIgMyAgICAgMiDilIJcbiAgICAgICAgICAgICAgICAvLyDilIIgICAgICAgICDilIJcbiAgICAgICAgICAgICAgICAvLyDilIIgMCAgICAgMSDilIJcbiAgICAgICAgICAgICAgICAvLyDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcblxuICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzZWdtZW50LnZlcnRleExlbmd0aDtcblxuICAgICAgICAgICAgICAgIGFkZENpcmNsZVZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCB4LCB5LCAtMSwgLTEpO1xuICAgICAgICAgICAgICAgIGFkZENpcmNsZVZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCB4LCB5LCAxLCAtMSk7XG4gICAgICAgICAgICAgICAgYWRkQ2lyY2xlVmVydGV4KHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHgsIHksIDEsIDEpO1xuICAgICAgICAgICAgICAgIGFkZENpcmNsZVZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCB4LCB5LCAtMSwgMSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgMSwgaW5kZXggKyAyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgMywgaW5kZXggKyAyKTtcblxuICAgICAgICAgICAgICAgIHNlZ21lbnQudmVydGV4TGVuZ3RoICs9IDQ7XG4gICAgICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnBvcHVsYXRlUGFpbnRBcnJheXModGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsIGZlYXR1cmUpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0NpcmNsZUJ1Y2tldCcsIENpcmNsZUJ1Y2tldCwge29taXQ6IFsnbGF5ZXJzJ119KTtcblxubW9kdWxlLmV4cG9ydHMgPSBDaXJjbGVCdWNrZXQ7XG4iLCIvLyAgICAgIFxuY29uc3Qge2NyZWF0ZUxheW91dH0gPSByZXF1aXJlKCcuLi8uLi91dGlsL3N0cnVjdF9hcnJheScpO1xubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAnYV9wb3MnLCBjb21wb25lbnRzOiAyLCB0eXBlOiAnSW50MTYnfVxuXSwgNCk7XG4iLCIvLyAgICAgIFxuXG5jb25zdCB7RmlsbExheW91dEFycmF5fSA9IHJlcXVpcmUoJy4uL2FycmF5X3R5cGVzJyk7XG5jb25zdCBsYXlvdXRBdHRyaWJ1dGVzID0gcmVxdWlyZSgnLi9maWxsX2F0dHJpYnV0ZXMnKS5tZW1iZXJzO1xuY29uc3Qge1NlZ21lbnRWZWN0b3J9ID0gcmVxdWlyZSgnLi4vc2VnbWVudCcpO1xuY29uc3Qge1Byb2dyYW1Db25maWd1cmF0aW9uU2V0fSA9IHJlcXVpcmUoJy4uL3Byb2dyYW1fY29uZmlndXJhdGlvbicpO1xuY29uc3Qge0xpbmVJbmRleEFycmF5LCBUcmlhbmdsZUluZGV4QXJyYXl9ID0gcmVxdWlyZSgnLi4vaW5kZXhfYXJyYXlfdHlwZScpO1xuY29uc3QgbG9hZEdlb21ldHJ5ID0gcmVxdWlyZSgnLi4vbG9hZF9nZW9tZXRyeScpO1xuY29uc3QgZWFyY3V0ID0gcmVxdWlyZSgnZWFyY3V0Jyk7XG5jb25zdCBjbGFzc2lmeVJpbmdzID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9jbGFzc2lmeV9yaW5ncycpO1xuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG5jb25zdCBFQVJDVVRfTUFYX1JJTkdTID0gNTAwO1xuY29uc3Qge3JlZ2lzdGVyfSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2ZlcicpO1xuXG4gICAgICAgICAgICAgXG4gICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNsYXNzIEZpbGxCdWNrZXQgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy56b29tID0gb3B0aW9ucy56b29tO1xuICAgICAgICB0aGlzLm92ZXJzY2FsaW5nID0gb3B0aW9ucy5vdmVyc2NhbGluZztcbiAgICAgICAgdGhpcy5sYXllcnMgPSBvcHRpb25zLmxheWVycztcbiAgICAgICAgdGhpcy5sYXllcklkcyA9IHRoaXMubGF5ZXJzLm1hcChsYXllciA9PiBsYXllci5pZCk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBvcHRpb25zLmluZGV4O1xuXG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgRmlsbExheW91dEFycmF5KCk7XG4gICAgICAgIHRoaXMuaW5kZXhBcnJheSA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5pbmRleEFycmF5MiA9IG5ldyBMaW5lSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvblNldChsYXlvdXRBdHRyaWJ1dGVzLCBvcHRpb25zLmxheWVycywgb3B0aW9ucy56b29tKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBTZWdtZW50VmVjdG9yKCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMyID0gbmV3IFNlZ21lbnRWZWN0b3IoKTtcbiAgICB9XG5cbiAgICBwb3B1bGF0ZShmZWF0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgLCBvcHRpb25zICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgZm9yIChjb25zdCB7ZmVhdHVyZSwgaW5kZXgsIHNvdXJjZUxheWVySW5kZXh9IG9mIGZlYXR1cmVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIoe3pvb206IHRoaXMuem9vbX0sIGZlYXR1cmUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSBsb2FkR2VvbWV0cnkoZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGZlYXR1cmUsIGdlb21ldHJ5KTtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmZlYXR1cmVJbmRleC5pbnNlcnQoZmVhdHVyZSwgZ2VvbWV0cnksIGluZGV4LCBzb3VyY2VMYXllckluZGV4LCB0aGlzLmluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dCAgICAgICAgICkge1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIGxheW91dEF0dHJpYnV0ZXMpO1xuICAgICAgICB0aGlzLmluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkpO1xuICAgICAgICB0aGlzLmluZGV4QnVmZmVyMiA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5Mik7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwbG9hZChjb250ZXh0KTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoIXRoaXMubGF5b3V0VmVydGV4QnVmZmVyKSByZXR1cm47XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnNlZ21lbnRzLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5zZWdtZW50czIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGFkZEZlYXR1cmUoZmVhdHVyZSAgICAgICAgICAgICAgICAgICAsIGdlb21ldHJ5ICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGZvciAoY29uc3QgcG9seWdvbiBvZiBjbGFzc2lmeVJpbmdzKGdlb21ldHJ5LCBFQVJDVVRfTUFYX1JJTkdTKSkge1xuICAgICAgICAgICAgbGV0IG51bVZlcnRpY2VzID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmluZyBvZiBwb2x5Z29uKSB7XG4gICAgICAgICAgICAgICAgbnVtVmVydGljZXMgKz0gcmluZy5sZW5ndGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRyaWFuZ2xlU2VnbWVudCA9IHRoaXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQobnVtVmVydGljZXMsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheSk7XG4gICAgICAgICAgICBjb25zdCB0cmlhbmdsZUluZGV4ID0gdHJpYW5nbGVTZWdtZW50LnZlcnRleExlbmd0aDtcblxuICAgICAgICAgICAgY29uc3QgZmxhdHRlbmVkID0gW107XG4gICAgICAgICAgICBjb25zdCBob2xlSW5kaWNlcyA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJpbmcgb2YgcG9seWdvbikge1xuICAgICAgICAgICAgICAgIGlmIChyaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocmluZyAhPT0gcG9seWdvblswXSkge1xuICAgICAgICAgICAgICAgICAgICBob2xlSW5kaWNlcy5wdXNoKGZsYXR0ZW5lZC5sZW5ndGggLyAyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lU2VnbWVudCA9IHRoaXMuc2VnbWVudHMyLnByZXBhcmVTZWdtZW50KHJpbmcubGVuZ3RoLCB0aGlzLmxheW91dFZlcnRleEFycmF5LCB0aGlzLmluZGV4QXJyYXkyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lSW5kZXggPSBsaW5lU2VnbWVudC52ZXJ0ZXhMZW5ndGg7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHJpbmdbMF0ueCwgcmluZ1swXS55KTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkyLmVtcGxhY2VCYWNrKGxpbmVJbmRleCArIHJpbmcubGVuZ3RoIC0gMSwgbGluZUluZGV4KTtcbiAgICAgICAgICAgICAgICBmbGF0dGVuZWQucHVzaChyaW5nWzBdLngpO1xuICAgICAgICAgICAgICAgIGZsYXR0ZW5lZC5wdXNoKHJpbmdbMF0ueSk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhyaW5nW2ldLngsIHJpbmdbaV0ueSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheTIuZW1wbGFjZUJhY2sobGluZUluZGV4ICsgaSAtIDEsIGxpbmVJbmRleCArIGkpO1xuICAgICAgICAgICAgICAgICAgICBmbGF0dGVuZWQucHVzaChyaW5nW2ldLngpO1xuICAgICAgICAgICAgICAgICAgICBmbGF0dGVuZWQucHVzaChyaW5nW2ldLnkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxpbmVTZWdtZW50LnZlcnRleExlbmd0aCArPSByaW5nLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBsaW5lU2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gcmluZy5sZW5ndGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGluZGljZXMgPSBlYXJjdXQoZmxhdHRlbmVkLCBob2xlSW5kaWNlcyk7XG4gICAgICAgICAgICBhc3NlcnQoaW5kaWNlcy5sZW5ndGggJSAzID09PSAwKTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleEFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICAgICAgICAgICAgICB0cmlhbmdsZUluZGV4ICsgaW5kaWNlc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgdHJpYW5nbGVJbmRleCArIGluZGljZXNbaSArIDFdLFxuICAgICAgICAgICAgICAgICAgICB0cmlhbmdsZUluZGV4ICsgaW5kaWNlc1tpICsgMl0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cmlhbmdsZVNlZ21lbnQudmVydGV4TGVuZ3RoICs9IG51bVZlcnRpY2VzO1xuICAgICAgICAgICAgdHJpYW5nbGVTZWdtZW50LnByaW1pdGl2ZUxlbmd0aCArPSBpbmRpY2VzLmxlbmd0aCAvIDM7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5wb3B1bGF0ZVBhaW50QXJyYXlzKHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLCBmZWF0dXJlKTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdGaWxsQnVja2V0JywgRmlsbEJ1Y2tldCwge29taXQ6IFsnbGF5ZXJzJ119KTtcblxubW9kdWxlLmV4cG9ydHMgPSBGaWxsQnVja2V0O1xuIiwiLy8gICAgICBcbmNvbnN0IHtjcmVhdGVMYXlvdXR9ID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXknKTtcbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2FfcG9zJywgICAgICAgICAgY29tcG9uZW50czogMiwgdHlwZTogJ0ludDE2J30sXG4gICAge25hbWU6ICdhX25vcm1hbF9lZCcsICAgIGNvbXBvbmVudHM6IDQsIHR5cGU6ICdJbnQxNid9LFxuXSwgNCk7XG4iLCIvLyAgICAgIFxuXG5jb25zdCB7RmlsbEV4dHJ1c2lvbkxheW91dEFycmF5fSA9IHJlcXVpcmUoJy4uL2FycmF5X3R5cGVzJyk7XG5jb25zdCBsYXlvdXRBdHRyaWJ1dGVzID0gcmVxdWlyZSgnLi9maWxsX2V4dHJ1c2lvbl9hdHRyaWJ1dGVzJykubWVtYmVycztcbmNvbnN0IHtTZWdtZW50VmVjdG9yLCBNQVhfVkVSVEVYX0FSUkFZX0xFTkdUSH0gPSByZXF1aXJlKCcuLi9zZWdtZW50Jyk7XG5jb25zdCB7UHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXR9ID0gcmVxdWlyZSgnLi4vcHJvZ3JhbV9jb25maWd1cmF0aW9uJyk7XG5jb25zdCB7VHJpYW5nbGVJbmRleEFycmF5fSA9IHJlcXVpcmUoJy4uL2luZGV4X2FycmF5X3R5cGUnKTtcbmNvbnN0IGxvYWRHZW9tZXRyeSA9IHJlcXVpcmUoJy4uL2xvYWRfZ2VvbWV0cnknKTtcbmNvbnN0IEVYVEVOVCA9IHJlcXVpcmUoJy4uL2V4dGVudCcpO1xuY29uc3QgZWFyY3V0ID0gcmVxdWlyZSgnZWFyY3V0Jyk7XG5jb25zdCBjbGFzc2lmeVJpbmdzID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9jbGFzc2lmeV9yaW5ncycpO1xuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG5jb25zdCBFQVJDVVRfTUFYX1JJTkdTID0gNTAwO1xuY29uc3Qge3JlZ2lzdGVyfSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2ZlcicpO1xuXG4gICAgICAgICAgICAgXG4gICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jb25zdCBGQUNUT1IgPSBNYXRoLnBvdygyLCAxMyk7XG5cbmZ1bmN0aW9uIGFkZFZlcnRleCh2ZXJ0ZXhBcnJheSwgeCwgeSwgbngsIG55LCBueiwgdCwgZSkge1xuICAgIHZlcnRleEFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICAvLyBhX3Bvc1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICAvLyBhX25vcm1hbF9lZDogMy1jb21wb25lbnQgbm9ybWFsIGFuZCAxLWNvbXBvbmVudCBlZGdlZGlzdGFuY2VcbiAgICAgICAgTWF0aC5mbG9vcihueCAqIEZBQ1RPUikgKiAyICsgdCxcbiAgICAgICAgbnkgKiBGQUNUT1IgKiAyLFxuICAgICAgICBueiAqIEZBQ1RPUiAqIDIsXG4gICAgICAgIC8vIGVkZ2VkaXN0YW5jZSAodXNlZCBmb3Igd3JhcHBpbmcgcGF0dGVybnMgYXJvdW5kIGV4dHJ1c2lvbiBzaWRlcylcbiAgICAgICAgTWF0aC5yb3VuZChlKVxuICAgICk7XG59XG5cblxuY2xhc3MgRmlsbEV4dHJ1c2lvbkJ1Y2tldCAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLnpvb20gPSBvcHRpb25zLnpvb207XG4gICAgICAgIHRoaXMub3ZlcnNjYWxpbmcgPSBvcHRpb25zLm92ZXJzY2FsaW5nO1xuICAgICAgICB0aGlzLmxheWVycyA9IG9wdGlvbnMubGF5ZXJzO1xuICAgICAgICB0aGlzLmxheWVySWRzID0gdGhpcy5sYXllcnMubWFwKGxheWVyID0+IGxheWVyLmlkKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG9wdGlvbnMuaW5kZXg7XG5cbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSA9IG5ldyBGaWxsRXh0cnVzaW9uTGF5b3V0QXJyYXkoKTtcbiAgICAgICAgdGhpcy5pbmRleEFycmF5ID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvblNldChsYXlvdXRBdHRyaWJ1dGVzLCBvcHRpb25zLmxheWVycywgb3B0aW9ucy56b29tKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBTZWdtZW50VmVjdG9yKCk7XG4gICAgfVxuXG4gICAgcG9wdWxhdGUoZmVhdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICwgb3B0aW9ucyAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGZvciAoY29uc3Qge2ZlYXR1cmUsIGluZGV4LCBzb3VyY2VMYXllckluZGV4fSBvZiBmZWF0dXJlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyKHt6b29tOiB0aGlzLnpvb219LCBmZWF0dXJlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdlb21ldHJ5ID0gbG9hZEdlb21ldHJ5KGZlYXR1cmUpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmVhdHVyZShmZWF0dXJlLCBnZW9tZXRyeSk7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5mZWF0dXJlSW5kZXguaW5zZXJ0KGZlYXR1cmUsIGdlb21ldHJ5LCBpbmRleCwgc291cmNlTGF5ZXJJbmRleCwgdGhpcy5pbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmxheW91dFZlcnRleEFycmF5LCBsYXlvdXRBdHRyaWJ1dGVzKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBsb2FkKGNvbnRleHQpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIpIHJldHVybjtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnNlZ21lbnRzLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBhZGRGZWF0dXJlKGZlYXR1cmUgICAgICAgICAgICAgICAgICAgLCBnZW9tZXRyeSAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBmb3IgKGNvbnN0IHBvbHlnb24gb2YgY2xhc3NpZnlSaW5ncyhnZW9tZXRyeSwgRUFSQ1VUX01BWF9SSU5HUykpIHtcbiAgICAgICAgICAgIGxldCBudW1WZXJ0aWNlcyA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJpbmcgb2YgcG9seWdvbikge1xuICAgICAgICAgICAgICAgIG51bVZlcnRpY2VzICs9IHJpbmcubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheSk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcmluZyBvZiBwb2x5Z29uKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpc0VudGlyZWx5T3V0c2lkZShyaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgZWRnZURpc3RhbmNlID0gMDtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgcmluZy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwMSA9IHJpbmdbcF07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcDIgPSByaW5nW3AgLSAxXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0JvdW5kYXJ5RWRnZShwMSwgcDIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQudmVydGV4TGVuZ3RoICsgNCA+IE1BWF9WRVJURVhfQVJSQVlfTEVOR1RIKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVycCA9IHAxLnN1YihwMikuX3BlcnAoKS5fdW5pdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3QgPSBwMi5kaXN0KHAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWRnZURpc3RhbmNlICsgZGlzdCA+IDMyNzY4KSBlZGdlRGlzdGFuY2UgPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVmVydGV4KHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHAxLngsIHAxLnksIHBlcnAueCwgcGVycC55LCAwLCAwLCBlZGdlRGlzdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCBwMS54LCBwMS55LCBwZXJwLngsIHBlcnAueSwgMCwgMSwgZWRnZURpc3RhbmNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VEaXN0YW5jZSArPSBkaXN0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVmVydGV4KHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHAyLngsIHAyLnksIHBlcnAueCwgcGVycC55LCAwLCAwLCBlZGdlRGlzdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCBwMi54LCBwMi55LCBwZXJwLngsIHBlcnAueSwgMCwgMSwgZWRnZURpc3RhbmNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvdHRvbVJpZ2h0ID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soYm90dG9tUmlnaHQsIGJvdHRvbVJpZ2h0ICsgMSwgYm90dG9tUmlnaHQgKyAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soYm90dG9tUmlnaHQgKyAxLCBib3R0b21SaWdodCArIDIsIGJvdHRvbVJpZ2h0ICsgMyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50LnZlcnRleExlbmd0aCArPSA0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICs9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWdtZW50LnZlcnRleExlbmd0aCArIG51bVZlcnRpY2VzID4gTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEgpIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50ID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudChudW1WZXJ0aWNlcywgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmxhdHRlbmVkID0gW107XG4gICAgICAgICAgICBjb25zdCBob2xlSW5kaWNlcyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgdHJpYW5nbGVJbmRleCA9IHNlZ21lbnQudmVydGV4TGVuZ3RoO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJpbmcgb2YgcG9seWdvbikge1xuICAgICAgICAgICAgICAgIGlmIChyaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocmluZyAhPT0gcG9seWdvblswXSkge1xuICAgICAgICAgICAgICAgICAgICBob2xlSW5kaWNlcy5wdXNoKGZsYXR0ZW5lZC5sZW5ndGggLyAyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IHJpbmdbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgYWRkVmVydGV4KHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHAueCwgcC55LCAwLCAwLCAxLCAxLCAwKTtcblxuICAgICAgICAgICAgICAgICAgICBmbGF0dGVuZWQucHVzaChwLngpO1xuICAgICAgICAgICAgICAgICAgICBmbGF0dGVuZWQucHVzaChwLnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW5kaWNlcyA9IGVhcmN1dChmbGF0dGVuZWQsIGhvbGVJbmRpY2VzKTtcbiAgICAgICAgICAgIGFzc2VydChpbmRpY2VzLmxlbmd0aCAlIDMgPT09IDApO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGluZGljZXMubGVuZ3RoOyBqICs9IDMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soXG4gICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlSW5kZXggKyBpbmRpY2VzW2pdLFxuICAgICAgICAgICAgICAgICAgICB0cmlhbmdsZUluZGV4ICsgaW5kaWNlc1tqICsgMV0sXG4gICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlSW5kZXggKyBpbmRpY2VzW2ogKyAyXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICs9IGluZGljZXMubGVuZ3RoIC8gMztcbiAgICAgICAgICAgIHNlZ21lbnQudmVydGV4TGVuZ3RoICs9IG51bVZlcnRpY2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMucG9wdWxhdGVQYWludEFycmF5cyh0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCwgZmVhdHVyZSk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignRmlsbEV4dHJ1c2lvbkJ1Y2tldCcsIEZpbGxFeHRydXNpb25CdWNrZXQsIHtvbWl0OiBbJ2xheWVycyddfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRmlsbEV4dHJ1c2lvbkJ1Y2tldDtcblxuZnVuY3Rpb24gaXNCb3VuZGFyeUVkZ2UocDEsIHAyKSB7XG4gICAgcmV0dXJuIChwMS54ID09PSBwMi54ICYmIChwMS54IDwgMCB8fCBwMS54ID4gRVhURU5UKSkgfHxcbiAgICAgICAgKHAxLnkgPT09IHAyLnkgJiYgKHAxLnkgPCAwIHx8IHAxLnkgPiBFWFRFTlQpKTtcbn1cblxuZnVuY3Rpb24gaXNFbnRpcmVseU91dHNpZGUocmluZykge1xuICAgIHJldHVybiByaW5nLmV2ZXJ5KHAgPT4gcC54IDwgMCkgfHxcbiAgICAgICAgcmluZy5ldmVyeShwID0+IHAueCA+IEVYVEVOVCkgfHxcbiAgICAgICAgcmluZy5ldmVyeShwID0+IHAueSA8IDApIHx8XG4gICAgICAgIHJpbmcuZXZlcnkocCA9PiBwLnkgPiBFWFRFTlQpO1xufVxuIiwiLy8gICAgICBcblxuY29uc3QgQ2lyY2xlQnVja2V0ID0gcmVxdWlyZSgnLi9jaXJjbGVfYnVja2V0Jyk7XG5jb25zdCB7cmVnaXN0ZXJ9ID0gcmVxdWlyZSgnLi4vLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jbGFzcyBIZWF0bWFwQnVja2V0IGV4dGVuZHMgQ2lyY2xlQnVja2V0ICAgICAgICAgICAgICAgICAgICB7XG4gICAgLy8gTmVlZGVkIGZvciBmbG93IHRvIGFjY2VwdCBvbWl0OiBbJ2xheWVycyddIGJlbG93LCBkdWUgdG9cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvNDI2MlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxufVxuXG5yZWdpc3RlcignSGVhdG1hcEJ1Y2tldCcsIEhlYXRtYXBCdWNrZXQsIHtvbWl0OiBbJ2xheWVycyddfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gSGVhdG1hcEJ1Y2tldDtcbiIsIi8vICAgICAgXG5jb25zdCB7Y3JlYXRlTGF5b3V0fSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvc3RydWN0X2FycmF5Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX3Bvc19ub3JtYWwnLCBjb21wb25lbnRzOiA0LCB0eXBlOiAnSW50MTYnfSxcbiAgICB7bmFtZTogJ2FfZGF0YScsIGNvbXBvbmVudHM6IDQsIHR5cGU6ICdVaW50OCd9XG5dLCA0KTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IHtMaW5lTGF5b3V0QXJyYXl9ID0gcmVxdWlyZSgnLi4vYXJyYXlfdHlwZXMnKTtcbmNvbnN0IGxheW91dEF0dHJpYnV0ZXMgPSByZXF1aXJlKCcuL2xpbmVfYXR0cmlidXRlcycpLm1lbWJlcnM7XG5jb25zdCB7U2VnbWVudFZlY3Rvcn0gPSByZXF1aXJlKCcuLi9zZWdtZW50Jyk7XG5jb25zdCB7UHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXR9ID0gcmVxdWlyZSgnLi4vcHJvZ3JhbV9jb25maWd1cmF0aW9uJyk7XG5jb25zdCB7VHJpYW5nbGVJbmRleEFycmF5fSA9IHJlcXVpcmUoJy4uL2luZGV4X2FycmF5X3R5cGUnKTtcbmNvbnN0IGxvYWRHZW9tZXRyeSA9IHJlcXVpcmUoJy4uL2xvYWRfZ2VvbWV0cnknKTtcbmNvbnN0IEVYVEVOVCA9IHJlcXVpcmUoJy4uL2V4dGVudCcpO1xuY29uc3QgdmVjdG9yVGlsZUZlYXR1cmVUeXBlcyA9IHJlcXVpcmUoJ0BtYXBib3gvdmVjdG9yLXRpbGUnKS5WZWN0b3JUaWxlRmVhdHVyZS50eXBlcztcbmNvbnN0IHtyZWdpc3Rlcn0gPSByZXF1aXJlKCcuLi8uLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXInKTtcblxuICAgICAgICAgICAgIFxuICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4vLyBOT1RFIE9OIEVYVFJVREUgU0NBTEU6XG4vLyBzY2FsZSB0aGUgZXh0cnVzaW9uIHZlY3RvciBzbyB0aGF0IHRoZSBub3JtYWwgbGVuZ3RoIGlzIHRoaXMgdmFsdWUuXG4vLyBjb250YWlucyB0aGUgXCJ0ZXh0dXJlXCIgbm9ybWFscyAoLTEuLjEpLiB0aGlzIGlzIGRpc3RpbmN0IGZyb20gdGhlIGV4dHJ1ZGVcbi8vIG5vcm1hbHMgZm9yIGxpbmUgam9pbnMsIGJlY2F1c2UgdGhlIHgtdmFsdWUgcmVtYWlucyAwIGZvciB0aGUgdGV4dHVyZVxuLy8gbm9ybWFsIGFycmF5LCB3aGlsZSB0aGUgZXh0cnVkZSBub3JtYWwgYWN0dWFsbHkgbW92ZXMgdGhlIHZlcnRleCB0byBjcmVhdGVcbi8vIHRoZSBhY3V0ZS9iZXZlbGxlZCBsaW5lIGpvaW4uXG5jb25zdCBFWFRSVURFX1NDQUxFID0gNjM7XG5cbi8qXG4gKiBTaGFycCBjb3JuZXJzIGNhdXNlIGRhc2hlZCBsaW5lcyB0byB0aWx0IGJlY2F1c2UgdGhlIGRpc3RhbmNlIGFsb25nIHRoZSBsaW5lXG4gKiBpcyB0aGUgc2FtZSBhdCBib3RoIHRoZSBpbm5lciBhbmQgb3V0ZXIgY29ybmVycy4gVG8gaW1wcm92ZSB0aGUgYXBwZWFyYW5jZSBvZlxuICogZGFzaGVkIGxpbmVzIHdlIGFkZCBleHRyYSBwb2ludHMgbmVhciBzaGFycCBjb3JuZXJzIHNvIHRoYXQgYSBzbWFsbGVyIHBhcnRcbiAqIG9mIHRoZSBsaW5lIGlzIHRpbHRlZC5cbiAqXG4gKiBDT1NfSEFMRl9TSEFSUF9DT1JORVIgY29udHJvbHMgaG93IHNoYXJwIGEgY29ybmVyIGhhcyB0byBiZSBmb3IgdXMgdG8gYWRkIGFuXG4gKiBleHRyYSB2ZXJ0ZXguIFRoZSBkZWZhdWx0IGlzIDc1IGRlZ3JlZXMuXG4gKlxuICogVGhlIG5ld2x5IGNyZWF0ZWQgdmVydGljZXMgYXJlIHBsYWNlZCBTSEFSUF9DT1JORVJfT0ZGU0VUIHBpeGVscyBmcm9tIHRoZSBjb3JuZXIuXG4gKi9cbmNvbnN0IENPU19IQUxGX1NIQVJQX0NPUk5FUiA9IE1hdGguY29zKDc1IC8gMiAqIChNYXRoLlBJIC8gMTgwKSk7XG5jb25zdCBTSEFSUF9DT1JORVJfT0ZGU0VUID0gMTU7XG5cbi8vIFRoZSBudW1iZXIgb2YgYml0cyB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIGxpbmUgZGlzdGFuY2UgaW4gdGhlIGJ1ZmZlci5cbmNvbnN0IExJTkVfRElTVEFOQ0VfQlVGRkVSX0JJVFMgPSAxNTtcblxuLy8gV2UgZG9uJ3QgaGF2ZSBlbm91Z2ggYml0cyBmb3IgdGhlIGxpbmUgZGlzdGFuY2UgYXMgd2UnZCBsaWtlIHRvIGhhdmUsIHNvXG4vLyB1c2UgdGhpcyB2YWx1ZSB0byBzY2FsZSB0aGUgbGluZSBkaXN0YW5jZSAoaW4gdGlsZSB1bml0cykgZG93biB0byBhIHNtYWxsZXJcbi8vIHZhbHVlLiBUaGlzIGxldHMgdXMgc3RvcmUgbG9uZ2VyIGRpc3RhbmNlcyB3aGlsZSBzYWNyaWZpY2luZyBwcmVjaXNpb24uXG5jb25zdCBMSU5FX0RJU1RBTkNFX1NDQUxFID0gMSAvIDI7XG5cbi8vIFRoZSBtYXhpbXVtIGxpbmUgZGlzdGFuY2UsIGluIHRpbGUgdW5pdHMsIHRoYXQgZml0cyBpbiB0aGUgYnVmZmVyLlxuY29uc3QgTUFYX0xJTkVfRElTVEFOQ0UgPSBNYXRoLnBvdygyLCBMSU5FX0RJU1RBTkNFX0JVRkZFUl9CSVRTIC0gMSkgLyBMSU5FX0RJU1RBTkNFX1NDQUxFO1xuXG5mdW5jdGlvbiBhZGRMaW5lVmVydGV4KGxheW91dFZlcnRleEJ1ZmZlciwgcG9pbnQgICAgICAgLCBleHRydWRlICAgICAgICwgcm91bmQgICAgICAgICAsIHVwICAgICAgICAgLCBkaXIgICAgICAgICwgbGluZXNvZmFyICAgICAgICApIHtcbiAgICBsYXlvdXRWZXJ0ZXhCdWZmZXIuZW1wbGFjZUJhY2soXG4gICAgICAgIC8vIGFfcG9zX25vcm1hbFxuICAgICAgICBwb2ludC54LFxuICAgICAgICBwb2ludC55LFxuICAgICAgICByb3VuZCA/IDEgOiAwLFxuICAgICAgICB1cCA/IDEgOiAtMSxcbiAgICAgICAgLy8gYV9kYXRhXG4gICAgICAgIC8vIGFkZCAxMjggdG8gc3RvcmUgYSBieXRlIGluIGFuIHVuc2lnbmVkIGJ5dGVcbiAgICAgICAgTWF0aC5yb3VuZChFWFRSVURFX1NDQUxFICogZXh0cnVkZS54KSArIDEyOCxcbiAgICAgICAgTWF0aC5yb3VuZChFWFRSVURFX1NDQUxFICogZXh0cnVkZS55KSArIDEyOCxcbiAgICAgICAgLy8gRW5jb2RlIHRoZSAtMS8wLzEgZGlyZWN0aW9uIHZhbHVlIGludG8gdGhlIGZpcnN0IHR3byBiaXRzIG9mIC56IG9mIGFfZGF0YS5cbiAgICAgICAgLy8gQ29tYmluZSBpdCB3aXRoIHRoZSBsb3dlciA2IGJpdHMgb2YgYGxpbmVzb2ZhcmAgKHNoaWZ0ZWQgYnkgMiBiaXRlcyB0byBtYWtlXG4gICAgICAgIC8vIHJvb20gZm9yIHRoZSBkaXJlY3Rpb24gdmFsdWUpLiBUaGUgdXBwZXIgOCBiaXRzIG9mIGBsaW5lc29mYXJgIGFyZSBwbGFjZWQgaW5cbiAgICAgICAgLy8gdGhlIGB3YCBjb21wb25lbnQuIGBsaW5lc29mYXJgIGlzIHNjYWxlZCBkb3duIGJ5IGBMSU5FX0RJU1RBTkNFX1NDQUxFYCBzbyB0aGF0XG4gICAgICAgIC8vIHdlIGNhbiBzdG9yZSBsb25nZXIgZGlzdGFuY2VzIHdoaWxlIHNhY3JpZmljaW5nIHByZWNpc2lvbi5cbiAgICAgICAgKChkaXIgPT09IDAgPyAwIDogKGRpciA8IDAgPyAtMSA6IDEpKSArIDEpIHwgKCgobGluZXNvZmFyICogTElORV9ESVNUQU5DRV9TQ0FMRSkgJiAweDNGKSA8PCAyKSxcbiAgICAgICAgKGxpbmVzb2ZhciAqIExJTkVfRElTVEFOQ0VfU0NBTEUpID4+IDYpO1xufVxuXG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgTGluZUJ1Y2tldCAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy56b29tID0gb3B0aW9ucy56b29tO1xuICAgICAgICB0aGlzLm92ZXJzY2FsaW5nID0gb3B0aW9ucy5vdmVyc2NhbGluZztcbiAgICAgICAgdGhpcy5sYXllcnMgPSBvcHRpb25zLmxheWVycztcbiAgICAgICAgdGhpcy5sYXllcklkcyA9IHRoaXMubGF5ZXJzLm1hcChsYXllciA9PiBsYXllci5pZCk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBvcHRpb25zLmluZGV4O1xuXG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgTGluZUxheW91dEFycmF5KCk7XG4gICAgICAgIHRoaXMuaW5kZXhBcnJheSA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMgPSBuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQobGF5b3V0QXR0cmlidXRlcywgb3B0aW9ucy5sYXllcnMsIG9wdGlvbnMuem9vbSk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSBuZXcgU2VnbWVudFZlY3RvcigpO1xuICAgIH1cblxuICAgIHBvcHVsYXRlKGZlYXR1cmVzICAgICAgICAgICAgICAgICAgICAgICAsIG9wdGlvbnMgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBmb3IgKGNvbnN0IHtmZWF0dXJlLCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0gb2YgZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxheWVyc1swXS5fZmVhdHVyZUZpbHRlcih7em9vbTogdGhpcy56b29tfSwgZmVhdHVyZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBnZW9tZXRyeSA9IGxvYWRHZW9tZXRyeShmZWF0dXJlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZlYXR1cmUoZmVhdHVyZSwgZ2VvbWV0cnkpO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuZmVhdHVyZUluZGV4Lmluc2VydChmZWF0dXJlLCBnZW9tZXRyeSwgaW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIHRoaXMuaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0ICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgbGF5b3V0QXR0cmlidXRlcyk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuaW5kZXhBcnJheSk7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwbG9hZChjb250ZXh0KTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoIXRoaXMubGF5b3V0VmVydGV4QnVmZmVyKSByZXR1cm47XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cy5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgYWRkRmVhdHVyZShmZWF0dXJlICAgICAgICAgICAgICAgICAgICwgZ2VvbWV0cnkgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5sYXllcnNbMF0ubGF5b3V0O1xuICAgICAgICBjb25zdCBqb2luID0gbGF5b3V0LmdldCgnbGluZS1qb2luJykuZXZhbHVhdGUoZmVhdHVyZSk7XG4gICAgICAgIGNvbnN0IGNhcCA9IGxheW91dC5nZXQoJ2xpbmUtY2FwJyk7XG4gICAgICAgIGNvbnN0IG1pdGVyTGltaXQgPSBsYXlvdXQuZ2V0KCdsaW5lLW1pdGVyLWxpbWl0Jyk7XG4gICAgICAgIGNvbnN0IHJvdW5kTGltaXQgPSBsYXlvdXQuZ2V0KCdsaW5lLXJvdW5kLWxpbWl0Jyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGdlb21ldHJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFkZExpbmUobGluZSwgZmVhdHVyZSwgam9pbiwgY2FwLCBtaXRlckxpbWl0LCByb3VuZExpbWl0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZExpbmUodmVydGljZXMgICAgICAgICAgICAgICwgZmVhdHVyZSAgICAgICAgICAgICAgICAgICAsIGpvaW4gICAgICAgICwgY2FwICAgICAgICAsIG1pdGVyTGltaXQgICAgICAgICwgcm91bmRMaW1pdCAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGlzUG9seWdvbiA9IHZlY3RvclRpbGVGZWF0dXJlVHlwZXNbZmVhdHVyZS50eXBlXSA9PT0gJ1BvbHlnb24nO1xuXG4gICAgICAgIC8vIElmIHRoZSBsaW5lIGhhcyBkdXBsaWNhdGUgdmVydGljZXMgYXQgdGhlIGVuZHMsIGFkanVzdCBzdGFydC9sZW5ndGggdG8gcmVtb3ZlIHRoZW0uXG4gICAgICAgIGxldCBsZW4gPSB2ZXJ0aWNlcy5sZW5ndGg7XG4gICAgICAgIHdoaWxlIChsZW4gPj0gMiAmJiB2ZXJ0aWNlc1tsZW4gLSAxXS5lcXVhbHModmVydGljZXNbbGVuIC0gMl0pKSB7XG4gICAgICAgICAgICBsZW4tLTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmlyc3QgPSAwO1xuICAgICAgICB3aGlsZSAoZmlyc3QgPCBsZW4gLSAxICYmIHZlcnRpY2VzW2ZpcnN0XS5lcXVhbHModmVydGljZXNbZmlyc3QgKyAxXSkpIHtcbiAgICAgICAgICAgIGZpcnN0Kys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZ25vcmUgaW52YWxpZCBnZW9tZXRyeS5cbiAgICAgICAgaWYgKGxlbiA8IChpc1BvbHlnb24gPyAzIDogMikpIHJldHVybjtcblxuICAgICAgICBpZiAoam9pbiA9PT0gJ2JldmVsJykgbWl0ZXJMaW1pdCA9IDEuMDU7XG5cbiAgICAgICAgY29uc3Qgc2hhcnBDb3JuZXJPZmZzZXQgPSBTSEFSUF9DT1JORVJfT0ZGU0VUICogKEVYVEVOVCAvICg1MTIgKiB0aGlzLm92ZXJzY2FsaW5nKSk7XG5cbiAgICAgICAgY29uc3QgZmlyc3RWZXJ0ZXggPSB2ZXJ0aWNlc1tmaXJzdF07XG5cbiAgICAgICAgLy8gd2UgY291bGQgYmUgbW9yZSBwcmVjaXNlLCBidXQgaXQgd291bGQgb25seSBzYXZlIGEgbmVnbGlnaWJsZSBhbW91bnQgb2Ygc3BhY2VcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9IHRoaXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQobGVuICogMTAsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheSk7XG5cbiAgICAgICAgdGhpcy5kaXN0YW5jZSA9IDA7XG5cbiAgICAgICAgY29uc3QgYmVnaW5DYXAgPSBjYXAsXG4gICAgICAgICAgICBlbmRDYXAgPSBpc1BvbHlnb24gPyAnYnV0dCcgOiBjYXA7XG4gICAgICAgIGxldCBzdGFydE9mTGluZSA9IHRydWU7XG4gICAgICAgIGxldCBjdXJyZW50VmVydGV4O1xuICAgICAgICBsZXQgcHJldlZlcnRleCA9ICgodW5kZWZpbmVkICAgICApICAgICAgICk7XG4gICAgICAgIGxldCBuZXh0VmVydGV4ID0gKCh1bmRlZmluZWQgICAgICkgICAgICAgKTtcbiAgICAgICAgbGV0IHByZXZOb3JtYWwgPSAoKHVuZGVmaW5lZCAgICAgKSAgICAgICApO1xuICAgICAgICBsZXQgbmV4dE5vcm1hbCA9ICgodW5kZWZpbmVkICAgICApICAgICAgICk7XG4gICAgICAgIGxldCBvZmZzZXRBO1xuICAgICAgICBsZXQgb2Zmc2V0QjtcblxuICAgICAgICAvLyB0aGUgbGFzdCB0aHJlZSB2ZXJ0aWNlcyBhZGRlZFxuICAgICAgICB0aGlzLmUxID0gdGhpcy5lMiA9IHRoaXMuZTMgPSAtMTtcblxuICAgICAgICBpZiAoaXNQb2x5Z29uKSB7XG4gICAgICAgICAgICBjdXJyZW50VmVydGV4ID0gdmVydGljZXNbbGVuIC0gMl07XG4gICAgICAgICAgICBuZXh0Tm9ybWFsID0gZmlyc3RWZXJ0ZXguc3ViKGN1cnJlbnRWZXJ0ZXgpLl91bml0KCkuX3BlcnAoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7XG5cbiAgICAgICAgICAgIG5leHRWZXJ0ZXggPSBpc1BvbHlnb24gJiYgaSA9PT0gbGVuIC0gMSA/XG4gICAgICAgICAgICAgICAgdmVydGljZXNbZmlyc3QgKyAxXSA6IC8vIGlmIHRoZSBsaW5lIGlzIGNsb3NlZCwgd2UgdHJlYXQgdGhlIGxhc3QgdmVydGV4IGxpa2UgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgdmVydGljZXNbaSArIDFdOyAvLyBqdXN0IHRoZSBuZXh0IHZlcnRleFxuXG4gICAgICAgICAgICAvLyBpZiB0d28gY29uc2VjdXRpdmUgdmVydGljZXMgZXhpc3QsIHNraXAgdGhlIGN1cnJlbnQgb25lXG4gICAgICAgICAgICBpZiAobmV4dFZlcnRleCAmJiB2ZXJ0aWNlc1tpXS5lcXVhbHMobmV4dFZlcnRleCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBpZiAobmV4dE5vcm1hbCkgcHJldk5vcm1hbCA9IG5leHROb3JtYWw7XG4gICAgICAgICAgICBpZiAoY3VycmVudFZlcnRleCkgcHJldlZlcnRleCA9IGN1cnJlbnRWZXJ0ZXg7XG5cbiAgICAgICAgICAgIGN1cnJlbnRWZXJ0ZXggPSB2ZXJ0aWNlc1tpXTtcblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBub3JtYWwgdG93YXJkcyB0aGUgbmV4dCB2ZXJ0ZXggaW4gdGhpcyBsaW5lLiBJbiBjYXNlXG4gICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBuZXh0IHZlcnRleCwgcHJldGVuZCB0aGF0IHRoZSBsaW5lIGlzIGNvbnRpbnVpbmcgc3RyYWlnaHQsXG4gICAgICAgICAgICAvLyBtZWFuaW5nIHRoYXQgd2UgYXJlIGp1c3QgdXNpbmcgdGhlIHByZXZpb3VzIG5vcm1hbC5cbiAgICAgICAgICAgIG5leHROb3JtYWwgPSBuZXh0VmVydGV4ID8gbmV4dFZlcnRleC5zdWIoY3VycmVudFZlcnRleCkuX3VuaXQoKS5fcGVycCgpIDogcHJldk5vcm1hbDtcblxuICAgICAgICAgICAgLy8gSWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhIHByZXZpb3VzIG5vcm1hbCwgdGhpcyBpcyB0aGUgYmVnaW5uaW5nIG9mIGFcbiAgICAgICAgICAgIC8vIG5vbi1jbG9zZWQgbGluZSwgc28gd2UncmUgZG9pbmcgYSBzdHJhaWdodCBcImpvaW5cIi5cbiAgICAgICAgICAgIHByZXZOb3JtYWwgPSBwcmV2Tm9ybWFsIHx8IG5leHROb3JtYWw7XG5cbiAgICAgICAgICAgIC8vIERldGVybWluZSB0aGUgbm9ybWFsIG9mIHRoZSBqb2luIGV4dHJ1c2lvbi4gSXQgaXMgdGhlIGFuZ2xlIGJpc2VjdG9yXG4gICAgICAgICAgICAvLyBvZiB0aGUgc2VnbWVudHMgYmV0d2VlbiB0aGUgcHJldmlvdXMgbGluZSBhbmQgdGhlIG5leHQgbGluZS5cbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIG9mIDE4MMKwIGFuZ2xlcywgdGhlIHByZXYgYW5kIG5leHQgbm9ybWFscyBjYW5jZWwgZWFjaCBvdGhlciBvdXQ6XG4gICAgICAgICAgICAvLyBwcmV2Tm9ybWFsICsgbmV4dE5vcm1hbCA9ICgwLCAwKSwgaXRzIG1hZ25pdHVkZSBpcyAwLCBzbyB0aGUgdW5pdCB2ZWN0b3Igd291bGQgYmVcbiAgICAgICAgICAgIC8vIHVuZGVmaW5lZC4gSW4gdGhhdCBjYXNlLCB3ZSdyZSBrZWVwaW5nIHRoZSBqb2luTm9ybWFsIGF0ICgwLCAwKSwgc28gdGhhdCB0aGUgY29zSGFsZkFuZ2xlXG4gICAgICAgICAgICAvLyBiZWxvdyB3aWxsIGFsc28gYmVjb21lIDAgYW5kIG1pdGVyTGVuZ3RoIHdpbGwgYmVjb21lIEluZmluaXR5LlxuICAgICAgICAgICAgbGV0IGpvaW5Ob3JtYWwgPSBwcmV2Tm9ybWFsLmFkZChuZXh0Tm9ybWFsKTtcbiAgICAgICAgICAgIGlmIChqb2luTm9ybWFsLnggIT09IDAgfHwgam9pbk5vcm1hbC55ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgam9pbk5vcm1hbC5fdW5pdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogIGpvaW5Ob3JtYWwgICAgIHByZXZOb3JtYWxcbiAgICAgICAgICAgICAqICAgICAgICAgICAgIOKGliAgICAgIOKGkVxuICAgICAgICAgICAgICogICAgICAgICAgICAgICAgLl9fX19fX19fLiBwcmV2VmVydGV4XG4gICAgICAgICAgICAgKiAgICAgICAgICAgICAgICB8XG4gICAgICAgICAgICAgKiBuZXh0Tm9ybWFsICDihpAgIHwgIGN1cnJlbnRWZXJ0ZXhcbiAgICAgICAgICAgICAqICAgICAgICAgICAgICAgIHxcbiAgICAgICAgICAgICAqICAgICBuZXh0VmVydGV4ICFcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1pdGVyICh0aGUgcmF0aW8gb2YgdGhlIG1pdGVyIHRvIHRoZSB3aWR0aCkuXG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBjb3NpbmUgb2YgdGhlIGFuZ2xlIGJldHdlZW4gdGhlIG5leHQgYW5kIGpvaW4gbm9ybWFsc1xuICAgICAgICAgICAgLy8gdXNpbmcgZG90IHByb2R1Y3QuIFRoZSBpbnZlcnNlIG9mIHRoYXQgaXMgdGhlIG1pdGVyIGxlbmd0aC5cbiAgICAgICAgICAgIGNvbnN0IGNvc0hhbGZBbmdsZSA9IGpvaW5Ob3JtYWwueCAqIG5leHROb3JtYWwueCArIGpvaW5Ob3JtYWwueSAqIG5leHROb3JtYWwueTtcbiAgICAgICAgICAgIGNvbnN0IG1pdGVyTGVuZ3RoID0gY29zSGFsZkFuZ2xlICE9PSAwID8gMSAvIGNvc0hhbGZBbmdsZSA6IEluZmluaXR5O1xuXG4gICAgICAgICAgICBjb25zdCBpc1NoYXJwQ29ybmVyID0gY29zSGFsZkFuZ2xlIDwgQ09TX0hBTEZfU0hBUlBfQ09STkVSICYmIHByZXZWZXJ0ZXggJiYgbmV4dFZlcnRleDtcblxuICAgICAgICAgICAgaWYgKGlzU2hhcnBDb3JuZXIgJiYgaSA+IGZpcnN0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldlNlZ21lbnRMZW5ndGggPSBjdXJyZW50VmVydGV4LmRpc3QocHJldlZlcnRleCk7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZTZWdtZW50TGVuZ3RoID4gMiAqIHNoYXJwQ29ybmVyT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ByZXZWZXJ0ZXggPSBjdXJyZW50VmVydGV4LnN1YihjdXJyZW50VmVydGV4LnN1YihwcmV2VmVydGV4KS5fbXVsdChzaGFycENvcm5lck9mZnNldCAvIHByZXZTZWdtZW50TGVuZ3RoKS5fcm91bmQoKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzdGFuY2UgKz0gbmV3UHJldlZlcnRleC5kaXN0KHByZXZWZXJ0ZXgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgobmV3UHJldlZlcnRleCwgdGhpcy5kaXN0YW5jZSwgcHJldk5vcm1hbC5tdWx0KDEpLCAwLCAwLCBmYWxzZSwgc2VnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHByZXZWZXJ0ZXggPSBuZXdQcmV2VmVydGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVGhlIGpvaW4gaWYgYSBtaWRkbGUgdmVydGV4LCBvdGhlcndpc2UgdGhlIGNhcC5cbiAgICAgICAgICAgIGNvbnN0IG1pZGRsZVZlcnRleCA9IHByZXZWZXJ0ZXggJiYgbmV4dFZlcnRleDtcbiAgICAgICAgICAgIGxldCBjdXJyZW50Sm9pbiA9IG1pZGRsZVZlcnRleCA/IGpvaW4gOiBuZXh0VmVydGV4ID8gYmVnaW5DYXAgOiBlbmRDYXA7XG5cbiAgICAgICAgICAgIGlmIChtaWRkbGVWZXJ0ZXggJiYgY3VycmVudEpvaW4gPT09ICdyb3VuZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAobWl0ZXJMZW5ndGggPCByb3VuZExpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRKb2luID0gJ21pdGVyJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1pdGVyTGVuZ3RoIDw9IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEpvaW4gPSAnZmFrZXJvdW5kJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Sm9pbiA9PT0gJ21pdGVyJyAmJiBtaXRlckxlbmd0aCA+IG1pdGVyTGltaXQpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50Sm9pbiA9ICdiZXZlbCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Sm9pbiA9PT0gJ2JldmVsJykge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBtYXhpbXVtIGV4dHJ1ZGUgbGVuZ3RoIGlzIDEyOCAvIDYzID0gMiB0aW1lcyB0aGUgd2lkdGggb2YgdGhlIGxpbmVcbiAgICAgICAgICAgICAgICAvLyBzbyBpZiBtaXRlckxlbmd0aCA+PSAyIHdlIG5lZWQgdG8gZHJhdyBhIGRpZmZlcmVudCB0eXBlIG9mIGJldmVsIGhlcmUuXG4gICAgICAgICAgICAgICAgaWYgKG1pdGVyTGVuZ3RoID4gMikgY3VycmVudEpvaW4gPSAnZmxpcGJldmVsJztcblxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBtaXRlckxlbmd0aCBpcyByZWFsbHkgc21hbGwgYW5kIHRoZSBsaW5lIGJldmVsIHdvdWxkbid0IGJlIHZpc2libGUsXG4gICAgICAgICAgICAgICAgLy8ganVzdCBkcmF3IGEgbWl0ZXIgam9pbiB0byBzYXZlIGEgdHJpYW5nbGUuXG4gICAgICAgICAgICAgICAgaWYgKG1pdGVyTGVuZ3RoIDwgbWl0ZXJMaW1pdCkgY3VycmVudEpvaW4gPSAnbWl0ZXInO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgaG93IGZhciBhbG9uZyB0aGUgbGluZSB0aGUgY3VycmVudFZlcnRleCBpc1xuICAgICAgICAgICAgaWYgKHByZXZWZXJ0ZXgpIHRoaXMuZGlzdGFuY2UgKz0gY3VycmVudFZlcnRleC5kaXN0KHByZXZWZXJ0ZXgpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEpvaW4gPT09ICdtaXRlcicpIHtcblxuICAgICAgICAgICAgICAgIGpvaW5Ob3JtYWwuX211bHQobWl0ZXJMZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCB0aGlzLmRpc3RhbmNlLCBqb2luTm9ybWFsLCAwLCAwLCBmYWxzZSwgc2VnbWVudCk7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEpvaW4gPT09ICdmbGlwYmV2ZWwnKSB7XG4gICAgICAgICAgICAgICAgLy8gbWl0ZXIgaXMgdG9vIGJpZywgZmxpcCB0aGUgZGlyZWN0aW9uIHRvIG1ha2UgYSBiZXZlbGVkIGpvaW5cblxuICAgICAgICAgICAgICAgIGlmIChtaXRlckxlbmd0aCA+IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBbG1vc3QgcGFyYWxsZWwgbGluZXNcbiAgICAgICAgICAgICAgICAgICAgam9pbk5vcm1hbCA9IG5leHROb3JtYWwuY2xvbmUoKS5tdWx0KC0xKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHByZXZOb3JtYWwueCAqIG5leHROb3JtYWwueSAtIHByZXZOb3JtYWwueSAqIG5leHROb3JtYWwueCA+IDAgPyAtMSA6IDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJldmVsTGVuZ3RoID0gbWl0ZXJMZW5ndGggKiBwcmV2Tm9ybWFsLmFkZChuZXh0Tm9ybWFsKS5tYWcoKSAvIHByZXZOb3JtYWwuc3ViKG5leHROb3JtYWwpLm1hZygpO1xuICAgICAgICAgICAgICAgICAgICBqb2luTm9ybWFsLl9wZXJwKCkuX211bHQoYmV2ZWxMZW5ndGggKiBkaXJlY3Rpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgdGhpcy5kaXN0YW5jZSwgam9pbk5vcm1hbCwgMCwgMCwgZmFsc2UsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCB0aGlzLmRpc3RhbmNlLCBqb2luTm9ybWFsLm11bHQoLTEpLCAwLCAwLCBmYWxzZSwgc2VnbWVudCk7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEpvaW4gPT09ICdiZXZlbCcgfHwgY3VycmVudEpvaW4gPT09ICdmYWtlcm91bmQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGluZVR1cm5zTGVmdCA9IChwcmV2Tm9ybWFsLnggKiBuZXh0Tm9ybWFsLnkgLSBwcmV2Tm9ybWFsLnkgKiBuZXh0Tm9ybWFsLngpID4gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSAtTWF0aC5zcXJ0KG1pdGVyTGVuZ3RoICogbWl0ZXJMZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICBpZiAobGluZVR1cm5zTGVmdCkge1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXRCID0gMDtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0QSA9IG9mZnNldDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXRBID0gMDtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0QiA9IG9mZnNldDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDbG9zZSBwcmV2aW91cyBzZWdtZW50IHdpdGggYSBiZXZlbFxuICAgICAgICAgICAgICAgIGlmICghc3RhcnRPZkxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIHRoaXMuZGlzdGFuY2UsIHByZXZOb3JtYWwsIG9mZnNldEEsIG9mZnNldEIsIGZhbHNlLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEpvaW4gPT09ICdmYWtlcm91bmQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBqb2luIGFuZ2xlIGlzIHNoYXJwIGVub3VnaCB0aGF0IGEgcm91bmQgam9pbiB3b3VsZCBiZSB2aXNpYmxlLlxuICAgICAgICAgICAgICAgICAgICAvLyBCZXZlbCBqb2lucyBmaWxsIHRoZSBnYXAgYmV0d2VlbiBzZWdtZW50cyB3aXRoIGEgc2luZ2xlIHBpZSBzbGljZSB0cmlhbmdsZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcm91bmQgam9pbiBieSBhZGRpbmcgbXVsdGlwbGUgcGllIHNsaWNlcy4gVGhlIGpvaW4gaXNuJ3QgYWN0dWFsbHkgcm91bmQsIGJ1dFxuICAgICAgICAgICAgICAgICAgICAvLyBpdCBsb29rcyBsaWtlIGl0IGlzIGF0IHRoZSBzaXplcyB3ZSByZW5kZXIgbGluZXMgYXQuXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIG1vcmUgdHJpYW5nbGVzIGZvciBzaGFycGVyIGFuZ2xlcy5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtYXRoIGlzIGp1c3QgYSBnb29kIGVub3VnaCBhcHByb3hpbWF0aW9uLiBJdCBpc24ndCBcImNvcnJlY3RcIi5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IE1hdGguZmxvb3IoKDAuNSAtIChjb3NIYWxmQW5nbGUgLSAwLjUpKSAqIDgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXBwcm94RnJhY3Rpb25hbEpvaW5Ob3JtYWw7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCBuOyBtKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcHJveEZyYWN0aW9uYWxKb2luTm9ybWFsID0gbmV4dE5vcm1hbC5tdWx0KChtICsgMSkgLyAobiArIDEpKS5fYWRkKHByZXZOb3JtYWwpLl91bml0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFBpZVNsaWNlVmVydGV4KGN1cnJlbnRWZXJ0ZXgsIHRoaXMuZGlzdGFuY2UsIGFwcHJveEZyYWN0aW9uYWxKb2luTm9ybWFsLCBsaW5lVHVybnNMZWZ0LCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkUGllU2xpY2VWZXJ0ZXgoY3VycmVudFZlcnRleCwgdGhpcy5kaXN0YW5jZSwgam9pbk5vcm1hbCwgbGluZVR1cm5zTGVmdCwgc2VnbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IG4gLSAxOyBrID49IDA7IGstLSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwcm94RnJhY3Rpb25hbEpvaW5Ob3JtYWwgPSBwcmV2Tm9ybWFsLm11bHQoKGsgKyAxKSAvIChuICsgMSkpLl9hZGQobmV4dE5vcm1hbCkuX3VuaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkUGllU2xpY2VWZXJ0ZXgoY3VycmVudFZlcnRleCwgdGhpcy5kaXN0YW5jZSwgYXBwcm94RnJhY3Rpb25hbEpvaW5Ob3JtYWwsIGxpbmVUdXJuc0xlZnQsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgbmV4dCBzZWdtZW50XG4gICAgICAgICAgICAgICAgaWYgKG5leHRWZXJ0ZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIHRoaXMuZGlzdGFuY2UsIG5leHROb3JtYWwsIC1vZmZzZXRBLCAtb2Zmc2V0QiwgZmFsc2UsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Sm9pbiA9PT0gJ2J1dHQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzdGFydE9mTGluZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBwcmV2aW91cyBzZWdtZW50IHdpdGggYSBidXR0XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCB0aGlzLmRpc3RhbmNlLCBwcmV2Tm9ybWFsLCAwLCAwLCBmYWxzZSwgc2VnbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgbmV4dCBzZWdtZW50IHdpdGggYSBidXR0XG4gICAgICAgICAgICAgICAgaWYgKG5leHRWZXJ0ZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIHRoaXMuZGlzdGFuY2UsIG5leHROb3JtYWwsIDAsIDAsIGZhbHNlLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEpvaW4gPT09ICdzcXVhcmUnKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0T2ZMaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIHByZXZpb3VzIHNlZ21lbnQgd2l0aCBhIHNxdWFyZSBjYXBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIHRoaXMuZGlzdGFuY2UsIHByZXZOb3JtYWwsIDEsIDEsIGZhbHNlLCBzZWdtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc2VnbWVudCBpcyBkb25lLiBVbnNldCB2ZXJ0aWNlcyB0byBkaXNjb25uZWN0IHNlZ21lbnRzLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmUxID0gdGhpcy5lMiA9IC0xO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG5leHQgc2VnbWVudFxuICAgICAgICAgICAgICAgIGlmIChuZXh0VmVydGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCB0aGlzLmRpc3RhbmNlLCBuZXh0Tm9ybWFsLCAtMSwgLTEsIGZhbHNlLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEpvaW4gPT09ICdyb3VuZCcpIHtcblxuICAgICAgICAgICAgICAgIGlmICghc3RhcnRPZkxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgcHJldmlvdXMgc2VnbWVudCB3aXRoIGJ1dHRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIHRoaXMuZGlzdGFuY2UsIHByZXZOb3JtYWwsIDAsIDAsIGZhbHNlLCBzZWdtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBBZGQgcm91bmQgY2FwIG9yIGxpbmVqb2luIGF0IGVuZCBvZiBzZWdtZW50XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCB0aGlzLmRpc3RhbmNlLCBwcmV2Tm9ybWFsLCAxLCAxLCB0cnVlLCBzZWdtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc2VnbWVudCBpcyBkb25lLiBVbnNldCB2ZXJ0aWNlcyB0byBkaXNjb25uZWN0IHNlZ21lbnRzLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmUxID0gdGhpcy5lMiA9IC0xO1xuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgbmV4dCBzZWdtZW50IHdpdGggYSBidXR0XG4gICAgICAgICAgICAgICAgaWYgKG5leHRWZXJ0ZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHJvdW5kIGNhcCBiZWZvcmUgZmlyc3Qgc2VnbWVudFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgdGhpcy5kaXN0YW5jZSwgbmV4dE5vcm1hbCwgLTEsIC0xLCB0cnVlLCBzZWdtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgdGhpcy5kaXN0YW5jZSwgbmV4dE5vcm1hbCwgMCwgMCwgZmFsc2UsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzU2hhcnBDb3JuZXIgJiYgaSA8IGxlbiAtIDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0U2VnbWVudExlbmd0aCA9IGN1cnJlbnRWZXJ0ZXguZGlzdChuZXh0VmVydGV4KTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dFNlZ21lbnRMZW5ndGggPiAyICogc2hhcnBDb3JuZXJPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q3VycmVudFZlcnRleCA9IGN1cnJlbnRWZXJ0ZXguYWRkKG5leHRWZXJ0ZXguc3ViKGN1cnJlbnRWZXJ0ZXgpLl9tdWx0KHNoYXJwQ29ybmVyT2Zmc2V0IC8gbmV4dFNlZ21lbnRMZW5ndGgpLl9yb3VuZCgpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXN0YW5jZSArPSBuZXdDdXJyZW50VmVydGV4LmRpc3QoY3VycmVudFZlcnRleCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChuZXdDdXJyZW50VmVydGV4LCB0aGlzLmRpc3RhbmNlLCBuZXh0Tm9ybWFsLm11bHQoMSksIDAsIDAsIGZhbHNlLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFZlcnRleCA9IG5ld0N1cnJlbnRWZXJ0ZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGFydE9mTGluZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMucG9wdWxhdGVQYWludEFycmF5cyh0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCwgZmVhdHVyZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIHR3byB2ZXJ0aWNlcyB0byB0aGUgYnVmZmVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjdXJyZW50VmVydGV4IHRoZSBsaW5lIHZlcnRleCB0byBhZGQgYnVmZmVyIHZlcnRpY2VzIGZvclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXN0YW5jZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIHRvIHRoZSB2ZXJ0ZXhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kTGVmdCBleHRydWRlIHRvIHNoaWZ0IHRoZSBsZWZ0IHZlcnRleCBhbG9uZyB0aGUgbGluZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmRSaWdodCBleHRydWRlIHRvIHNoaWZ0IHRoZSBsZWZ0IHZlcnRleCBhbG9uZyB0aGUgbGluZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcm91bmQgd2hldGhlciB0aGlzIGlzIGEgcm91bmQgY2FwXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXggICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgIG5vcm1hbCAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICBlbmRMZWZ0ICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICBlbmRSaWdodCAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgcm91bmQgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICBzZWdtZW50ICAgICAgICAgKSB7XG4gICAgICAgIGxldCBleHRydWRlO1xuICAgICAgICBjb25zdCBsYXlvdXRWZXJ0ZXhBcnJheSA9IHRoaXMubGF5b3V0VmVydGV4QXJyYXk7XG4gICAgICAgIGNvbnN0IGluZGV4QXJyYXkgPSB0aGlzLmluZGV4QXJyYXk7XG5cbiAgICAgICAgZXh0cnVkZSA9IG5vcm1hbC5jbG9uZSgpO1xuICAgICAgICBpZiAoZW5kTGVmdCkgZXh0cnVkZS5fc3ViKG5vcm1hbC5wZXJwKCkuX211bHQoZW5kTGVmdCkpO1xuICAgICAgICBhZGRMaW5lVmVydGV4KGxheW91dFZlcnRleEFycmF5LCBjdXJyZW50VmVydGV4LCBleHRydWRlLCByb3VuZCwgZmFsc2UsIGVuZExlZnQsIGRpc3RhbmNlKTtcbiAgICAgICAgdGhpcy5lMyA9IHNlZ21lbnQudmVydGV4TGVuZ3RoKys7XG4gICAgICAgIGlmICh0aGlzLmUxID49IDAgJiYgdGhpcy5lMiA+PSAwKSB7XG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKHRoaXMuZTEsIHRoaXMuZTIsIHRoaXMuZTMpO1xuICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGgrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmUxID0gdGhpcy5lMjtcbiAgICAgICAgdGhpcy5lMiA9IHRoaXMuZTM7XG5cbiAgICAgICAgZXh0cnVkZSA9IG5vcm1hbC5tdWx0KC0xKTtcbiAgICAgICAgaWYgKGVuZFJpZ2h0KSBleHRydWRlLl9zdWIobm9ybWFsLnBlcnAoKS5fbXVsdChlbmRSaWdodCkpO1xuICAgICAgICBhZGRMaW5lVmVydGV4KGxheW91dFZlcnRleEFycmF5LCBjdXJyZW50VmVydGV4LCBleHRydWRlLCByb3VuZCwgdHJ1ZSwgLWVuZFJpZ2h0LCBkaXN0YW5jZSk7XG4gICAgICAgIHRoaXMuZTMgPSBzZWdtZW50LnZlcnRleExlbmd0aCsrO1xuICAgICAgICBpZiAodGhpcy5lMSA+PSAwICYmIHRoaXMuZTIgPj0gMCkge1xuICAgICAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayh0aGlzLmUxLCB0aGlzLmUyLCB0aGlzLmUzKTtcbiAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoKys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lMSA9IHRoaXMuZTI7XG4gICAgICAgIHRoaXMuZTIgPSB0aGlzLmUzO1xuXG4gICAgICAgIC8vIFRoZXJlIGlzIGEgbWF4aW11bSBcImRpc3RhbmNlIGFsb25nIHRoZSBsaW5lXCIgdGhhdCB3ZSBjYW4gc3RvcmUgaW4gdGhlIGJ1ZmZlcnMuXG4gICAgICAgIC8vIFdoZW4gd2UgZ2V0IGNsb3NlIHRvIHRoZSBkaXN0YW5jZSwgcmVzZXQgaXQgdG8gemVybyBhbmQgYWRkIHRoZSB2ZXJ0ZXggYWdhaW4gd2l0aFxuICAgICAgICAvLyBhIGRpc3RhbmNlIG9mIHplcm8uIFRoZSBtYXggZGlzdGFuY2UgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbnVtYmVyIG9mIGJpdHMgd2UgYWxsb2NhdGVcbiAgICAgICAgLy8gdG8gYGxpbmVzb2ZhcmAuXG4gICAgICAgIGlmIChkaXN0YW5jZSA+IE1BWF9MSU5FX0RJU1RBTkNFIC8gMikge1xuICAgICAgICAgICAgdGhpcy5kaXN0YW5jZSA9IDA7XG4gICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgdGhpcy5kaXN0YW5jZSwgbm9ybWFsLCBlbmRMZWZ0LCBlbmRSaWdodCwgcm91bmQsIHNlZ21lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgc2luZ2xlIG5ldyB2ZXJ0ZXggYW5kIGEgdHJpYW5nbGUgdXNpbmcgdHdvIHByZXZpb3VzIHZlcnRpY2VzLlxuICAgICAqIFRoaXMgYWRkcyBhIHBpZSBzbGljZSB0cmlhbmdsZSBuZWFyIGEgam9pbiB0byBzaW11bGF0ZSByb3VuZCBqb2luc1xuICAgICAqXG4gICAgICogQHBhcmFtIGN1cnJlbnRWZXJ0ZXggdGhlIGxpbmUgdmVydGV4IHRvIGFkZCBidWZmZXIgdmVydGljZXMgZm9yXG4gICAgICogQHBhcmFtIGRpc3RhbmNlIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBiZWdnaW5pbmcgb2YgdGhlIGxpbmUgdG8gdGhlIHZlcnRleFxuICAgICAqIEBwYXJhbSBleHRydWRlIHRoZSBvZmZzZXQgb2YgdGhlIG5ldyB2ZXJ0ZXggZnJvbSB0aGUgY3VycmVudFZlcnRleFxuICAgICAqIEBwYXJhbSBsaW5lVHVybnNMZWZ0IHdoZXRoZXIgdGhlIGxpbmUgaXMgdHVybmluZyBsZWZ0IG9yIHJpZ2h0IGF0IHRoaXMgYW5nbGVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGFkZFBpZVNsaWNlVmVydGV4KGN1cnJlbnRWZXJ0ZXggICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgZXh0cnVkZSAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgbGluZVR1cm5zTGVmdCAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50ICAgICAgICAgKSB7XG4gICAgICAgIGV4dHJ1ZGUgPSBleHRydWRlLm11bHQobGluZVR1cm5zTGVmdCA/IC0xIDogMSk7XG4gICAgICAgIGNvbnN0IGxheW91dFZlcnRleEFycmF5ID0gdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheTtcbiAgICAgICAgY29uc3QgaW5kZXhBcnJheSA9IHRoaXMuaW5kZXhBcnJheTtcblxuICAgICAgICBhZGRMaW5lVmVydGV4KGxheW91dFZlcnRleEFycmF5LCBjdXJyZW50VmVydGV4LCBleHRydWRlLCBmYWxzZSwgbGluZVR1cm5zTGVmdCwgMCwgZGlzdGFuY2UpO1xuICAgICAgICB0aGlzLmUzID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGgrKztcbiAgICAgICAgaWYgKHRoaXMuZTEgPj0gMCAmJiB0aGlzLmUyID49IDApIHtcbiAgICAgICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2sodGhpcy5lMSwgdGhpcy5lMiwgdGhpcy5lMyk7XG4gICAgICAgICAgICBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpbmVUdXJuc0xlZnQpIHtcbiAgICAgICAgICAgIHRoaXMuZTIgPSB0aGlzLmUzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lMSA9IHRoaXMuZTM7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdMaW5lQnVja2V0JywgTGluZUJ1Y2tldCwge29taXQ6IFsnbGF5ZXJzJ119KTtcblxubW9kdWxlLmV4cG9ydHMgPSBMaW5lQnVja2V0O1xuIiwiLy8gICAgICBcblxuY29uc3Qge2NyZWF0ZUxheW91dH0gPSByZXF1aXJlKCcuLi8uLi91dGlsL3N0cnVjdF9hcnJheScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNvbnN0IHN5bWJvbExheW91dEF0dHJpYnV0ZXMgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAnYV9wb3Nfb2Zmc2V0JywgIGNvbXBvbmVudHM6IDQsIHR5cGU6ICdJbnQxNid9LFxuICAgIHtuYW1lOiAnYV9kYXRhJywgICAgICAgIGNvbXBvbmVudHM6IDQsIHR5cGU6ICdVaW50MTYnfVxuXSk7XG5cbmNvbnN0IGR5bmFtaWNMYXlvdXRBdHRyaWJ1dGVzID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7IG5hbWU6ICdhX3Byb2plY3RlZF9wb3MnLCBjb21wb25lbnRzOiAzLCB0eXBlOiAnRmxvYXQzMicgfVxuXSwgNCk7XG5cbmNvbnN0IHBsYWNlbWVudE9wYWNpdHlBdHRyaWJ1dGVzID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7IG5hbWU6ICdhX2ZhZGVfb3BhY2l0eScsIGNvbXBvbmVudHM6IDEsIHR5cGU6ICdVaW50MzInIH1cbl0sIDQpO1xuXG5jb25zdCBjb2xsaXNpb25WZXJ0ZXhBdHRyaWJ1dGVzID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7IG5hbWU6ICdhX3BsYWNlZCcsIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdVaW50OCcgfVxuXSwgNCk7XG5cbmNvbnN0IHN5bWJvbEF0dHJpYnV0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0ge1xuICAgIHN5bWJvbExheW91dEF0dHJpYnV0ZXMsXG4gICAgZHluYW1pY0xheW91dEF0dHJpYnV0ZXMsXG4gICAgcGxhY2VtZW50T3BhY2l0eUF0dHJpYnV0ZXMsXG4gICAgY29sbGlzaW9uVmVydGV4QXR0cmlidXRlcyxcbiAgICBjb2xsaXNpb25Cb3g6IGNyZWF0ZUxheW91dChbXG4gICAgICAgIC8vIHRoZSBib3ggaXMgY2VudGVyZWQgYXJvdW5kIHRoZSBhbmNob3IgcG9pbnRcbiAgICAgICAgeyB0eXBlOiAnSW50MTYnLCBuYW1lOiAnYW5jaG9yUG9pbnRYJyB9LFxuICAgICAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICdhbmNob3JQb2ludFknIH0sXG5cbiAgICAgICAgLy8gZGlzdGFuY2VzIHRvIHRoZSBlZGdlcyBmcm9tIHRoZSBhbmNob3JcbiAgICAgICAgeyB0eXBlOiAnSW50MTYnLCBuYW1lOiAneDEnIH0sXG4gICAgICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3kxJyB9LFxuICAgICAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICd4MicgfSxcbiAgICAgICAgeyB0eXBlOiAnSW50MTYnLCBuYW1lOiAneTInIH0sXG5cbiAgICAgICAgLy8gdGhlIGluZGV4IG9mIHRoZSBmZWF0dXJlIGluIHRoZSBvcmlnaW5hbCB2ZWN0b3J0aWxlXG4gICAgICAgIHsgdHlwZTogJ1VpbnQzMicsIG5hbWU6ICdmZWF0dXJlSW5kZXgnIH0sXG4gICAgICAgIC8vIHRoZSBzb3VyY2UgbGF5ZXIgdGhlIGZlYXR1cmUgYXBwZWFycyBpblxuICAgICAgICB7IHR5cGU6ICdVaW50MTYnLCBuYW1lOiAnc291cmNlTGF5ZXJJbmRleCcgfSxcbiAgICAgICAgLy8gdGhlIGJ1Y2tldCB0aGUgZmVhdHVyZSBhcHBlYXJzIGluXG4gICAgICAgIHsgdHlwZTogJ1VpbnQxNicsIG5hbWU6ICdidWNrZXRJbmRleCcgfSxcblxuICAgICAgICAvLyBjb2xsaXNpb24gY2lyY2xlcyBmb3IgbGluZXMgc3RvcmUgdGhlaXIgZGlzdGFuY2UgdG8gdGhlIGFuY2hvciBpbiB0aWxlIHVuaXRzXG4gICAgICAgIC8vIHNvIHRoYXQgdGhleSBjYW4gYmUgaWdub3JlZCBpZiB0aGUgcHJvamVjdGVkIGxhYmVsIGRvZXNuJ3QgZXh0ZW5kIGludG9cbiAgICAgICAgLy8gdGhlIGJveCBhcmVhXG4gICAgICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3JhZGl1cycgfSxcbiAgICAgICAgeyB0eXBlOiAnSW50MTYnLCBuYW1lOiAnc2lnbmVkRGlzdGFuY2VGcm9tQW5jaG9yJyB9XG4gICAgXSksXG4gICAgY29sbGlzaW9uQm94TGF5b3V0OiBjcmVhdGVMYXlvdXQoWyAvLyB1c2VkIHRvIHJlbmRlciBjb2xsaXNpb24gYm94ZXMgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlc1xuICAgICAgICB7bmFtZTogJ2FfcG9zJywgICAgICAgIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9LFxuICAgICAgICB7bmFtZTogJ2FfYW5jaG9yX3BvcycsIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9LFxuICAgICAgICB7bmFtZTogJ2FfZXh0cnVkZScsICAgIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9XG4gICAgXSwgNCksXG4gICAgY29sbGlzaW9uQ2lyY2xlTGF5b3V0OiBjcmVhdGVMYXlvdXQoWyAvLyB1c2VkIHRvIHJlbmRlciBjb2xsaXNpb24gY2lyY2xlcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzXG4gICAgICAgIHtuYW1lOiAnYV9wb3MnLCAgICAgICAgY29tcG9uZW50czogMiwgdHlwZTogJ0ludDE2J30sXG4gICAgICAgIHtuYW1lOiAnYV9hbmNob3JfcG9zJywgY29tcG9uZW50czogMiwgdHlwZTogJ0ludDE2J30sXG4gICAgICAgIHtuYW1lOiAnYV9leHRydWRlJywgICAgY29tcG9uZW50czogMiwgdHlwZTogJ0ludDE2J31cbiAgICBdLCA0KSxcbiAgICBwbGFjZW1lbnQ6IGNyZWF0ZUxheW91dChbXG4gICAgICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ2FuY2hvclgnIH0sXG4gICAgICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ2FuY2hvclknIH0sXG4gICAgICAgIHsgdHlwZTogJ1VpbnQxNicsIG5hbWU6ICdnbHlwaFN0YXJ0SW5kZXgnIH0sXG4gICAgICAgIHsgdHlwZTogJ1VpbnQxNicsIG5hbWU6ICdudW1HbHlwaHMnIH0sXG4gICAgICAgIHsgdHlwZTogJ1VpbnQzMicsIG5hbWU6ICd2ZXJ0ZXhTdGFydEluZGV4JyB9LFxuICAgICAgICB7IHR5cGU6ICdVaW50MzInLCBuYW1lOiAnbGluZVN0YXJ0SW5kZXgnIH0sXG4gICAgICAgIHsgdHlwZTogJ1VpbnQzMicsIG5hbWU6ICdsaW5lTGVuZ3RoJyB9LFxuICAgICAgICB7IHR5cGU6ICdVaW50MTYnLCBuYW1lOiAnc2VnbWVudCcgfSxcbiAgICAgICAgeyB0eXBlOiAnVWludDE2JywgbmFtZTogJ2xvd2VyU2l6ZScgfSxcbiAgICAgICAgeyB0eXBlOiAnVWludDE2JywgbmFtZTogJ3VwcGVyU2l6ZScgfSxcbiAgICAgICAgeyB0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICdsaW5lT2Zmc2V0WCcgfSxcbiAgICAgICAgeyB0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICdsaW5lT2Zmc2V0WScgfSxcbiAgICAgICAgeyB0eXBlOiAnVWludDgnLCBuYW1lOiAnd3JpdGluZ01vZGUnIH0sXG4gICAgICAgIHsgdHlwZTogJ1VpbnQ4JywgbmFtZTogJ2hpZGRlbicgfVxuICAgIF0pLFxuICAgIGdseXBoT2Zmc2V0OiBjcmVhdGVMYXlvdXQoW1xuICAgICAgICB7IHR5cGU6ICdGbG9hdDMyJywgbmFtZTogJ29mZnNldFgnIH1cbiAgICBdKSxcbiAgICBsaW5lVmVydGV4OiBjcmVhdGVMYXlvdXQoW1xuICAgICAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICd4JyB9LFxuICAgICAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICd5JyB9LFxuICAgICAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICd0aWxlVW5pdERpc3RhbmNlRnJvbUFuY2hvcicgfVxuICAgIF0pXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN5bWJvbEF0dHJpYnV0ZXM7XG4iLCIvLyAgICAgIFxuXG5jb25zdCB7XG4gICAgc3ltYm9sTGF5b3V0QXR0cmlidXRlcyxcbiAgICBjb2xsaXNpb25WZXJ0ZXhBdHRyaWJ1dGVzLFxuICAgIGNvbGxpc2lvbkJveExheW91dCxcbiAgICBjb2xsaXNpb25DaXJjbGVMYXlvdXQsXG4gICAgZHluYW1pY0xheW91dEF0dHJpYnV0ZXNcbn0gPSByZXF1aXJlKCcuL3N5bWJvbF9hdHRyaWJ1dGVzJyk7XG5cbmNvbnN0IHtcbiAgICBTeW1ib2xMYXlvdXRBcnJheSxcbiAgICBTeW1ib2xEeW5hbWljTGF5b3V0QXJyYXksXG4gICAgU3ltYm9sT3BhY2l0eUFycmF5LFxuICAgIENvbGxpc2lvbkJveExheW91dEFycmF5LFxuICAgIENvbGxpc2lvbkNpcmNsZUxheW91dEFycmF5LFxuICAgIENvbGxpc2lvblZlcnRleEFycmF5LFxuICAgIFBsYWNlZFN5bWJvbEFycmF5LFxuICAgIEdseXBoT2Zmc2V0QXJyYXksXG4gICAgU3ltYm9sTGluZVZlcnRleEFycmF5XG59ID0gcmVxdWlyZSgnLi4vYXJyYXlfdHlwZXMnKTtcblxuY29uc3QgUG9pbnQgPSByZXF1aXJlKCdAbWFwYm94L3BvaW50LWdlb21ldHJ5Jyk7XG5jb25zdCB7U2VnbWVudFZlY3Rvcn0gPSByZXF1aXJlKCcuLi9zZWdtZW50Jyk7XG5jb25zdCB7UHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXR9ID0gcmVxdWlyZSgnLi4vcHJvZ3JhbV9jb25maWd1cmF0aW9uJyk7XG5jb25zdCB7VHJpYW5nbGVJbmRleEFycmF5LCBMaW5lSW5kZXhBcnJheX0gPSByZXF1aXJlKCcuLi9pbmRleF9hcnJheV90eXBlJyk7XG5jb25zdCB0cmFuc2Zvcm1UZXh0ID0gcmVxdWlyZSgnLi4vLi4vc3ltYm9sL3RyYW5zZm9ybV90ZXh0Jyk7XG5jb25zdCBtZXJnZUxpbmVzID0gcmVxdWlyZSgnLi4vLi4vc3ltYm9sL21lcmdlbGluZXMnKTtcbmNvbnN0IHNjcmlwdERldGVjdGlvbiA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvc2NyaXB0X2RldGVjdGlvbicpO1xuY29uc3QgbG9hZEdlb21ldHJ5ID0gcmVxdWlyZSgnLi4vbG9hZF9nZW9tZXRyeScpO1xuY29uc3QgdmVjdG9yVGlsZUZlYXR1cmVUeXBlcyA9IHJlcXVpcmUoJ0BtYXBib3gvdmVjdG9yLXRpbGUnKS5WZWN0b3JUaWxlRmVhdHVyZS50eXBlcztcbmNvbnN0IHZlcnRpY2FsaXplUHVuY3R1YXRpb24gPSByZXF1aXJlKCcuLi8uLi91dGlsL3ZlcnRpY2FsaXplX3B1bmN0dWF0aW9uJyk7XG5jb25zdCBBbmNob3IgPSByZXF1aXJlKCcuLi8uLi9zeW1ib2wvYW5jaG9yJyk7XG5jb25zdCB7Z2V0U2l6ZURhdGF9ID0gcmVxdWlyZSgnLi4vLi4vc3ltYm9sL3N5bWJvbF9zaXplJyk7XG5jb25zdCB7cmVnaXN0ZXJ9ID0gcmVxdWlyZSgnLi4vLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgIFxuICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBcbiAgIFxuXG4vLyBPcGFjaXR5IGFycmF5cyBhcmUgZnJlcXVlbnRseSB1cGRhdGVkIGJ1dCBkb24ndCBjb250YWluIGEgbG90IG9mIGluZm9ybWF0aW9uLCBzbyB3ZSBwYWNrIHRoZW1cbi8vIHRpZ2h0LiBFYWNoIFVpbnQzMiBpcyBhY3R1YWxseSBmb3VyIGR1cGxpY2F0ZSBVaW50OHMgZm9yIHRoZSBmb3VyIGNvcm5lcnMgb2YgYSBnbHlwaFxuLy8gNyBiaXRzIGFyZSBmb3IgdGhlIGN1cnJlbnQgb3BhY2l0eSwgYW5kIHRoZSBsb3dlc3QgYml0IGlzIHRoZSB0YXJnZXQgb3BhY2l0eVxuXG4vLyBhY3R1YWxseSBkZWZpbmVkIGluIHN5bWJvbF9hdHRyaWJ1dGVzLmpzXG4vLyBjb25zdCBwbGFjZW1lbnRPcGFjaXR5QXR0cmlidXRlcyA9IFtcbi8vICAgICB7IG5hbWU6ICdhX2ZhZGVfb3BhY2l0eScsIGNvbXBvbmVudHM6IDEsIHR5cGU6ICdVaW50MzInIH1cbi8vIF07XG5jb25zdCBzaGFkZXJPcGFjaXR5QXR0cmlidXRlcyA9IFtcbiAgICB7IG5hbWU6ICdhX2ZhZGVfb3BhY2l0eScsIGNvbXBvbmVudHM6IDEsIHR5cGU6ICdVaW50OCcsIG9mZnNldDogMCB9XG5dO1xuXG5mdW5jdGlvbiBhZGRWZXJ0ZXgoYXJyYXksIGFuY2hvclgsIGFuY2hvclksIG94LCBveSwgdHgsIHR5LCBzaXplVmVydGV4KSB7XG4gICAgYXJyYXkuZW1wbGFjZUJhY2soXG4gICAgICAgIC8vIGFfcG9zX29mZnNldFxuICAgICAgICBhbmNob3JYLFxuICAgICAgICBhbmNob3JZLFxuICAgICAgICBNYXRoLnJvdW5kKG94ICogNjQpLFxuICAgICAgICBNYXRoLnJvdW5kKG95ICogNjQpLFxuXG4gICAgICAgIC8vIGFfZGF0YVxuICAgICAgICB0eCwgLy8geCBjb29yZGluYXRlIG9mIHN5bWJvbCBvbiBnbHlwaCBhdGxhcyB0ZXh0dXJlXG4gICAgICAgIHR5LCAvLyB5IGNvb3JkaW5hdGUgb2Ygc3ltYm9sIG9uIGdseXBoIGF0bGFzIHRleHR1cmVcbiAgICAgICAgc2l6ZVZlcnRleCA/IHNpemVWZXJ0ZXhbMF0gOiAwLFxuICAgICAgICBzaXplVmVydGV4ID8gc2l6ZVZlcnRleFsxXSA6IDBcbiAgICApO1xufVxuXG5mdW5jdGlvbiBhZGREeW5hbWljQXR0cmlidXRlcyhkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkgICAgICAgICAgICAgLCBwICAgICAgICwgYW5nbGUgICAgICAgICkge1xuICAgIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhwLngsIHAueSwgYW5nbGUpO1xuICAgIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhwLngsIHAueSwgYW5nbGUpO1xuICAgIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhwLngsIHAueSwgYW5nbGUpO1xuICAgIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhwLngsIHAueSwgYW5nbGUpO1xufVxuXG5jbGFzcyBTeW1ib2xCdWZmZXJzIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKHByb2dyYW1Db25maWd1cmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSA9IG5ldyBTeW1ib2xMYXlvdXRBcnJheSgpO1xuICAgICAgICB0aGlzLmluZGV4QXJyYXkgPSBuZXcgVHJpYW5nbGVJbmRleEFycmF5KCk7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zID0gcHJvZ3JhbUNvbmZpZ3VyYXRpb25zO1xuICAgICAgICB0aGlzLnNlZ21lbnRzID0gbmV3IFNlZ21lbnRWZWN0b3IoKTtcbiAgICAgICAgdGhpcy5keW5hbWljTGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgU3ltYm9sRHluYW1pY0xheW91dEFycmF5KCk7XG4gICAgICAgIHRoaXMub3BhY2l0eVZlcnRleEFycmF5ID0gbmV3IFN5bWJvbE9wYWNpdHlBcnJheSgpO1xuICAgICAgICB0aGlzLnBsYWNlZFN5bWJvbEFycmF5ID0gbmV3IFBsYWNlZFN5bWJvbEFycmF5KCk7XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQgICAgICAgICAsIGR5bmFtaWNJbmRleEJ1ZmZlciAgICAgICAgICkge1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHN5bWJvbExheW91dEF0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuaW5kZXhBcnJheSwgZHluYW1pY0luZGV4QnVmZmVyKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBsb2FkKGNvbnRleHQpO1xuICAgICAgICB0aGlzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSwgZHluYW1pY0xheW91dEF0dHJpYnV0ZXMubWVtYmVycywgdHJ1ZSk7XG4gICAgICAgIHRoaXMub3BhY2l0eVZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMub3BhY2l0eVZlcnRleEFycmF5LCBzaGFkZXJPcGFjaXR5QXR0cmlidXRlcywgdHJ1ZSk7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBwZXJmb3JtYW5jZSBoYWNrIHNvIHRoYXQgd2UgY2FuIHdyaXRlIHRvIG9wYWNpdHlWZXJ0ZXhBcnJheSB3aXRoIHVpbnQzMnNcbiAgICAgICAgLy8gZXZlbiB0aG91Z2ggdGhlIHNoYWRlcnMgcmVhZCB1aW50OHNcbiAgICAgICAgdGhpcy5vcGFjaXR5VmVydGV4QnVmZmVyLml0ZW1TaXplID0gMTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoIXRoaXMubGF5b3V0VmVydGV4QnVmZmVyKSByZXR1cm47XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMub3BhY2l0eVZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignU3ltYm9sQnVmZmVycycsIFN5bWJvbEJ1ZmZlcnMpO1xuXG5jbGFzcyBDb2xsaXNpb25CdWZmZXJzIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihMYXlvdXRBcnJheSAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgIGxheW91dEF0dHJpYnV0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICBJbmRleEFycmF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSA9IG5ldyBMYXlvdXRBcnJheSgpO1xuICAgICAgICB0aGlzLmxheW91dEF0dHJpYnV0ZXMgPSBsYXlvdXRBdHRyaWJ1dGVzO1xuICAgICAgICB0aGlzLmluZGV4QXJyYXkgPSBuZXcgSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnNlZ21lbnRzID0gbmV3IFNlZ21lbnRWZWN0b3IoKTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25WZXJ0ZXhBcnJheSA9IG5ldyBDb2xsaXNpb25WZXJ0ZXhBcnJheSgpO1xuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0ICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5sYXlvdXRBdHRyaWJ1dGVzKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmNvbGxpc2lvblZlcnRleEFycmF5LCBjb2xsaXNpb25WZXJ0ZXhBdHRyaWJ1dGVzLm1lbWJlcnMsIHRydWUpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIpIHJldHVybjtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uVmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdDb2xsaXNpb25CdWZmZXJzJywgQ29sbGlzaW9uQnVmZmVycyk7XG5cbi8qKlxuICogVW5saWtlIG90aGVyIGJ1Y2tldHMsIHdoaWNoIHNpbXBseSBpbXBsZW1lbnQgI2FkZEZlYXR1cmUgd2l0aCB0eXBlLXNwZWNpZmljXG4gKiBsb2dpYyBmb3IgKGVzc2VudGlhbGx5KSB0cmlhbmd1bGF0aW5nIGZlYXR1cmUgZ2VvbWV0cmllcywgU3ltYm9sQnVja2V0XG4gKiByZXF1aXJlcyBzcGVjaWFsaXplZCBiZWhhdmlvcjpcbiAqXG4gKiAxLiBXb3JrZXJUaWxlI3BhcnNlKCksIHRoZSBsb2dpY2FsIG93bmVyIG9mIHRoZSBidWNrZXQgY3JlYXRpb24gcHJvY2VzcyxcbiAqICAgIGNhbGxzIFN5bWJvbEJ1Y2tldCNwb3B1bGF0ZSgpLCB3aGljaCByZXNvbHZlcyB0ZXh0IGFuZCBpY29uIHRva2VucyBvblxuICogICAgZWFjaCBmZWF0dXJlLCBhZGRzIGVhY2ggZ2x5cGhzIGFuZCBzeW1ib2xzIG5lZWRlZCB0byB0aGUgcGFzc2VkLWluXG4gKiAgICBjb2xsZWN0aW9ucyBvcHRpb25zLmdseXBoRGVwZW5kZW5jaWVzIGFuZCBvcHRpb25zLmljb25EZXBlbmRlbmNpZXMsIGFuZFxuICogICAgc3RvcmVzIHRoZSBmZWF0dXJlIGRhdGEgZm9yIHVzZSBpbiBzdWJzZXF1ZW50IHN0ZXAgKHRoaXMuZmVhdHVyZXMpLlxuICpcbiAqIDIuIFdvcmtlclRpbGUgYXN5bmNocm9ub3VzbHkgcmVxdWVzdHMgZnJvbSB0aGUgbWFpbiB0aHJlYWQgYWxsIG9mIHRoZSBnbHlwaHNcbiAqICAgIGFuZCBpY29ucyBuZWVkZWQgKGJ5IHRoaXMgYnVja2V0IGFuZCBhbnkgb3RoZXJzKS4gV2hlbiBnbHlwaHMgYW5kIGljb25zXG4gKiAgICBoYXZlIGJlZW4gcmVjZWl2ZWQsIHRoZSBXb3JrZXJUaWxlIGNyZWF0ZXMgYSBDb2xsaXNpb25JbmRleCBhbmQgaW52b2tlczpcbiAqXG4gKiAzLiBwZXJmb3JtU3ltYm9sTGF5b3V0KGJ1Y2tldCwgc3RhY2tzLCBpY29ucykgcGVyZm9ybSB0ZXh0cyBzaGFwaW5nIGFuZFxuICogICAgbGF5b3V0IG9uIGEgU3ltYm9sIEJ1Y2tldC4gVGhpcyBzdGVwIHBvcHVsYXRlczpcbiAqICAgICAgYHRoaXMuc3ltYm9sSW5zdGFuY2VzYDogbWV0YWRhdGEgb24gZ2VuZXJhdGVkIHN5bWJvbHNcbiAqICAgICAgYHRoaXMuY29sbGlzaW9uQm94QXJyYXlgOiBjb2xsaXNpb24gZGF0YSBmb3IgdXNlIGJ5IGZvcmVncm91bmRcbiAqICAgICAgYHRoaXMudGV4dGA6IFN5bWJvbEJ1ZmZlcnMgZm9yIHRleHQgc3ltYm9sc1xuICogICAgICBgdGhpcy5pY29uc2A6IFN5bWJvbEJ1ZmZlcnMgZm9yIGljb25zXG4gKiAgICAgIGB0aGlzLmNvbGxpc2lvbkJveGA6IERlYnVnIFN5bWJvbEJ1ZmZlcnMgZm9yIGNvbGxpc2lvbiBib3hlc1xuICogICAgICBgdGhpcy5jb2xsaXNpb25DaXJjbGVgOiBEZWJ1ZyBTeW1ib2xCdWZmZXJzIGZvciBjb2xsaXNpb24gY2lyY2xlc1xuICogICAgVGhlIHJlc3VsdHMgYXJlIHNlbnQgdG8gdGhlIGZvcmVncm91bmQgZm9yIHJlbmRlcmluZ1xuICpcbiAqIDQuIHBlcmZvcm1TeW1ib2xQbGFjZW1lbnQoYnVja2V0LCBjb2xsaXNpb25JbmRleCkgaXMgcnVuIG9uIHRoZSBmb3JlZ3JvdW5kLFxuICogICAgYW5kIHVzZXMgdGhlIENvbGxpc2lvbkluZGV4IGFsb25nIHdpdGggY3VycmVudCBjYW1lcmEgc2V0dGluZ3MgdG8gZGV0ZXJtaW5lXG4gKiAgICB3aGljaCBzeW1ib2xzIGNhbiBhY3R1YWxseSBzaG93IG9uIHRoZSBtYXAuIENvbGxpZGVkIHN5bWJvbHMgYXJlIGhpZGRlblxuICogICAgdXNpbmcgYSBkeW5hbWljIFwiT3BhY2l0eVZlcnRleEFycmF5XCIuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3ltYm9sQnVja2V0ICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uQm94QXJyYXkgPSBvcHRpb25zLmNvbGxpc2lvbkJveEFycmF5O1xuICAgICAgICB0aGlzLnpvb20gPSBvcHRpb25zLnpvb207XG4gICAgICAgIHRoaXMub3ZlcnNjYWxpbmcgPSBvcHRpb25zLm92ZXJzY2FsaW5nO1xuICAgICAgICB0aGlzLmxheWVycyA9IG9wdGlvbnMubGF5ZXJzO1xuICAgICAgICB0aGlzLmxheWVySWRzID0gdGhpcy5sYXllcnMubWFwKGxheWVyID0+IGxheWVyLmlkKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG9wdGlvbnMuaW5kZXg7XG4gICAgICAgIHRoaXMucGl4ZWxSYXRpbyA9IG9wdGlvbnMucGl4ZWxSYXRpbztcblxuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMubGF5ZXJzWzBdO1xuICAgICAgICBjb25zdCB1bmV2YWx1YXRlZExheW91dFZhbHVlcyA9IGxheWVyLl91bmV2YWx1YXRlZExheW91dC5fdmFsdWVzO1xuXG4gICAgICAgIHRoaXMudGV4dFNpemVEYXRhID0gZ2V0U2l6ZURhdGEodGhpcy56b29tLCB1bmV2YWx1YXRlZExheW91dFZhbHVlc1sndGV4dC1zaXplJ10pO1xuICAgICAgICB0aGlzLmljb25TaXplRGF0YSA9IGdldFNpemVEYXRhKHRoaXMuem9vbSwgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ2ljb24tc2l6ZSddKTtcblxuICAgICAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmxheWVyc1swXS5sYXlvdXQ7XG4gICAgICAgIHRoaXMuc29ydEZlYXR1cmVzQnlZID0gbGF5b3V0LmdldCgndGV4dC1hbGxvdy1vdmVybGFwJykgfHwgbGF5b3V0LmdldCgnaWNvbi1hbGxvdy1vdmVybGFwJykgfHxcbiAgICAgICAgICAgIGxheW91dC5nZXQoJ3RleHQtaWdub3JlLXBsYWNlbWVudCcpIHx8IGxheW91dC5nZXQoJ2ljb24taWdub3JlLXBsYWNlbWVudCcpO1xuICAgIH1cblxuICAgIGNyZWF0ZUFycmF5cygpIHtcbiAgICAgICAgdGhpcy50ZXh0ID0gbmV3IFN5bWJvbEJ1ZmZlcnMobmV3IFByb2dyYW1Db25maWd1cmF0aW9uU2V0KHN5bWJvbExheW91dEF0dHJpYnV0ZXMubWVtYmVycywgdGhpcy5sYXllcnMsIHRoaXMuem9vbSwgcHJvcGVydHkgPT4gL150ZXh0Ly50ZXN0KHByb3BlcnR5KSkpO1xuICAgICAgICB0aGlzLmljb24gPSBuZXcgU3ltYm9sQnVmZmVycyhuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQoc3ltYm9sTGF5b3V0QXR0cmlidXRlcy5tZW1iZXJzLCB0aGlzLmxheWVycywgdGhpcy56b29tLCBwcm9wZXJ0eSA9PiAvXmljb24vLnRlc3QocHJvcGVydHkpKSk7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uQm94ID0gbmV3IENvbGxpc2lvbkJ1ZmZlcnMoQ29sbGlzaW9uQm94TGF5b3V0QXJyYXksIGNvbGxpc2lvbkJveExheW91dC5tZW1iZXJzLCBMaW5lSW5kZXhBcnJheSk7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uQ2lyY2xlID0gbmV3IENvbGxpc2lvbkJ1ZmZlcnMoQ29sbGlzaW9uQ2lyY2xlTGF5b3V0QXJyYXksIGNvbGxpc2lvbkNpcmNsZUxheW91dC5tZW1iZXJzLCBUcmlhbmdsZUluZGV4QXJyYXkpO1xuXG4gICAgICAgIHRoaXMuZ2x5cGhPZmZzZXRBcnJheSA9IG5ldyBHbHlwaE9mZnNldEFycmF5KCk7XG4gICAgICAgIHRoaXMubGluZVZlcnRleEFycmF5ID0gbmV3IFN5bWJvbExpbmVWZXJ0ZXhBcnJheSgpO1xuICAgIH1cblxuICAgIHBvcHVsYXRlKGZlYXR1cmVzICAgICAgICAgICAgICAgICAgICAgICAsIG9wdGlvbnMgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMubGF5ZXJzWzBdO1xuICAgICAgICBjb25zdCBsYXlvdXQgPSBsYXllci5sYXlvdXQ7XG5cbiAgICAgICAgY29uc3QgdGV4dEZvbnQgPSBsYXlvdXQuZ2V0KCd0ZXh0LWZvbnQnKTtcbiAgICAgICAgY29uc3QgdGV4dEZpZWxkID0gbGF5b3V0LmdldCgndGV4dC1maWVsZCcpO1xuICAgICAgICBjb25zdCBpY29uSW1hZ2UgPSBsYXlvdXQuZ2V0KCdpY29uLWltYWdlJyk7XG4gICAgICAgIGNvbnN0IGhhc1RleHQgPVxuICAgICAgICAgICAgKHRleHRGaWVsZC52YWx1ZS5raW5kICE9PSAnY29uc3RhbnQnIHx8IHRleHRGaWVsZC52YWx1ZS52YWx1ZS5sZW5ndGggPiAwKSAmJlxuICAgICAgICAgICAgKHRleHRGb250LnZhbHVlLmtpbmQgIT09ICdjb25zdGFudCcgfHwgdGV4dEZvbnQudmFsdWUudmFsdWUubGVuZ3RoID4gMCk7XG4gICAgICAgIGNvbnN0IGhhc0ljb24gPSBpY29uSW1hZ2UudmFsdWUua2luZCAhPT0gJ2NvbnN0YW50JyB8fCBpY29uSW1hZ2UudmFsdWUudmFsdWUgJiYgaWNvbkltYWdlLnZhbHVlLnZhbHVlLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgdGhpcy5mZWF0dXJlcyA9IFtdO1xuXG4gICAgICAgIGlmICghaGFzVGV4dCAmJiAhaGFzSWNvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWNvbnMgPSBvcHRpb25zLmljb25EZXBlbmRlbmNpZXM7XG4gICAgICAgIGNvbnN0IHN0YWNrcyA9IG9wdGlvbnMuZ2x5cGhEZXBlbmRlbmNpZXM7XG4gICAgICAgIGNvbnN0IGdsb2JhbFByb3BlcnRpZXMgPSAge3pvb206IHRoaXMuem9vbX07XG5cbiAgICAgICAgZm9yIChjb25zdCB7ZmVhdHVyZSwgaW5kZXgsIHNvdXJjZUxheWVySW5kZXh9IG9mIGZlYXR1cmVzKSB7XG4gICAgICAgICAgICBpZiAoIWxheWVyLl9mZWF0dXJlRmlsdGVyKGdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0ZXh0O1xuICAgICAgICAgICAgaWYgKGhhc1RleHQpIHtcbiAgICAgICAgICAgICAgICB0ZXh0ID0gbGF5ZXIuZ2V0VmFsdWVBbmRSZXNvbHZlVG9rZW5zKCd0ZXh0LWZpZWxkJywgZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgdGV4dCA9IHRyYW5zZm9ybVRleHQodGV4dCwgbGF5ZXIsIGZlYXR1cmUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgaWNvbjtcbiAgICAgICAgICAgIGlmIChoYXNJY29uKSB7XG4gICAgICAgICAgICAgICAgaWNvbiA9IGxheWVyLmdldFZhbHVlQW5kUmVzb2x2ZVRva2VucygnaWNvbi1pbWFnZScsIGZlYXR1cmUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRleHQgJiYgIWljb24pIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3ltYm9sRmVhdHVyZSAgICAgICAgICAgICAgICA9IHtcbiAgICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICAgIGljb24sXG4gICAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogbG9hZEdlb21ldHJ5KGZlYXR1cmUpLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICB0eXBlOiB2ZWN0b3JUaWxlRmVhdHVyZVR5cGVzW2ZlYXR1cmUudHlwZV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZlYXR1cmUuaWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgc3ltYm9sRmVhdHVyZS5pZCA9IGZlYXR1cmUuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goc3ltYm9sRmVhdHVyZSk7XG5cbiAgICAgICAgICAgIGlmIChpY29uKSB7XG4gICAgICAgICAgICAgICAgaWNvbnNbaWNvbl0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvbnRTdGFjayA9IHRleHRGb250LmV2YWx1YXRlKGZlYXR1cmUpLmpvaW4oJywnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHN0YWNrc1tmb250U3RhY2tdID0gc3RhY2tzW2ZvbnRTdGFja10gfHwge307XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dEFsb25nTGluZSA9IGxheW91dC5nZXQoJ3RleHQtcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdtYXAnICYmIGxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSA9PT0gJ2xpbmUnO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFsbG93c1ZlcnRpY2FsV3JpdGluZ01vZGUgPSBzY3JpcHREZXRlY3Rpb24uYWxsb3dzVmVydGljYWxXcml0aW5nTW9kZSh0ZXh0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2tbdGV4dC5jaGFyQ29kZUF0KGkpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0QWxvbmdMaW5lICYmIGFsbG93c1ZlcnRpY2FsV3JpdGluZ01vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsQ2hhciA9IHZlcnRpY2FsaXplUHVuY3R1YXRpb24ubG9va3VwW3RleHQuY2hhckF0KGkpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJ0aWNhbENoYXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1t2ZXJ0aWNhbENoYXIuY2hhckNvZGVBdCgwKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSA9PT0gJ2xpbmUnKSB7XG4gICAgICAgICAgICAvLyBNZXJnZSBhZGphY2VudCBsaW5lcyB3aXRoIHRoZSBzYW1lIHRleHQgdG8gaW1wcm92ZSBsYWJlbGxpbmcuXG4gICAgICAgICAgICAvLyBJdCdzIGJldHRlciB0byBwbGFjZSBsYWJlbHMgb24gb25lIGxvbmcgbGluZSB0aGFuIG9uIG1hbnkgc2hvcnQgc2VnbWVudHMuXG4gICAgICAgICAgICB0aGlzLmZlYXR1cmVzID0gbWVyZ2VMaW5lcyh0aGlzLmZlYXR1cmVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dCAgICAgICAgICkge1xuICAgICAgICB0aGlzLnRleHQudXBsb2FkKGNvbnRleHQsIHRoaXMuc29ydEZlYXR1cmVzQnlZKTtcbiAgICAgICAgdGhpcy5pY29uLnVwbG9hZChjb250ZXh0LCB0aGlzLnNvcnRGZWF0dXJlc0J5WSk7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uQm94LnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25DaXJjbGUudXBsb2FkKGNvbnRleHQpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudGV4dC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaWNvbi5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uQm94LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25DaXJjbGUuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGFkZFRvTGluZVZlcnRleEFycmF5KGFuY2hvciAgICAgICAgLCBsaW5lICAgICApIHtcbiAgICAgICAgY29uc3QgbGluZVN0YXJ0SW5kZXggPSB0aGlzLmxpbmVWZXJ0ZXhBcnJheS5sZW5ndGg7XG4gICAgICAgIGlmIChhbmNob3Iuc2VnbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgc3VtRm9yd2FyZExlbmd0aCA9IGFuY2hvci5kaXN0KGxpbmVbYW5jaG9yLnNlZ21lbnQgKyAxXSk7XG4gICAgICAgICAgICBsZXQgc3VtQmFja3dhcmRMZW5ndGggPSBhbmNob3IuZGlzdChsaW5lW2FuY2hvci5zZWdtZW50XSk7XG4gICAgICAgICAgICBjb25zdCB2ZXJ0aWNlcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGFuY2hvci5zZWdtZW50ICsgMTsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNlc1tpXSA9IHsgeDogbGluZVtpXS54LCB5OiBsaW5lW2ldLnksIHRpbGVVbml0RGlzdGFuY2VGcm9tQW5jaG9yOiBzdW1Gb3J3YXJkTGVuZ3RoIH07XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBsaW5lLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3VtRm9yd2FyZExlbmd0aCArPSBsaW5lW2kgKyAxXS5kaXN0KGxpbmVbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBhbmNob3Iuc2VnbWVudCB8fCAwOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIHZlcnRpY2VzW2ldID0geyB4OiBsaW5lW2ldLngsIHk6IGxpbmVbaV0ueSwgdGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3I6IHN1bUJhY2t3YXJkTGVuZ3RoIH07XG4gICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1bUJhY2t3YXJkTGVuZ3RoICs9IGxpbmVbaSAtIDFdLmRpc3QobGluZVtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVydGV4ID0gdmVydGljZXNbaV07XG4gICAgICAgICAgICAgICAgdGhpcy5saW5lVmVydGV4QXJyYXkuZW1wbGFjZUJhY2sodmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgudGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsaW5lU3RhcnRJbmRleDogbGluZVN0YXJ0SW5kZXgsXG4gICAgICAgICAgICBsaW5lTGVuZ3RoOiB0aGlzLmxpbmVWZXJ0ZXhBcnJheS5sZW5ndGggLSBsaW5lU3RhcnRJbmRleFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGFkZFN5bWJvbHMoYXJyYXlzICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgcXVhZHMgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgc2l6ZVZlcnRleCAgICAgLFxuICAgICAgICAgICAgICAgbGluZU9mZnNldCAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgIGFsb25nTGluZSAgICAgICAgICxcbiAgICAgICAgICAgICAgIGZlYXR1cmUgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgd3JpdGluZ01vZGUgICAgICxcbiAgICAgICAgICAgICAgIGxhYmVsQW5jaG9yICAgICAgICAsXG4gICAgICAgICAgICAgICBsaW5lU3RhcnRJbmRleCAgICAgICAgLFxuICAgICAgICAgICAgICAgbGluZUxlbmd0aCAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGluZGV4QXJyYXkgPSBhcnJheXMuaW5kZXhBcnJheTtcbiAgICAgICAgY29uc3QgbGF5b3V0VmVydGV4QXJyYXkgPSBhcnJheXMubGF5b3V0VmVydGV4QXJyYXk7XG4gICAgICAgIGNvbnN0IGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSA9IGFycmF5cy5keW5hbWljTGF5b3V0VmVydGV4QXJyYXk7XG5cbiAgICAgICAgY29uc3Qgc2VnbWVudCA9IGFycmF5cy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudCg0ICogcXVhZHMubGVuZ3RoLCBhcnJheXMubGF5b3V0VmVydGV4QXJyYXksIGFycmF5cy5pbmRleEFycmF5KTtcbiAgICAgICAgY29uc3QgZ2x5cGhPZmZzZXRBcnJheVN0YXJ0ID0gdGhpcy5nbHlwaE9mZnNldEFycmF5Lmxlbmd0aDtcbiAgICAgICAgY29uc3QgdmVydGV4U3RhcnRJbmRleCA9IHNlZ21lbnQudmVydGV4TGVuZ3RoO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3ltYm9sIG9mIHF1YWRzKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHRsID0gc3ltYm9sLnRsLFxuICAgICAgICAgICAgICAgIHRyID0gc3ltYm9sLnRyLFxuICAgICAgICAgICAgICAgIGJsID0gc3ltYm9sLmJsLFxuICAgICAgICAgICAgICAgIGJyID0gc3ltYm9sLmJyLFxuICAgICAgICAgICAgICAgIHRleCA9IHN5bWJvbC50ZXg7XG5cbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGg7XG5cbiAgICAgICAgICAgIGNvbnN0IHkgPSBzeW1ib2wuZ2x5cGhPZmZzZXRbMV07XG4gICAgICAgICAgICBhZGRWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIGxhYmVsQW5jaG9yLngsIGxhYmVsQW5jaG9yLnksIHRsLngsIHkgKyB0bC55LCB0ZXgueCwgdGV4LnksIHNpemVWZXJ0ZXgpO1xuICAgICAgICAgICAgYWRkVmVydGV4KGxheW91dFZlcnRleEFycmF5LCBsYWJlbEFuY2hvci54LCBsYWJlbEFuY2hvci55LCB0ci54LCB5ICsgdHIueSwgdGV4LnggKyB0ZXgudywgdGV4LnksIHNpemVWZXJ0ZXgpO1xuICAgICAgICAgICAgYWRkVmVydGV4KGxheW91dFZlcnRleEFycmF5LCBsYWJlbEFuY2hvci54LCBsYWJlbEFuY2hvci55LCBibC54LCB5ICsgYmwueSwgdGV4LngsIHRleC55ICsgdGV4LmgsIHNpemVWZXJ0ZXgpO1xuICAgICAgICAgICAgYWRkVmVydGV4KGxheW91dFZlcnRleEFycmF5LCBsYWJlbEFuY2hvci54LCBsYWJlbEFuY2hvci55LCBici54LCB5ICsgYnIueSwgdGV4LnggKyB0ZXgudywgdGV4LnkgKyB0ZXguaCwgc2l6ZVZlcnRleCk7XG5cbiAgICAgICAgICAgIGFkZER5bmFtaWNBdHRyaWJ1dGVzKGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSwgbGFiZWxBbmNob3IsIDApO1xuXG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4LCBpbmRleCArIDEsIGluZGV4ICsgMik7XG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4ICsgMSwgaW5kZXggKyAyLCBpbmRleCArIDMpO1xuXG4gICAgICAgICAgICBzZWdtZW50LnZlcnRleExlbmd0aCArPSA0O1xuICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gMjtcblxuICAgICAgICAgICAgdGhpcy5nbHlwaE9mZnNldEFycmF5LmVtcGxhY2VCYWNrKHN5bWJvbC5nbHlwaE9mZnNldFswXSk7XG4gICAgICAgIH1cblxuICAgICAgICBhcnJheXMucGxhY2VkU3ltYm9sQXJyYXkuZW1wbGFjZUJhY2sobGFiZWxBbmNob3IueCwgbGFiZWxBbmNob3IueSxcbiAgICAgICAgICAgIGdseXBoT2Zmc2V0QXJyYXlTdGFydCwgdGhpcy5nbHlwaE9mZnNldEFycmF5Lmxlbmd0aCAtIGdseXBoT2Zmc2V0QXJyYXlTdGFydCwgdmVydGV4U3RhcnRJbmRleCxcbiAgICAgICAgICAgIGxpbmVTdGFydEluZGV4LCBsaW5lTGVuZ3RoLCAobGFiZWxBbmNob3Iuc2VnbWVudCAgICAgKSxcbiAgICAgICAgICAgIHNpemVWZXJ0ZXggPyBzaXplVmVydGV4WzBdIDogMCwgc2l6ZVZlcnRleCA/IHNpemVWZXJ0ZXhbMV0gOiAwLFxuICAgICAgICAgICAgbGluZU9mZnNldFswXSwgbGluZU9mZnNldFsxXSxcbiAgICAgICAgICAgIHdyaXRpbmdNb2RlLCAoZmFsc2UgICAgICkpO1xuXG4gICAgICAgIGFycmF5cy5wcm9ncmFtQ29uZmlndXJhdGlvbnMucG9wdWxhdGVQYWludEFycmF5cyhhcnJheXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLCBmZWF0dXJlKTtcbiAgICB9XG5cbiAgICBfYWRkQ29sbGlzaW9uRGVidWdWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXkgICAgICAgICAgICAgLCBjb2xsaXNpb25WZXJ0ZXhBcnJheSAgICAgICAgICAgICAsIHBvaW50ICAgICAgICwgYW5jaG9yICAgICAgICwgZXh0cnVkZSAgICAgICApIHtcbiAgICAgICAgY29sbGlzaW9uVmVydGV4QXJyYXkuZW1wbGFjZUJhY2soMCwgMCk7XG4gICAgICAgIHJldHVybiBsYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhcbiAgICAgICAgICAgIC8vIHBvc1xuICAgICAgICAgICAgcG9pbnQueCxcbiAgICAgICAgICAgIHBvaW50LnksXG4gICAgICAgICAgICAvLyBhX2FuY2hvcl9wb3NcbiAgICAgICAgICAgIGFuY2hvci54LFxuICAgICAgICAgICAgYW5jaG9yLnksXG4gICAgICAgICAgICAvLyBleHRydWRlXG4gICAgICAgICAgICBNYXRoLnJvdW5kKGV4dHJ1ZGUueCksXG4gICAgICAgICAgICBNYXRoLnJvdW5kKGV4dHJ1ZGUueSkpO1xuICAgIH1cblxuXG4gICAgYWRkQ29sbGlzaW9uRGVidWdWZXJ0aWNlcyh4MSAgICAgICAgLCB5MSAgICAgICAgLCB4MiAgICAgICAgLCB5MiAgICAgICAgLCBhcnJheXMgICAgICAgICAgICAgICAgICAsIGJveEFuY2hvclBvaW50ICAgICAgICwgc3ltYm9sSW5zdGFuY2UgICAgICAgICAgICAgICAgLCBpc0NpcmNsZSAgICAgICAgICkge1xuICAgICAgICBjb25zdCBzZWdtZW50ID0gYXJyYXlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQsIGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheSwgYXJyYXlzLmluZGV4QXJyYXkpO1xuICAgICAgICBjb25zdCBpbmRleCA9IHNlZ21lbnQudmVydGV4TGVuZ3RoO1xuXG4gICAgICAgIGNvbnN0IGxheW91dFZlcnRleEFycmF5ID0gYXJyYXlzLmxheW91dFZlcnRleEFycmF5O1xuICAgICAgICBjb25zdCBjb2xsaXNpb25WZXJ0ZXhBcnJheSA9IGFycmF5cy5jb2xsaXNpb25WZXJ0ZXhBcnJheTtcblxuICAgICAgICB0aGlzLl9hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgY29sbGlzaW9uVmVydGV4QXJyYXksIGJveEFuY2hvclBvaW50LCBzeW1ib2xJbnN0YW5jZS5hbmNob3IsIG5ldyBQb2ludCh4MSwgeTEpKTtcbiAgICAgICAgdGhpcy5fYWRkQ29sbGlzaW9uRGVidWdWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIGNvbGxpc2lvblZlcnRleEFycmF5LCBib3hBbmNob3JQb2ludCwgc3ltYm9sSW5zdGFuY2UuYW5jaG9yLCBuZXcgUG9pbnQoeDIsIHkxKSk7XG4gICAgICAgIHRoaXMuX2FkZENvbGxpc2lvbkRlYnVnVmVydGV4KGxheW91dFZlcnRleEFycmF5LCBjb2xsaXNpb25WZXJ0ZXhBcnJheSwgYm94QW5jaG9yUG9pbnQsIHN5bWJvbEluc3RhbmNlLmFuY2hvciwgbmV3IFBvaW50KHgyLCB5MikpO1xuICAgICAgICB0aGlzLl9hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgY29sbGlzaW9uVmVydGV4QXJyYXksIGJveEFuY2hvclBvaW50LCBzeW1ib2xJbnN0YW5jZS5hbmNob3IsIG5ldyBQb2ludCh4MSwgeTIpKTtcblxuICAgICAgICBzZWdtZW50LnZlcnRleExlbmd0aCArPSA0O1xuICAgICAgICBpZiAoaXNDaXJjbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4QXJyYXkgICAgICAgICAgICAgICAgICAgICA9IChhcnJheXMuaW5kZXhBcnJheSAgICAgKTtcbiAgICAgICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgMSwgaW5kZXggKyAyKTtcbiAgICAgICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgMiwgaW5kZXggKyAzKTtcblxuICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4QXJyYXkgICAgICAgICAgICAgICAgID0gKGFycmF5cy5pbmRleEFycmF5ICAgICApO1xuICAgICAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpbmRleCwgaW5kZXggKyAxKTtcbiAgICAgICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXggKyAxLCBpbmRleCArIDIpO1xuICAgICAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpbmRleCArIDIsIGluZGV4ICsgMyk7XG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4ICsgMywgaW5kZXgpO1xuXG4gICAgICAgICAgICBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCArPSA0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVDb2xsaXNpb25EZWJ1Z0J1ZmZlcnMoKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc3ltYm9sSW5zdGFuY2Ugb2YgdGhpcy5zeW1ib2xJbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLnRleHRDb2xsaXNpb25GZWF0dXJlID0ge2JveFN0YXJ0SW5kZXg6IHN5bWJvbEluc3RhbmNlLnRleHRCb3hTdGFydEluZGV4LCBib3hFbmRJbmRleDogc3ltYm9sSW5zdGFuY2UudGV4dEJveEVuZEluZGV4fTtcbiAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmljb25Db2xsaXNpb25GZWF0dXJlID0ge2JveFN0YXJ0SW5kZXg6IHN5bWJvbEluc3RhbmNlLmljb25Cb3hTdGFydEluZGV4LCBib3hFbmRJbmRleDogc3ltYm9sSW5zdGFuY2UuaWNvbkJveEVuZEluZGV4fTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gc3ltYm9sSW5zdGFuY2VbaSA9PT0gMCA/ICd0ZXh0Q29sbGlzaW9uRmVhdHVyZScgOiAnaWNvbkNvbGxpc2lvbkZlYXR1cmUnXTtcbiAgICAgICAgICAgICAgICBpZiAoIWZlYXR1cmUpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYiA9IGZlYXR1cmUuYm94U3RhcnRJbmRleDsgYiA8IGZlYXR1cmUuYm94RW5kSW5kZXg7IGIrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBib3ggICAgICAgICAgICAgICA9ICh0aGlzLmNvbGxpc2lvbkJveEFycmF5LmdldChiKSAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeDEgPSBib3gueDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHkxID0gYm94LnkxO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4MiA9IGJveC54MjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeTIgPSBib3gueTI7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJhZGl1cyA+IDAsIHRoaXMgY29sbGlzaW9uIGJveCBpcyBhY3R1YWxseSBhIGNpcmNsZVxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGF0YSB3ZSBhZGQgdG8gdGhlIGJ1ZmZlcnMgaXMgZXhhY3RseSB0aGUgc2FtZSwgYnV0IHdlJ2xsIHJlbmRlciB3aXRoIGEgZGlmZmVyZW50IHNoYWRlci5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNDaXJjbGUgPSBib3gucmFkaXVzID4gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRpY2VzKHgxLCB5MSwgeDIsIHkyLCBpc0NpcmNsZSA/IHRoaXMuY29sbGlzaW9uQ2lyY2xlIDogdGhpcy5jb2xsaXNpb25Cb3gsIGJveC5hbmNob3JQb2ludCwgc3ltYm9sSW5zdGFuY2UsIGlzQ2lyY2xlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGVzZSBmbGF0IGFycmF5cyBhcmUgbWVhbnQgdG8gYmUgcXVpY2tlciB0byBpdGVyYXRlIG92ZXIgdGhhbiB0aGUgc291cmNlXG4gICAgLy8gQ29sbGlzaW9uQm94QXJyYXlcbiAgICBkZXNlcmlhbGl6ZUNvbGxpc2lvbkJveGVzKGNvbGxpc2lvbkJveEFycmF5ICAgICAgICAgICAgICAgICAgICwgdGV4dFN0YXJ0SW5kZXggICAgICAgICwgdGV4dEVuZEluZGV4ICAgICAgICAsIGljb25TdGFydEluZGV4ICAgICAgICAsIGljb25FbmRJbmRleCAgICAgICAgKSAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgY29uc3QgY29sbGlzaW9uQXJyYXlzID0ge307XG4gICAgICAgIGZvciAobGV0IGsgPSB0ZXh0U3RhcnRJbmRleDsgayA8IHRleHRFbmRJbmRleDsgaysrKSB7XG4gICAgICAgICAgICBjb25zdCBib3ggICAgICAgICAgICAgICA9IChjb2xsaXNpb25Cb3hBcnJheS5nZXQoaykgICAgICk7XG4gICAgICAgICAgICBpZiAoYm94LnJhZGl1cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy50ZXh0Qm94ID0geyB4MTogYm94LngxLCB5MTogYm94LnkxLCB4MjogYm94LngyLCB5MjogYm94LnkyLCBhbmNob3JQb2ludFg6IGJveC5hbmNob3JQb2ludFgsIGFuY2hvclBvaW50WTogYm94LmFuY2hvclBvaW50WSB9O1xuXG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIE9ubHkgb25lIGJveCBhbGxvd2VkIHBlciBpbnN0YW5jZVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbGxpc2lvbkFycmF5cy50ZXh0Q2lyY2xlcykge1xuICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25BcnJheXMudGV4dENpcmNsZXMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdXNlZCA9IDE7IC8vIE1heSBiZSB1cGRhdGVkIGF0IGNvbGxpc2lvbiBkZXRlY3Rpb24gdGltZVxuICAgICAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy50ZXh0Q2lyY2xlcy5wdXNoKGJveC5hbmNob3JQb2ludFgsIGJveC5hbmNob3JQb2ludFksIGJveC5yYWRpdXMsIGJveC5zaWduZWREaXN0YW5jZUZyb21BbmNob3IsIHVzZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGsgPSBpY29uU3RhcnRJbmRleDsgayA8IGljb25FbmRJbmRleDsgaysrKSB7XG4gICAgICAgICAgICAvLyBBbiBpY29uIGNhbiBvbmx5IGhhdmUgb25lIGJveCBub3csIHNvIHRoaXMgaW5kZXhpbmcgaXMgYSBiaXQgdmVzdGlnaWFsLi4uXG4gICAgICAgICAgICBjb25zdCBib3ggICAgICAgICAgICAgICA9IChjb2xsaXNpb25Cb3hBcnJheS5nZXQoaykgICAgICk7XG4gICAgICAgICAgICBpZiAoYm94LnJhZGl1cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy5pY29uQm94ID0geyB4MTogYm94LngxLCB5MTogYm94LnkxLCB4MjogYm94LngyLCB5MjogYm94LnkyLCBhbmNob3JQb2ludFg6IGJveC5hbmNob3JQb2ludFgsIGFuY2hvclBvaW50WTogYm94LmFuY2hvclBvaW50WSB9O1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBPbmx5IG9uZSBib3ggYWxsb3dlZCBwZXIgaW5zdGFuY2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGlzaW9uQXJyYXlzO1xuICAgIH1cblxuICAgIGhhc1RleHREYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0LnNlZ21lbnRzLmdldCgpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgaGFzSWNvbkRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmljb24uc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBoYXNDb2xsaXNpb25Cb3hEYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsaXNpb25Cb3guc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBoYXNDb2xsaXNpb25DaXJjbGVEYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsaXNpb25DaXJjbGUuc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBzb3J0RmVhdHVyZXMoYW5nbGUgICAgICAgICkge1xuICAgICAgICBpZiAoIXRoaXMuc29ydEZlYXR1cmVzQnlZKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMuc29ydGVkQW5nbGUgPT09IGFuZ2xlKSByZXR1cm47XG4gICAgICAgIHRoaXMuc29ydGVkQW5nbGUgPSBhbmdsZTtcblxuICAgICAgICAvLyBUaGUgY3VycmVudCBhcHByb2FjaCB0byBzb3J0aW5nIGRvZXNuJ3Qgc29ydCBhY3Jvc3Mgc2VnbWVudHMgc28gZG9uJ3QgdHJ5LlxuICAgICAgICAvLyBTb3J0aW5nIHdpdGhpbiBzZWdtZW50cyBzZXBhcmF0ZWx5IHNlZW1lZCBub3QgdG8gYmUgd29ydGggdGhlIGNvbXBsZXhpdHkuXG4gICAgICAgIGlmICh0aGlzLnRleHQuc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMSB8fCB0aGlzLmljb24uc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIElmIHRoZSBzeW1ib2xzIGFyZSBhbGxvd2VkIHRvIG92ZXJsYXAgc29ydCB0aGVtIGJ5IHRoZWlyIHZlcnRpY2FsIHNjcmVlbiBwb3NpdGlvbi5cbiAgICAgICAgLy8gVGhlIGluZGV4IGFycmF5IGJ1ZmZlciBpcyByZXdyaXR0ZW4gdG8gcmVmZXJlbmNlIHRoZSAodW5jaGFuZ2VkKSB2ZXJ0aWNlcyBpbiB0aGVcbiAgICAgICAgLy8gc29ydGVkIG9yZGVyLlxuXG4gICAgICAgIC8vIFRvIGF2b2lkIHNvcnRpbmcgdGhlIGFjdHVhbCBzeW1ib2xJbnN0YW5jZSBhcnJheSB3ZSBzb3J0IGFuIGFycmF5IG9mIGluZGV4ZXMuXG4gICAgICAgIGNvbnN0IHN5bWJvbEluc3RhbmNlSW5kZXhlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzeW1ib2xJbnN0YW5jZUluZGV4ZXMucHVzaChpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgIGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcblxuICAgICAgICBzeW1ib2xJbnN0YW5jZUluZGV4ZXMuc29ydCgoYUluZGV4LCBiSW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSB0aGlzLnN5bWJvbEluc3RhbmNlc1thSW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzW2JJbmRleF07XG4gICAgICAgICAgICBjb25zdCBhUm90YXRlZCA9IChzaW4gKiBhLmFuY2hvci54ICsgY29zICogYS5hbmNob3IueSkgfCAwO1xuICAgICAgICAgICAgY29uc3QgYlJvdGF0ZWQgPSAoc2luICogYi5hbmNob3IueCArIGNvcyAqIGIuYW5jaG9yLnkpIHwgMDtcbiAgICAgICAgICAgIHJldHVybiAoYVJvdGF0ZWQgLSBiUm90YXRlZCkgfHwgKGIuZmVhdHVyZUluZGV4IC0gYS5mZWF0dXJlSW5kZXgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnRleHQuaW5kZXhBcnJheS5jbGVhcigpO1xuICAgICAgICB0aGlzLmljb24uaW5kZXhBcnJheS5jbGVhcigpO1xuXG4gICAgICAgIGZvciAoY29uc3QgaSBvZiBzeW1ib2xJbnN0YW5jZUluZGV4ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluc3RhbmNlID0gdGhpcy5zeW1ib2xJbnN0YW5jZXNbaV07XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcGxhY2VkVGV4dFN5bWJvbEluZGV4IG9mIHN5bWJvbEluc3RhbmNlLnBsYWNlZFRleHRTeW1ib2xJbmRpY2VzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VkU3ltYm9sID0gdGhpcy50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldChwbGFjZWRUZXh0U3ltYm9sSW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSBwbGFjZWRTeW1ib2wudmVydGV4U3RhcnRJbmRleCArIHBsYWNlZFN5bWJvbC5udW1HbHlwaHMgKiA0O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHZlcnRleEluZGV4ID0gcGxhY2VkU3ltYm9sLnZlcnRleFN0YXJ0SW5kZXg7IHZlcnRleEluZGV4IDwgZW5kSW5kZXg7IHZlcnRleEluZGV4ICs9IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0LmluZGV4QXJyYXkuZW1wbGFjZUJhY2sodmVydGV4SW5kZXgsIHZlcnRleEluZGV4ICsgMSwgdmVydGV4SW5kZXggKyAyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0LmluZGV4QXJyYXkuZW1wbGFjZUJhY2sodmVydGV4SW5kZXggKyAxLCB2ZXJ0ZXhJbmRleCArIDIsIHZlcnRleEluZGV4ICsgMyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwbGFjZWRJY29uID0gdGhpcy5pY29uLnBsYWNlZFN5bWJvbEFycmF5LmdldChpKTtcbiAgICAgICAgICAgIGlmIChwbGFjZWRJY29uLm51bUdseXBocykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRleEluZGV4ID0gcGxhY2VkSWNvbi52ZXJ0ZXhTdGFydEluZGV4O1xuICAgICAgICAgICAgICAgIHRoaXMuaWNvbi5pbmRleEFycmF5LmVtcGxhY2VCYWNrKHZlcnRleEluZGV4LCB2ZXJ0ZXhJbmRleCArIDEsIHZlcnRleEluZGV4ICsgMik7XG4gICAgICAgICAgICAgICAgdGhpcy5pY29uLmluZGV4QXJyYXkuZW1wbGFjZUJhY2sodmVydGV4SW5kZXggKyAxLCB2ZXJ0ZXhJbmRleCArIDIsIHZlcnRleEluZGV4ICsgMyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50ZXh0LmluZGV4QnVmZmVyKSB0aGlzLnRleHQuaW5kZXhCdWZmZXIudXBkYXRlRGF0YSh0aGlzLnRleHQuaW5kZXhBcnJheSk7XG4gICAgICAgIGlmICh0aGlzLmljb24uaW5kZXhCdWZmZXIpIHRoaXMuaWNvbi5pbmRleEJ1ZmZlci51cGRhdGVEYXRhKHRoaXMuaWNvbi5pbmRleEFycmF5KTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdTeW1ib2xCdWNrZXQnLCBTeW1ib2xCdWNrZXQsIHtcbiAgICBvbWl0OiBbJ2xheWVycycsICdjb2xsaXNpb25Cb3hBcnJheScsICdmZWF0dXJlcycsICdjb21wYXJlVGV4dCddLFxuICAgIHNoYWxsb3c6IFsnc3ltYm9sSW5zdGFuY2VzJ11cbn0pO1xuXG4vLyB0aGlzIGNvbnN0YW50IGlzIGJhc2VkIG9uIHRoZSBzaXplIG9mIFN0cnVjdEFycmF5IGluZGV4ZXMgdXNlZCBpbiBhIHN5bWJvbFxuLy8gYnVja2V0LS1uYW1lbHksIGdseXBoT2Zmc2V0QXJyYXlTdGFydFxuLy8gZWcgdGhlIG1heCB2YWxpZCBVSW50MTYgaXMgNjUsNTM1XG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzI5MDcgZm9yIG1vdGl2YXRpb25cbi8vIGxpbmVTdGFydEluZGV4IGFuZCB0ZXh0Qm94U3RhcnRJbmRleCBjb3VsZCBwb3RlbnRpYWxseSBiZSBjb25jZXJuc1xuLy8gYnV0IHdlIGV4cGVjdCB0aGVyZSB0byBiZSBtYW55IGZld2VyIGJveGVzL2xpbmVzIHRoYW4gZ2x5cGhzXG5TeW1ib2xCdWNrZXQuTUFYX0dMWVBIUyA9IDY1NTM1O1xuXG5TeW1ib2xCdWNrZXQuYWRkRHluYW1pY0F0dHJpYnV0ZXMgPSBhZGREeW5hbWljQXR0cmlidXRlcztcblxubW9kdWxlLmV4cG9ydHMgPSBTeW1ib2xCdWNrZXQ7XG4iLCIvLyAgICAgIFxuY29uc3Qge1JHQkFJbWFnZX0gPSByZXF1aXJlKCcuLi91dGlsL2ltYWdlJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5jb25zdCB7cmVnaXN0ZXJ9ID0gcmVxdWlyZSgnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJyk7XG5cbmNsYXNzIExldmVsIHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoZGltICAgICAgICAsIGJvcmRlciAgICAgICAgLCBkYXRhICAgICAgICAgICAgICkge1xuICAgICAgICBpZiAoZGltIDw9IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdMZXZlbCBtdXN0IGhhdmUgcG9zaXRpdmUgZGltZW5zaW9uJyk7XG4gICAgICAgIHRoaXMuZGltID0gZGltO1xuICAgICAgICB0aGlzLmJvcmRlciA9IGJvcmRlcjtcbiAgICAgICAgdGhpcy5zdHJpZGUgPSB0aGlzLmRpbSArIDIgKiB0aGlzLmJvcmRlcjtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YSB8fCBuZXcgSW50MzJBcnJheSgodGhpcy5kaW0gKyAyICogdGhpcy5ib3JkZXIpICogKHRoaXMuZGltICsgMiAqIHRoaXMuYm9yZGVyKSk7XG4gICAgfVxuXG4gICAgc2V0KHggICAgICAgICwgeSAgICAgICAgLCB2YWx1ZSAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuZGF0YVt0aGlzLl9pZHgoeCwgeSldID0gdmFsdWUgKyA2NTUzNjtcbiAgICB9XG5cbiAgICBnZXQoeCAgICAgICAgLCB5ICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVt0aGlzLl9pZHgoeCwgeSldIC0gNjU1MzY7XG4gICAgfVxuXG4gICAgX2lkeCh4ICAgICAgICAsIHkgICAgICAgICkge1xuICAgICAgICBpZiAoeCA8IC10aGlzLmJvcmRlciB8fCB4ID49IHRoaXMuZGltICsgdGhpcy5ib3JkZXIgfHwgIHkgPCAtdGhpcy5ib3JkZXIgfHwgeSA+PSB0aGlzLmRpbSArIHRoaXMuYm9yZGVyKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIHNvdXJjZSBjb29yZGluYXRlcyBmb3IgREVNIGRhdGEnKTtcbiAgICAgICAgcmV0dXJuICh5ICsgdGhpcy5ib3JkZXIpICogdGhpcy5zdHJpZGUgKyAoeCArIHRoaXMuYm9yZGVyKTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdMZXZlbCcsIExldmVsKTtcblxuLy8gREVNRGF0YSBpcyBhIGRhdGEgc3RydWN0dXJlIGZvciBkZWNvZGluZywgYmFja2ZpbGxpbmcsIGFuZCBzdG9yaW5nIGVsZXZhdGlvbiBkYXRhIGZvciBwcm9jZXNzaW5nIGluIHRoZSBoaWxsc2hhZGUgc2hhZGVyc1xuLy8gZGF0YSBjYW4gYmUgcG9wdWxhdGVkIGVpdGhlciBmcm9tIGEgcG5ncmF3IGltYWdlIHRpbGUgb3IgZnJvbSBzZXJsaWF6ZWQgZGF0YSBzZW50IGJhY2sgZnJvbSBhIHdvcmtlci4gV2hlbiBkYXRhIGlzIGluaXRpYWxseVxuLy8gbG9hZGVkIGZyb20gYSBpbWFnZSB0aWxlLCB3ZSBkZWNvZGUgdGhlIHBpeGVsIHZhbHVlcyB1c2luZyB0aGUgbWFwYm94IHRlcnJhaW4tcmdiIHRpbGVzZXQgZGVjb2RpbmcgZm9ybXVsYSwgYnV0IHdlIHN0b3JlIHRoZVxuLy8gZWxldmF0aW9uIGRhdGEgaW4gYSBMZXZlbCBhcyBhbiBJbnQzMiB2YWx1ZS4gd2UgYWRkIDY1NTM2ICgyXjE2KSB0byBlbGltaW5hdGUgbmVnYXRpdmUgdmFsdWVzIGFuZCBlbmFibGUgdGhlIHVzZSBvZlxuLy8gaW50ZWdlciBvdmVyZmxvdyB3aGVuIGNyZWF0aW5nIHRoZSB0ZXh0dXJlIHVzZWQgaW4gdGhlIGhpbGxzaGFkZVByZXBhcmUgc3RlcC5cblxuLy8gREVNRGF0YSBhbHNvIGhhbmRsZXMgdGhlIGJhY2tmaWxsaW5nIG9mIGRhdGEgZnJvbSBhIHRpbGUncyBuZWlnaGJvcmluZyB0aWxlcy4gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSB1c2UgYSBwaXhlbCdzIDhcbi8vIHN1cnJvdW5kaW5nIHBpeGVsIHZhbHVlcyB0byBjb21wdXRlIHRoZSBzbG9wZSBhdCB0aGF0IHBpeGVsLCBhbmQgd2UgY2Fubm90IGFjY3VyYXRlbHkgY2FsY3VsYXRlIHRoZSBzbG9wZSBhdCBwaXhlbHMgb24gYVxuLy8gdGlsZSdzIGVkZ2Ugd2l0aG91dCBiYWNrZmlsbGluZyBmcm9tIG5laWdoYm9yaW5nIHRpbGVzLlxuXG5jbGFzcyBERU1EYXRhIHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcih1aWQgICAgICAgICwgc2NhbGUgICAgICAgICAsIGRhdGEgICAgICAgICkge1xuICAgICAgICB0aGlzLnVpZCA9IHVpZDtcbiAgICAgICAgdGhpcy5zY2FsZSA9IHNjYWxlIHx8IDE7XG4gICAgICAgIC8vIGlmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHVzZSBhIHRlbXBvcmFyeSBlbXB0eSBsZXZlbCB0byBzYXRpc2Z5IGZsb3dcbiAgICAgICAgdGhpcy5sZXZlbCA9IGRhdGEgfHwgbmV3IExldmVsKDI1NiwgNTEyKTtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSAhIWRhdGE7XG4gICAgfVxuXG4gICAgbG9hZEZyb21JbWFnZShkYXRhICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKGRhdGEuaGVpZ2h0ICE9PSBkYXRhLndpZHRoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignREVNIHRpbGVzIG11c3QgYmUgc3F1YXJlJyk7XG5cbiAgICAgICAgLy8gQnVpbGQgbGV2ZWwgMFxuICAgICAgICBjb25zdCBsZXZlbCA9IHRoaXMubGV2ZWwgPSBuZXcgTGV2ZWwoZGF0YS53aWR0aCwgZGF0YS53aWR0aCAvIDIpO1xuICAgICAgICBjb25zdCBwaXhlbHMgPSBkYXRhLmRhdGE7XG5cbiAgICAgICAgLy8gdW5wYWNrXG4gICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgbGV2ZWwuZGltOyB5KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgbGV2ZWwuZGltOyB4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpID0geSAqIGxldmVsLmRpbSArIHg7XG4gICAgICAgICAgICAgICAgY29uc3QgaiA9IGkgKiA0O1xuICAgICAgICAgICAgICAgIC8vIGRlY29kaW5nIHBlciBodHRwczovL2Jsb2cubWFwYm94LmNvbS9nbG9iYWwtZWxldmF0aW9uLWRhdGEtNjY4OWYxZDBiYTY1XG4gICAgICAgICAgICAgICAgbGV2ZWwuc2V0KHgsIHksIHRoaXMuc2NhbGUgKiAoKHBpeGVsc1tqXSAqIDI1NiAqIDI1NiArIHBpeGVsc1tqICsgMV0gKiAyNTYuMCArIHBpeGVsc1tqICsgMl0pIC8gMTAuMCAtIDEwMDAwLjApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGluIG9yZGVyIHRvIGF2b2lkIGZsYXNoaW5nIHNlYW1zIGJldHdlZW4gdGlsZXMsIGhlcmUgd2UgYXJlIGluaXRpYWxseSBwb3B1bGF0aW5nIGEgMXB4IGJvcmRlciBvZiBwaXhlbHMgYXJvdW5kIHRoZSBpbWFnZVxuICAgICAgICAvLyB3aXRoIHRoZSBkYXRhIG9mIHRoZSBuZWFyZXN0IHBpeGVsIGZyb20gdGhlIGltYWdlLiB0aGlzIGRhdGEgaXMgZXZlbnR1YWxseSByZXBsYWNlZCB3aGVuIHRoZSB0aWxlJ3MgbmVpZ2hib3JpbmdcbiAgICAgICAgLy8gdGlsZXMgYXJlIGxvYWRlZCBhbmQgdGhlIGFjY3VyYXRlIGRhdGEgY2FuIGJlIGJhY2tmaWxsZWQgdXNpbmcgREVNRGF0YSNiYWNrZmlsbEJvcmRlclxuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGxldmVsLmRpbTsgeCsrKSB7XG4gICAgICAgICAgICAvLyBsZWZ0IHZlcnRpY2FsIGJvcmRlclxuICAgICAgICAgICAgbGV2ZWwuc2V0KC0xLCB4LCBsZXZlbC5nZXQoMCwgeCkpO1xuICAgICAgICAgICAgLy8gcmlnaHQgdmVydGljYWwgYm9yZGVyXG4gICAgICAgICAgICBsZXZlbC5zZXQobGV2ZWwuZGltLCB4LCBsZXZlbC5nZXQobGV2ZWwuZGltIC0gMSwgeCkpO1xuICAgICAgICAgICAgLy8gbGVmdCBob3Jpem9udGFsIGJvcmRlclxuICAgICAgICAgICAgbGV2ZWwuc2V0KHgsIC0xLCBsZXZlbC5nZXQoeCwgMCkpO1xuICAgICAgICAgICAgLy8gcmlnaHQgaG9yaXpvbnRhbCBib3JkZXJcbiAgICAgICAgICAgIGxldmVsLnNldCh4LCBsZXZlbC5kaW0sIGxldmVsLmdldCh4LCBsZXZlbC5kaW0gLSAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29ybmVyc1xuICAgICAgICBsZXZlbC5zZXQoLTEsIC0xLCBsZXZlbC5nZXQoMCwgMCkpO1xuICAgICAgICBsZXZlbC5zZXQobGV2ZWwuZGltLCAtMSwgbGV2ZWwuZ2V0KGxldmVsLmRpbSAtIDEsIDApKTtcbiAgICAgICAgbGV2ZWwuc2V0KC0xLCBsZXZlbC5kaW0sIGxldmVsLmdldCgwLCBsZXZlbC5kaW0gLSAxKSk7XG4gICAgICAgIGxldmVsLnNldChsZXZlbC5kaW0sIGxldmVsLmRpbSwgbGV2ZWwuZ2V0KGxldmVsLmRpbSAtIDEsIGxldmVsLmRpbSAtIDEpKTtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGdldFBpeGVscygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSR0JBSW1hZ2Uoe3dpZHRoOiB0aGlzLmxldmVsLmRpbSArIDIgKiB0aGlzLmxldmVsLmJvcmRlciwgaGVpZ2h0OiB0aGlzLmxldmVsLmRpbSArIDIgKiB0aGlzLmxldmVsLmJvcmRlcn0sIG5ldyBVaW50OEFycmF5KHRoaXMubGV2ZWwuZGF0YS5idWZmZXIpKTtcbiAgICB9XG5cbiAgICBiYWNrZmlsbEJvcmRlcihib3JkZXJUaWxlICAgICAgICAgLCBkeCAgICAgICAgLCBkeSAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmxldmVsO1xuICAgICAgICBjb25zdCBvID0gYm9yZGVyVGlsZS5sZXZlbDtcblxuICAgICAgICBpZiAodC5kaW0gIT09IG8uZGltKSB0aHJvdyBuZXcgRXJyb3IoJ2xldmVsIG1pc21hdGNoIChkZW0gZGltZW5zaW9uKScpO1xuXG4gICAgICAgIGxldCBfeE1pbiA9IGR4ICogdC5kaW0sXG4gICAgICAgICAgICBfeE1heCA9IGR4ICogdC5kaW0gKyB0LmRpbSxcbiAgICAgICAgICAgIF95TWluID0gZHkgKiB0LmRpbSxcbiAgICAgICAgICAgIF95TWF4ID0gZHkgKiB0LmRpbSArIHQuZGltO1xuXG4gICAgICAgIHN3aXRjaCAoZHgpIHtcbiAgICAgICAgY2FzZSAtMTpcbiAgICAgICAgICAgIF94TWluID0gX3hNYXggLSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIF94TWF4ID0gX3hNaW4gKyAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGR5KSB7XG4gICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgICBfeU1pbiA9IF95TWF4IC0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBfeU1heCA9IF95TWluICsgMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeE1pbiA9IHV0aWwuY2xhbXAoX3hNaW4sIC10LmJvcmRlciwgdC5kaW0gKyB0LmJvcmRlcik7XG4gICAgICAgIGNvbnN0IHhNYXggPSB1dGlsLmNsYW1wKF94TWF4LCAtdC5ib3JkZXIsIHQuZGltICsgdC5ib3JkZXIpO1xuICAgICAgICBjb25zdCB5TWluID0gdXRpbC5jbGFtcChfeU1pbiwgLXQuYm9yZGVyLCB0LmRpbSArIHQuYm9yZGVyKTtcbiAgICAgICAgY29uc3QgeU1heCA9IHV0aWwuY2xhbXAoX3lNYXgsIC10LmJvcmRlciwgdC5kaW0gKyB0LmJvcmRlcik7XG5cbiAgICAgICAgY29uc3Qgb3ggPSAtZHggKiB0LmRpbTtcbiAgICAgICAgY29uc3Qgb3kgPSAtZHkgKiB0LmRpbTtcbiAgICAgICAgZm9yIChsZXQgeSA9IHlNaW47IHkgPCB5TWF4OyB5KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHggPSB4TWluOyB4IDwgeE1heDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgdC5zZXQoeCwgeSwgby5nZXQoeCArIG94LCB5ICsgb3kpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0RFTURhdGEnLCBERU1EYXRhKTtcbm1vZHVsZS5leHBvcnRzID0ge0RFTURhdGEsIExldmVsfTtcblxuIiwiLy8gICAgICBcblxuLyoqXG4gKiBUaGUgbWF4aW11bSB2YWx1ZSBvZiBhIGNvb3JkaW5hdGUgaW4gdGhlIGludGVybmFsIHRpbGUgY29vcmRpbmF0ZSBzeXN0ZW0uIENvb3JkaW5hdGVzIG9mXG4gKiBhbGwgc291cmNlIGZlYXR1cmVzIG5vcm1hbGl6ZWQgdG8gdGhpcyBleHRlbnQgdXBvbiBsb2FkLlxuICpcbiAqIFRoZSB2YWx1ZSBpcyBhIGNvbnNlcXVlbmNlIG9mIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogKiBWZXJ0ZXggYnVmZmVyIHN0b3JlIHBvc2l0aW9ucyBhcyBzaWduZWQgMTYgYml0IGludGVnZXJzLlxuICogKiBPbmUgYml0IGlzIGxvc3QgZm9yIHNpZ25lZG5lc3MgdG8gc3VwcG9ydCB0aWxlIGJ1ZmZlcnMuXG4gKiAqIE9uZSBiaXQgaXMgbG9zdCBiZWNhdXNlIHRoZSBsaW5lIHZlcnRleCBidWZmZXIgdXNlZCB0byBwYWNrIDEgYml0IG9mIG90aGVyIGRhdGEgaW50byB0aGUgaW50LlxuICogICBUaGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZSBidXQgd2UncmUgcmVzZXJ2aW5nIHRoaXMgYml0IGFueXdheS5cbiAqICogT25lIGJpdCBpcyBsb3N0IHRvIHN1cHBvcnQgZmVhdHVyZXMgZXh0ZW5kaW5nIHBhc3QgdGhlIGV4dGVudCBvbiB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgdGlsZS5cbiAqICogVGhpcyBsZWF2ZXMgdXMgd2l0aCAyXjEzID0gODE5MlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcmVhZG9ubHlcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSA4MTkyO1xuIiwiLy8gICAgICBcblxuY29uc3QgUG9pbnQgPSByZXF1aXJlKCdAbWFwYm94L3BvaW50LWdlb21ldHJ5Jyk7XG5jb25zdCBsb2FkR2VvbWV0cnkgPSByZXF1aXJlKCcuL2xvYWRfZ2VvbWV0cnknKTtcbmNvbnN0IEVYVEVOVCA9IHJlcXVpcmUoJy4vZXh0ZW50Jyk7XG5jb25zdCBmZWF0dXJlRmlsdGVyID0gcmVxdWlyZSgnLi4vc3R5bGUtc3BlYy9mZWF0dXJlX2ZpbHRlcicpO1xuY29uc3QgR3JpZCA9IHJlcXVpcmUoJ2dyaWQtaW5kZXgnKTtcbmNvbnN0IERpY3Rpb25hcnlDb2RlciA9IHJlcXVpcmUoJy4uL3V0aWwvZGljdGlvbmFyeV9jb2RlcicpO1xuY29uc3QgdnQgPSByZXF1aXJlKCdAbWFwYm94L3ZlY3Rvci10aWxlJyk7XG5jb25zdCBQcm90b2J1ZiA9IHJlcXVpcmUoJ3BiZicpO1xuY29uc3QgR2VvSlNPTkZlYXR1cmUgPSByZXF1aXJlKCcuLi91dGlsL3ZlY3RvcnRpbGVfdG9fZ2VvanNvbicpO1xuY29uc3QgYXJyYXlzSW50ZXJzZWN0ID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJykuYXJyYXlzSW50ZXJzZWN0O1xuY29uc3Qge092ZXJzY2FsZWRUaWxlSUR9ID0gcmVxdWlyZSgnLi4vc291cmNlL3RpbGVfaWQnKTtcbmNvbnN0IHtyZWdpc3Rlcn0gPSByZXF1aXJlKCcuLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXInKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNvbnN0IHtGZWF0dXJlSW5kZXhBcnJheX0gPSByZXF1aXJlKCcuL2FycmF5X3R5cGVzJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gXG5cbmNsYXNzIEZlYXR1cmVJbmRleCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcih0aWxlSUQgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgb3ZlcnNjYWxpbmcgICAgICAgICxcbiAgICAgICAgICAgICAgICBncmlkICAgICAgICxcbiAgICAgICAgICAgICAgICBmZWF0dXJlSW5kZXhBcnJheSAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMudGlsZUlEID0gdGlsZUlEO1xuICAgICAgICB0aGlzLm92ZXJzY2FsaW5nID0gb3ZlcnNjYWxpbmc7XG4gICAgICAgIHRoaXMueCA9IHRpbGVJRC5jYW5vbmljYWwueDtcbiAgICAgICAgdGhpcy55ID0gdGlsZUlELmNhbm9uaWNhbC55O1xuICAgICAgICB0aGlzLnogPSB0aWxlSUQuY2Fub25pY2FsLno7XG4gICAgICAgIHRoaXMuZ3JpZCA9IGdyaWQgfHwgbmV3IEdyaWQoRVhURU5ULCAxNiwgMCk7XG4gICAgICAgIHRoaXMuZmVhdHVyZUluZGV4QXJyYXkgPSBmZWF0dXJlSW5kZXhBcnJheSB8fCBuZXcgRmVhdHVyZUluZGV4QXJyYXkoKTtcbiAgICB9XG5cbiAgICBpbnNlcnQoZmVhdHVyZSAgICAgICAgICAgICAgICAgICAsIGdlb21ldHJ5ICAgICAgICAgICAgICAgICAgICAgLCBmZWF0dXJlSW5kZXggICAgICAgICwgc291cmNlTGF5ZXJJbmRleCAgICAgICAgLCBidWNrZXRJbmRleCAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZmVhdHVyZUluZGV4QXJyYXkubGVuZ3RoO1xuICAgICAgICB0aGlzLmZlYXR1cmVJbmRleEFycmF5LmVtcGxhY2VCYWNrKGZlYXR1cmVJbmRleCwgc291cmNlTGF5ZXJJbmRleCwgYnVja2V0SW5kZXgpO1xuXG4gICAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgZ2VvbWV0cnkubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJpbmcgPSBnZW9tZXRyeVtyXTtcblxuICAgICAgICAgICAgY29uc3QgYmJveCA9IFtJbmZpbml0eSwgSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5XTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHAgPSByaW5nW2ldO1xuICAgICAgICAgICAgICAgIGJib3hbMF0gPSBNYXRoLm1pbihiYm94WzBdLCBwLngpO1xuICAgICAgICAgICAgICAgIGJib3hbMV0gPSBNYXRoLm1pbihiYm94WzFdLCBwLnkpO1xuICAgICAgICAgICAgICAgIGJib3hbMl0gPSBNYXRoLm1heChiYm94WzJdLCBwLngpO1xuICAgICAgICAgICAgICAgIGJib3hbM10gPSBNYXRoLm1heChiYm94WzNdLCBwLnkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmdyaWQuaW5zZXJ0KGtleSwgYmJveFswXSwgYmJveFsxXSwgYmJveFsyXSwgYmJveFszXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaW5kcyBmZWF0dXJlcyBpbiB0aGlzIHRpbGUgYXQgYSBwYXJ0aWN1bGFyIHBvc2l0aW9uLlxuICAgIHF1ZXJ5KGFyZ3MgICAgICAgICAgICAgICAgICwgc3R5bGVMYXllcnMgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKCF0aGlzLnZ0TGF5ZXJzKSB7XG4gICAgICAgICAgICB0aGlzLnZ0TGF5ZXJzID0gbmV3IHZ0LlZlY3RvclRpbGUobmV3IFByb3RvYnVmKHRoaXMucmF3VGlsZURhdGEpKS5sYXllcnM7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUxheWVyQ29kZXIgPSBuZXcgRGljdGlvbmFyeUNvZGVyKHRoaXMudnRMYXllcnMgPyBPYmplY3Qua2V5cyh0aGlzLnZ0TGF5ZXJzKS5zb3J0KCkgOiBbJ19nZW9qc29uVGlsZUxheWVyJ10pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0gYXJncy5wYXJhbXMgfHwge30sXG4gICAgICAgICAgICBwaXhlbHNUb1RpbGVVbml0cyA9IEVYVEVOVCAvIGFyZ3MudGlsZVNpemUgLyBhcmdzLnNjYWxlLFxuICAgICAgICAgICAgZmlsdGVyID0gZmVhdHVyZUZpbHRlcihwYXJhbXMuZmlsdGVyKTtcblxuICAgICAgICBjb25zdCBxdWVyeUdlb21ldHJ5ID0gYXJncy5xdWVyeUdlb21ldHJ5O1xuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmFkaXVzID0gYXJncy5hZGRpdGlvbmFsUmFkaXVzICogcGl4ZWxzVG9UaWxlVW5pdHM7XG5cbiAgICAgICAgbGV0IG1pblggPSBJbmZpbml0eTtcbiAgICAgICAgbGV0IG1pblkgPSBJbmZpbml0eTtcbiAgICAgICAgbGV0IG1heFggPSAtSW5maW5pdHk7XG4gICAgICAgIGxldCBtYXhZID0gLUluZmluaXR5O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXJ5R2VvbWV0cnkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJpbmcgPSBxdWVyeUdlb21ldHJ5W2ldO1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCByaW5nLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcCA9IHJpbmdba107XG4gICAgICAgICAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIHAueCk7XG4gICAgICAgICAgICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIHAueSk7XG4gICAgICAgICAgICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHAueCk7XG4gICAgICAgICAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHAueSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXRjaGluZyA9IHRoaXMuZ3JpZC5xdWVyeShtaW5YIC0gYWRkaXRpb25hbFJhZGl1cywgbWluWSAtIGFkZGl0aW9uYWxSYWRpdXMsIG1heFggKyBhZGRpdGlvbmFsUmFkaXVzLCBtYXhZICsgYWRkaXRpb25hbFJhZGl1cyk7XG4gICAgICAgIG1hdGNoaW5nLnNvcnQodG9wRG93bkZlYXR1cmVDb21wYXJhdG9yKTtcbiAgICAgICAgdGhpcy5maWx0ZXJNYXRjaGluZyhyZXN1bHQsIG1hdGNoaW5nLCB0aGlzLmZlYXR1cmVJbmRleEFycmF5LCBxdWVyeUdlb21ldHJ5LCBmaWx0ZXIsIHBhcmFtcy5sYXllcnMsIHN0eWxlTGF5ZXJzLCBhcmdzLmJlYXJpbmcsIHBpeGVsc1RvVGlsZVVuaXRzKTtcblxuICAgICAgICBjb25zdCBtYXRjaGluZ1N5bWJvbHMgPSBhcmdzLmNvbGxpc2lvbkluZGV4ID9cbiAgICAgICAgICAgIGFyZ3MuY29sbGlzaW9uSW5kZXgucXVlcnlSZW5kZXJlZFN5bWJvbHMocXVlcnlHZW9tZXRyeSwgdGhpcy50aWxlSUQsIEVYVEVOVCAvIGFyZ3MudGlsZVNpemUsIGFyZ3MuY29sbGlzaW9uQm94QXJyYXksIGFyZ3Muc291cmNlSUQsIGFyZ3MuYnVja2V0SW5zdGFuY2VJZHMpIDpcbiAgICAgICAgICAgIFtdO1xuICAgICAgICBtYXRjaGluZ1N5bWJvbHMuc29ydCgpO1xuICAgICAgICB0aGlzLmZpbHRlck1hdGNoaW5nKHJlc3VsdCwgbWF0Y2hpbmdTeW1ib2xzLCBhcmdzLmNvbGxpc2lvbkJveEFycmF5LCBxdWVyeUdlb21ldHJ5LCBmaWx0ZXIsIHBhcmFtcy5sYXllcnMsIHN0eWxlTGF5ZXJzLCBhcmdzLmJlYXJpbmcsIHBpeGVsc1RvVGlsZVVuaXRzKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZpbHRlck1hdGNoaW5nKFxuICAgICAgICByZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICBtYXRjaGluZyAgICAgICAgICAgICxcbiAgICAgICAgYXJyYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgIHF1ZXJ5R2VvbWV0cnkgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgIGZpbHRlciAgICAgICAgICAgICAgICxcbiAgICAgICAgZmlsdGVyTGF5ZXJJRHMgICAgICAgICAgICAgICAsXG4gICAgICAgIHN0eWxlTGF5ZXJzICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICBiZWFyaW5nICAgICAgICAsXG4gICAgICAgIHBpeGVsc1RvVGlsZVVuaXRzICAgICAgICBcbiAgICApIHtcbiAgICAgICAgbGV0IHByZXZpb3VzSW5kZXg7XG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbWF0Y2hpbmcubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gbWF0Y2hpbmdba107XG5cbiAgICAgICAgICAgIC8vIGRvbid0IGNoZWNrIHRoZSBzYW1lIGZlYXR1cmUgbW9yZSB0aGFuIG9uY2VcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gcHJldmlvdXNJbmRleCkgY29udGludWU7XG4gICAgICAgICAgICBwcmV2aW91c0luZGV4ID0gaW5kZXg7XG5cbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gYXJyYXkuZ2V0KGluZGV4KTtcblxuICAgICAgICAgICAgY29uc3QgbGF5ZXJJRHMgPSB0aGlzLmJ1Y2tldExheWVySURzW21hdGNoLmJ1Y2tldEluZGV4XTtcbiAgICAgICAgICAgIGlmIChmaWx0ZXJMYXllcklEcyAmJiAhYXJyYXlzSW50ZXJzZWN0KGZpbHRlckxheWVySURzLCBsYXllcklEcykpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VMYXllck5hbWUgPSB0aGlzLnNvdXJjZUxheWVyQ29kZXIuZGVjb2RlKG1hdGNoLnNvdXJjZUxheWVySW5kZXgpO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSB0aGlzLnZ0TGF5ZXJzW3NvdXJjZUxheWVyTmFtZV07XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gc291cmNlTGF5ZXIuZmVhdHVyZShtYXRjaC5mZWF0dXJlSW5kZXgpO1xuXG4gICAgICAgICAgICBpZiAoIWZpbHRlcih7em9vbTogdGhpcy50aWxlSUQub3ZlcnNjYWxlZFp9LCBmZWF0dXJlKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGxldCBnZW9tZXRyeSA9IG51bGw7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGwgPSAwOyBsIDwgbGF5ZXJJRHMubGVuZ3RoOyBsKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXllcklEID0gbGF5ZXJJRHNbbF07XG5cbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyTGF5ZXJJRHMgJiYgZmlsdGVyTGF5ZXJJRHMuaW5kZXhPZihsYXllcklEKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVMYXllciA9IHN0eWxlTGF5ZXJzW2xheWVySURdO1xuICAgICAgICAgICAgICAgIGlmICghc3R5bGVMYXllcikgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3R5bGVMYXllci50eXBlICE9PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBhbGwgc3ltYm9scyBhbHJlYWR5IG1hdGNoIHRoZSBzdHlsZVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWdlb21ldHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IGxvYWRHZW9tZXRyeShmZWF0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXN0eWxlTGF5ZXIucXVlcnlJbnRlcnNlY3RzRmVhdHVyZShxdWVyeUdlb21ldHJ5LCBmZWF0dXJlLCBnZW9tZXRyeSwgdGhpcy56LCBiZWFyaW5nLCBwaXhlbHNUb1RpbGVVbml0cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZ2VvanNvbkZlYXR1cmUgPSBuZXcgR2VvSlNPTkZlYXR1cmUoZmVhdHVyZSwgdGhpcy56LCB0aGlzLngsIHRoaXMueSk7XG4gICAgICAgICAgICAgICAgKGdlb2pzb25GZWF0dXJlICAgICApLmxheWVyID0gc3R5bGVMYXllci5zZXJpYWxpemUoKTtcbiAgICAgICAgICAgICAgICBsZXQgbGF5ZXJSZXN1bHQgPSByZXN1bHRbbGF5ZXJJRF07XG4gICAgICAgICAgICAgICAgaWYgKGxheWVyUmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJSZXN1bHQgPSByZXN1bHRbbGF5ZXJJRF0gPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGF5ZXJSZXN1bHQucHVzaCh7IGZlYXR1cmVJbmRleDogaW5kZXgsIGZlYXR1cmU6IGdlb2pzb25GZWF0dXJlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFzTGF5ZXIoaWQgICAgICAgICkge1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVySURzIG9mIHRoaXMuYnVja2V0TGF5ZXJJRHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXJJRCBvZiBsYXllcklEcykge1xuICAgICAgICAgICAgICAgIGlmIChpZCA9PT0gbGF5ZXJJRCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5yZWdpc3RlcihcbiAgICAnRmVhdHVyZUluZGV4JyxcbiAgICBGZWF0dXJlSW5kZXgsXG4gICAgeyBvbWl0OiBbJ3Jhd1RpbGVEYXRhJywgJ3NvdXJjZUxheWVyQ29kZXInXSB9XG4pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZlYXR1cmVJbmRleDtcblxuZnVuY3Rpb24gdG9wRG93bkZlYXR1cmVDb21wYXJhdG9yKGEsIGIpIHtcbiAgICByZXR1cm4gYiAtIGE7XG59XG4iLCIvLyAgICAgIFxuXG4vKipcbiAqIEFuIGluZGV4IGFycmF5IHN0b3JlcyBVaW50MTYgaW5kaWNpZXMgb2YgdmVydGV4ZXMgaW4gYSBjb3JyZXNwb25kaW5nIHZlcnRleCBhcnJheS4gV2UgdXNlXG4gKiB0d28ga2luZHMgb2YgaW5kZXggYXJyYXlzOiBhcnJheXMgc3RvcmluZyBncm91cHMgb2YgdGhyZWUgaW5kaWNpZXMsIGZvcm1pbmcgdHJpYW5nbGVzOyBhbmRcbiAqIGFycmF5cyBzdG9yaW5nIHBhaXJzIG9mIGluZGljaWVzLCBmb3JtaW5nIGxpbmUgc2VnbWVudHMuXG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBMaW5lSW5kZXhBcnJheTogcmVxdWlyZSgnLi9hcnJheV90eXBlcycpLkxpbmVJbmRleEFycmF5LFxuICAgIFRyaWFuZ2xlSW5kZXhBcnJheTogcmVxdWlyZSgnLi9hcnJheV90eXBlcycpLlRyaWFuZ2xlSW5kZXhBcnJheVxufTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbmNvbnN0IEVYVEVOVCA9IHJlcXVpcmUoJy4vZXh0ZW50Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4vLyBUaGVzZSBib3VuZHMgZGVmaW5lIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHN1cHBvcnRlZCBjb29yZGluYXRlIHZhbHVlcy5cbi8vIFdoaWxlIHZpc2libGUgY29vcmRpbmF0ZXMgYXJlIHdpdGhpbiBbMCwgRVhURU5UXSwgdGlsZXMgbWF5IHRoZW9yZXRpY2FsbHlcbi8vIGNvbnRhaW4gY29yZGluYXRlcyB3aXRoaW4gWy1JbmZpbml0eSwgSW5maW5pdHldLiBPdXIgcmFuZ2UgaXMgbGltaXRlZCBieSB0aGVcbi8vIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb29yZGluYXRlLlxuZnVuY3Rpb24gY3JlYXRlQm91bmRzKGJpdHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBtaW46IC0xICogTWF0aC5wb3coMiwgYml0cyAtIDEpLFxuICAgICAgICBtYXg6IE1hdGgucG93KDIsIGJpdHMgLSAxKSAtIDFcbiAgICB9O1xufVxuXG5jb25zdCBib3VuZHMgPSBjcmVhdGVCb3VuZHMoMTYpO1xuXG4vKipcbiAqIExvYWRzIGEgZ2VvbWV0cnkgZnJvbSBhIFZlY3RvclRpbGVGZWF0dXJlIGFuZCBzY2FsZXMgaXQgdG8gdGhlIGNvbW1vbiBleHRlbnRcbiAqIHVzZWQgaW50ZXJuYWxseS5cbiAqIEBwYXJhbSB7VmVjdG9yVGlsZUZlYXR1cmV9IGZlYXR1cmVcbiAqIEBwcml2YXRlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbG9hZEdlb21ldHJ5KGZlYXR1cmUgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgY29uc3Qgc2NhbGUgPSBFWFRFTlQgLyBmZWF0dXJlLmV4dGVudDtcbiAgICBjb25zdCBnZW9tZXRyeSA9IGZlYXR1cmUubG9hZEdlb21ldHJ5KCk7XG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCBnZW9tZXRyeS5sZW5ndGg7IHIrKykge1xuICAgICAgICBjb25zdCByaW5nID0gZ2VvbWV0cnlbcl07XG4gICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgcmluZy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgY29uc3QgcG9pbnQgPSByaW5nW3BdO1xuICAgICAgICAgICAgLy8gcm91bmQgaGVyZSBiZWNhdXNlIG1hcGJveC1nbC1uYXRpdmUgdXNlcyBpbnRlZ2VycyB0byByZXByZXNlbnRcbiAgICAgICAgICAgIC8vIHBvaW50cyBhbmQgd2UgbmVlZCB0byBkbyB0aGUgc2FtZSB0byBhdm9pZCByZW5lcmluZyBkaWZmZXJlbmNlcy5cbiAgICAgICAgICAgIHBvaW50LnggPSBNYXRoLnJvdW5kKHBvaW50LnggKiBzY2FsZSk7XG4gICAgICAgICAgICBwb2ludC55ID0gTWF0aC5yb3VuZChwb2ludC55ICogc2NhbGUpO1xuXG4gICAgICAgICAgICBpZiAocG9pbnQueCA8IGJvdW5kcy5taW4gfHwgcG9pbnQueCA+IGJvdW5kcy5tYXggfHwgcG9pbnQueSA8IGJvdW5kcy5taW4gfHwgcG9pbnQueSA+IGJvdW5kcy5tYXgpIHtcbiAgICAgICAgICAgICAgICB1dGlsLndhcm5PbmNlKCdHZW9tZXRyeSBleGNlZWRzIGFsbG93ZWQgZXh0ZW50LCByZWR1Y2UgeW91ciB2ZWN0b3IgdGlsZSBidWZmZXIgc2l6ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZW9tZXRyeTtcbn07XG4iLCIvLyAgICAgIFxuY29uc3Qge2NyZWF0ZUxheW91dH0gPSByZXF1aXJlKCcuLi91dGlsL3N0cnVjdF9hcnJheScpO1xubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHsgbmFtZTogJ2FfcG9zJywgdHlwZTogJ0ludDE2JywgY29tcG9uZW50czogMiB9XG5dKTtcbiIsIi8vICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jb25zdCBwYWNrVWludDhUb0Zsb2F0ID0gcmVxdWlyZSgnLi4vc2hhZGVycy9lbmNvZGVfYXR0cmlidXRlJykucGFja1VpbnQ4VG9GbG9hdDtcbmNvbnN0IENvbG9yID0gcmVxdWlyZSgnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yJyk7XG5jb25zdCB7cmVnaXN0ZXJ9ID0gcmVxdWlyZSgnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJyk7XG5jb25zdCB7UG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlfSA9IHJlcXVpcmUoJy4uL3N0eWxlL3Byb3BlcnRpZXMnKTtcbmNvbnN0IHtcbiAgICBTdHJ1Y3RBcnJheUxheW91dDFmNCxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJmOCxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDRmMTZcbn0gPSByZXF1aXJlKCcuL2FycmF5X3R5cGVzJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuZnVuY3Rpb24gcGFja0NvbG9yKGNvbG9yICAgICAgICkgICAgICAgICAgICAgICAgICAge1xuICAgIHJldHVybiBbXG4gICAgICAgIHBhY2tVaW50OFRvRmxvYXQoMjU1ICogY29sb3IuciwgMjU1ICogY29sb3IuZyksXG4gICAgICAgIHBhY2tVaW50OFRvRmxvYXQoMjU1ICogY29sb3IuYiwgMjU1ICogY29sb3IuYSlcbiAgICBdO1xufVxuXG4vKipcbiAqICBgQmluZGVyYCBpcyB0aGUgaW50ZXJmYWNlIGRlZmluaXRpb24gZm9yIHRoZSBzdHJhdGVnaWVzIGZvciBjb25zdHJ1Y3RpbmcsXG4gKiAgdXBsb2FkaW5nLCBhbmQgYmluZGluZyBwYWludCBwcm9wZXJ0eSBkYXRhIGFzIEdMU0wgYXR0cmlidXRlcy5cbiAqXG4gKiAgSXQgaGFzIHRocmVlIGltcGxlbWVudGF0aW9ucywgb25lIGZvciBlYWNoIG9mIHRoZSB0aHJlZSBzdHJhdGVnaWVzIHdlIHVzZTpcbiAqXG4gKiAgKiBGb3IgX2NvbnN0YW50XyBwcm9wZXJ0aWVzIC0tIHRob3NlIHdob3NlIHZhbHVlIGlzIGEgY29uc3RhbnQsIG9yIHRoZSBjb25zdGFudFxuICogICAgcmVzdWx0IG9mIGV2YWx1YXRpbmcgYSBjYW1lcmEgZXhwcmVzc2lvbiBhdCBhIHBhcnRpY3VsYXIgY2FtZXJhIHBvc2l0aW9uIC0tIHdlXG4gKiAgICBkb24ndCBuZWVkIGEgdmVydGV4IGJ1ZmZlciwgYW5kIGluc3RlYWQgdXNlIGEgdW5pZm9ybS5cbiAqICAqIEZvciBkYXRhIGV4cHJlc3Npb25zLCB3ZSB1c2UgYSB2ZXJ0ZXggYnVmZmVyIHdpdGggYSBzaW5nbGUgYXR0cmlidXRlIHZhbHVlLFxuICogICAgdGhlIGV2YWx1YXRlZCByZXN1bHQgb2YgdGhlIHNvdXJjZSBmdW5jdGlvbiBmb3IgdGhlIGdpdmVuIGZlYXR1cmUuXG4gKiAgKiBGb3IgY29tcG9zaXRlIGV4cHJlc3Npb25zLCB3ZSB1c2UgYSB2ZXJ0ZXggYnVmZmVyIHdpdGggdHdvIGF0dHJpYnV0ZXM6IG1pbiBhbmRcbiAqICAgIG1heCB2YWx1ZXMgY292ZXJpbmcgdGhlIHJhbmdlIG9mIHpvb21zIGF0IHdoaWNoIHdlIGV4cGVjdCB0aGUgdGlsZSB0byBiZVxuICogICAgZGlzcGxheWVkLiBUaGVzZSB2YWx1ZXMgYXJlIGNhbGN1bGF0ZWQgYnkgZXZhbHVhdGluZyB0aGUgY29tcG9zaXRlIGV4cHJlc3Npb24gZm9yXG4gKiAgICB0aGUgZ2l2ZW4gZmVhdHVyZSBhdCBzdHJhdGVnaWNhbGx5IGNob3NlbiB6b29tIGxldmVscy4gSW4gYWRkaXRpb24gdG8gdGhpc1xuICogICAgYXR0cmlidXRlIGRhdGEsIHdlIGFsc28gdXNlIGEgdW5pZm9ybSB2YWx1ZSB3aGljaCB0aGUgc2hhZGVyIHVzZXMgdG8gaW50ZXJwb2xhdGVcbiAqICAgIGJldHdlZW4gdGhlIG1pbiBhbmQgbWF4IHZhbHVlIGF0IHRoZSBmaW5hbCBkaXNwbGF5ZWQgem9vbSBsZXZlbC4gVGhlIHVzZSBvZiBhXG4gKiAgICB1bmlmb3JtIGFsbG93cyB1cyB0byBjaGVhcGx5IHVwZGF0ZSB0aGUgdmFsdWUgb24gZXZlcnkgZnJhbWUuXG4gKlxuICogIE5vdGUgdGhhdCB0aGUgc2hhZGVyIHNvdXJjZSB2YXJpZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UncmUgdXNpbmcgYSB1bmlmb3JtIG9yXG4gKiAgYXR0cmlidXRlLiBXZSBkeW5hbWljYWxseSBjb21waWxlIHNoYWRlcnMgYXQgcnVudGltZSB0byBhY2NvbW9kYXRlIHRoaXMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIFxuXG5jbGFzcyBDb25zdGFudEJpbmRlciAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSAgICwgbmFtZSAgICAgICAgLCB0eXBlICAgICAgICApIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnN0YXRpc3RpY3MgPSB7IG1heDogLUluZmluaXR5IH07XG4gICAgfVxuXG4gICAgZGVmaW5lcygpIHtcbiAgICAgICAgcmV0dXJuIFtgI2RlZmluZSBIQVNfVU5JRk9STV91XyR7dGhpcy5uYW1lfWBdO1xuICAgIH1cblxuICAgIHBvcHVsYXRlUGFpbnRBcnJheSgpIHt9XG4gICAgdXBsb2FkKCkge31cbiAgICBkZXN0cm95KCkge31cblxuICAgIHNldFVuaWZvcm1zKGNvbnRleHQgICAgICAgICAsXG4gICAgICAgICAgICAgICAgcHJvZ3JhbSAgICAgICAgICxcbiAgICAgICAgICAgICAgICBnbG9iYWxzICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlICAgICAgPSBjdXJyZW50VmFsdWUuY29uc3RhbnRPcih0aGlzLnZhbHVlKTtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnY29sb3InKSB7XG4gICAgICAgICAgICBnbC51bmlmb3JtNGYocHJvZ3JhbS51bmlmb3Jtc1tgdV8ke3RoaXMubmFtZX1gXSwgdmFsdWUuciwgdmFsdWUuZywgdmFsdWUuYiwgdmFsdWUuYSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbC51bmlmb3JtMWYocHJvZ3JhbS51bmlmb3Jtc1tgdV8ke3RoaXMubmFtZX1gXSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBTb3VyY2VFeHByZXNzaW9uQmluZGVyICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihleHByZXNzaW9uICAgICAgICAgICAgICAgICAgLCBuYW1lICAgICAgICAsIHR5cGUgICAgICAgICkge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnN0YXRpc3RpY3MgPSB7IG1heDogLUluZmluaXR5IH07XG4gICAgICAgIGNvbnN0IFBhaW50VmVydGV4QXJyYXkgPSB0eXBlID09PSAnY29sb3InID8gU3RydWN0QXJyYXlMYXlvdXQyZjggOiBTdHJ1Y3RBcnJheUxheW91dDFmNDtcbiAgICAgICAgdGhpcy5wYWludFZlcnRleEF0dHJpYnV0ZXMgPSBbe1xuICAgICAgICAgICAgbmFtZTogYGFfJHtuYW1lfWAsXG4gICAgICAgICAgICB0eXBlOiAnRmxvYXQzMicsXG4gICAgICAgICAgICBjb21wb25lbnRzOiB0eXBlID09PSAnY29sb3InID8gMiA6IDEsXG4gICAgICAgICAgICBvZmZzZXQ6IDBcbiAgICAgICAgfV07XG4gICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhBcnJheSA9IG5ldyBQYWludFZlcnRleEFycmF5KCk7XG4gICAgfVxuXG4gICAgZGVmaW5lcygpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHBvcHVsYXRlUGFpbnRBcnJheShsZW5ndGggICAgICAgICwgZmVhdHVyZSAgICAgICAgICkge1xuICAgICAgICBjb25zdCBwYWludEFycmF5ID0gdGhpcy5wYWludFZlcnRleEFycmF5O1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGFpbnRBcnJheS5sZW5ndGg7XG4gICAgICAgIHBhaW50QXJyYXkucmVzZXJ2ZShsZW5ndGgpO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOiAwfSwgZmVhdHVyZSk7XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgY29uc3QgY29sb3IgPSBwYWNrQ29sb3IodmFsdWUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwYWludEFycmF5LmVtcGxhY2VCYWNrKGNvbG9yWzBdLCBjb2xvclsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHBhaW50QXJyYXkuZW1wbGFjZUJhY2sodmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnN0YXRpc3RpY3MubWF4ID0gTWF0aC5tYXgodGhpcy5zdGF0aXN0aWNzLm1heCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQgICAgICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSkge1xuICAgICAgICAgICAgdGhpcy5wYWludFZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSwgdGhpcy5wYWludFZlcnRleEF0dHJpYnV0ZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0VW5pZm9ybXMoY29udGV4dCAgICAgICAgICwgcHJvZ3JhbSAgICAgICAgICkge1xuICAgICAgICBjb250ZXh0LmdsLnVuaWZvcm0xZihwcm9ncmFtLnVuaWZvcm1zW2BhXyR7dGhpcy5uYW1lfV90YF0sIDApO1xuICAgIH1cbn1cblxuY2xhc3MgQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlciAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGV4cHJlc3Npb24gICAgICAgICAgICAgICAgICAgICAsIG5hbWUgICAgICAgICwgdHlwZSAgICAgICAgLCB1c2VJbnRlZ2VyWm9vbSAgICAgICAgICwgem9vbSAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMudXNlSW50ZWdlclpvb20gPSB1c2VJbnRlZ2VyWm9vbTtcbiAgICAgICAgdGhpcy56b29tID0gem9vbTtcbiAgICAgICAgdGhpcy5zdGF0aXN0aWNzID0geyBtYXg6IC1JbmZpbml0eSB9O1xuICAgICAgICBjb25zdCBQYWludFZlcnRleEFycmF5ID0gdHlwZSA9PT0gJ2NvbG9yJyA/IFN0cnVjdEFycmF5TGF5b3V0NGYxNiA6IFN0cnVjdEFycmF5TGF5b3V0MmY4O1xuICAgICAgICB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcyA9IFt7XG4gICAgICAgICAgICBuYW1lOiBgYV8ke25hbWV9YCxcbiAgICAgICAgICAgIHR5cGU6ICdGbG9hdDMyJyxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IHR5cGUgPT09ICdjb2xvcicgPyA0IDogMixcbiAgICAgICAgICAgIG9mZnNldDogMFxuICAgICAgICB9XTtcbiAgICAgICAgdGhpcy5wYWludFZlcnRleEFycmF5ID0gbmV3IFBhaW50VmVydGV4QXJyYXkoKTtcbiAgICB9XG5cbiAgICBkZWZpbmVzKCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcG9wdWxhdGVQYWludEFycmF5KGxlbmd0aCAgICAgICAgLCBmZWF0dXJlICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHBhaW50QXJyYXkgPSB0aGlzLnBhaW50VmVydGV4QXJyYXk7XG5cbiAgICAgICAgY29uc3Qgc3RhcnQgPSBwYWludEFycmF5Lmxlbmd0aDtcbiAgICAgICAgcGFpbnRBcnJheS5yZXNlcnZlKGxlbmd0aCk7XG5cbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOiB0aGlzLnpvb20gICAgfSwgZmVhdHVyZSk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZSh7em9vbTogdGhpcy56b29tICsgMX0sIGZlYXR1cmUpO1xuXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pbkNvbG9yID0gcGFja0NvbG9yKG1pbik7XG4gICAgICAgICAgICBjb25zdCBtYXhDb2xvciA9IHBhY2tDb2xvcihtYXgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwYWludEFycmF5LmVtcGxhY2VCYWNrKG1pbkNvbG9yWzBdLCBtaW5Db2xvclsxXSwgbWF4Q29sb3JbMF0sIG1heENvbG9yWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcGFpbnRBcnJheS5lbXBsYWNlQmFjayhtaW4sIG1heCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc3RhdGlzdGljcy5tYXggPSBNYXRoLm1heCh0aGlzLnN0YXRpc3RpY3MubWF4LCBtaW4sIG1heCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dCAgICAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5wYWludFZlcnRleEFycmF5KSB7XG4gICAgICAgICAgICB0aGlzLnBhaW50VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5wYWludFZlcnRleEFycmF5LCB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5wYWludFZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5wYWludFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0aW9uRmFjdG9yKGN1cnJlbnRab29tICAgICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMudXNlSW50ZWdlclpvb20pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24uaW50ZXJwb2xhdGlvbkZhY3RvcihNYXRoLmZsb29yKGN1cnJlbnRab29tKSwgdGhpcy56b29tLCB0aGlzLnpvb20gKyAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24uaW50ZXJwb2xhdGlvbkZhY3RvcihjdXJyZW50Wm9vbSwgdGhpcy56b29tLCB0aGlzLnpvb20gKyAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFVuaWZvcm1zKGNvbnRleHQgICAgICAgICAsIHByb2dyYW0gICAgICAgICAsIGdsb2JhbHMgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgY29udGV4dC5nbC51bmlmb3JtMWYocHJvZ3JhbS51bmlmb3Jtc1tgYV8ke3RoaXMubmFtZX1fdGBdLCB0aGlzLmludGVycG9sYXRpb25GYWN0b3IoZ2xvYmFscy56b29tKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFByb2dyYW1Db25maWd1cmF0aW9uIGNvbnRhaW5zIHRoZSBsb2dpYyBmb3IgYmluZGluZyBzdHlsZSBsYXllciBwcm9wZXJ0aWVzIGFuZCB0aWxlXG4gKiBsYXllciBmZWF0dXJlIGRhdGEgaW50byBHTCBwcm9ncmFtIHVuaWZvcm1zIGFuZCB2ZXJ0ZXggYXR0cmlidXRlcy5cbiAqXG4gKiBOb24tZGF0YS1kcml2ZW4gcHJvcGVydHkgdmFsdWVzIGFyZSBib3VuZCB0byBzaGFkZXIgdW5pZm9ybXMuIERhdGEtZHJpdmVuIHByb3BlcnR5XG4gKiB2YWx1ZXMgYXJlIGJvdW5kIHRvIHZlcnRleCBhdHRyaWJ1dGVzLiBJbiBvcmRlciB0byBzdXBwb3J0IGEgdW5pZm9ybSBHTFNMIHN5bnRheCBvdmVyXG4gKiBib3RoLCBbTWFwYm94IEdMIFNoYWRlcnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLXNoYWRlcnMpIGRlZmluZXMgYSBgI3ByYWdtYWBcbiAqIGFic3RyYWN0aW9uLCB3aGljaCBQcm9ncmFtQ29uZmlndXJhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgaW1wbGVtZW50aW5nLiBBdCBydW50aW1lLFxuICogaXQgZXhhbWluZXMgdGhlIGF0dHJpYnV0ZXMgb2YgYSBwYXJ0aWN1bGFyIGxheWVyLCBjb21iaW5lcyB0aGlzIHdpdGggZml4ZWQga25vd2xlZGdlXG4gKiBhYm91dCBob3cgbGF5ZXJzIG9mIHRoZSBwYXJ0aWN1bGFyIHR5cGUgYXJlIGltcGxlbWVudGVkLCBhbmQgZGV0ZXJtaW5lcyB3aGljaCB1bmlmb3Jtc1xuICogYW5kIHZlcnRleCBhdHRyaWJ1dGVzIHdpbGwgYmUgcmVxdWlyZWQuIEl0IGNhbiB0aGVuIHN1YnN0aXR1dGUgdGhlIGFwcHJvcHJpYXRlIHRleHRcbiAqIGludG8gdGhlIHNoYWRlciBzb3VyY2UgY29kZSwgY3JlYXRlIGFuZCBsaW5rIGEgcHJvZ3JhbSwgYW5kIGJpbmQgdGhlIHVuaWZvcm1zIGFuZFxuICogdmVydGV4IGF0dHJpYnV0ZXMgaW4gcHJlcGFyYXRpb24gZm9yIGRyYXdpbmcuXG4gKlxuICogV2hlbiBhIHZlY3RvciB0aWxlIGlzIHBhcnNlZCwgdGhpcyBzYW1lIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgdXNlZCB0b1xuICogcG9wdWxhdGUgdGhlIGF0dHJpYnV0ZSBidWZmZXJzIG5lZWRlZCBmb3IgZGF0YS1kcml2ZW4gc3R5bGluZyB1c2luZyB0aGUgem9vbVxuICogbGV2ZWwgYW5kIGZlYXR1cmUgcHJvcGVydHkgZGF0YS5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBQcm9ncmFtQ29uZmlndXJhdGlvbiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYmluZGVycyA9IHt9O1xuICAgICAgICB0aGlzLmNhY2hlS2V5ID0gJyc7XG5cbiAgICAgICAgdGhpcy5fYnVmZmVycyA9IFtdO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVEeW5hbWljICAgICAgICAgICAgICAgICAgICAgICAgKGxheWVyICAgICAgICwgem9vbSAgICAgICAgLCBmaWx0ZXJQcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSBuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgY29uc3Qga2V5cyA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gbGF5ZXIucGFpbnQuX3ZhbHVlcykge1xuICAgICAgICAgICAgaWYgKCFmaWx0ZXJQcm9wZXJ0aWVzKHByb3BlcnR5KSkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGxheWVyLnBhaW50LmdldChwcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSkgfHwgIXZhbHVlLnByb3BlcnR5LnNwZWNpZmljYXRpb25bJ3Byb3BlcnR5LWZ1bmN0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBwYWludEF0dHJpYnV0ZU5hbWUocHJvcGVydHksIGxheWVyLnR5cGUpO1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHZhbHVlLnByb3BlcnR5LnNwZWNpZmljYXRpb24udHlwZTtcbiAgICAgICAgICAgIGNvbnN0IHVzZUludGVnZXJab29tID0gdmFsdWUucHJvcGVydHkudXNlSW50ZWdlclpvb207XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZS52YWx1ZS5raW5kID09PSAnY29uc3RhbnQnKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5iaW5kZXJzW3Byb3BlcnR5XSA9IG5ldyBDb25zdGFudEJpbmRlcih2YWx1ZS52YWx1ZSwgbmFtZSwgdHlwZSk7XG4gICAgICAgICAgICAgICAga2V5cy5wdXNoKGAvdV8ke25hbWV9YCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnZhbHVlLmtpbmQgPT09ICdzb3VyY2UnKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5iaW5kZXJzW3Byb3BlcnR5XSA9IG5ldyBTb3VyY2VFeHByZXNzaW9uQmluZGVyKHZhbHVlLnZhbHVlLCBuYW1lLCB0eXBlKTtcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goYC9hXyR7bmFtZX1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2VsZi5iaW5kZXJzW3Byb3BlcnR5XSA9IG5ldyBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyKHZhbHVlLnZhbHVlLCBuYW1lLCB0eXBlLCB1c2VJbnRlZ2VyWm9vbSwgem9vbSk7XG4gICAgICAgICAgICAgICAga2V5cy5wdXNoKGAvel8ke25hbWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLmNhY2hlS2V5ID0ga2V5cy5zb3J0KCkuam9pbignJyk7XG5cbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgcG9wdWxhdGVQYWludEFycmF5cyhsZW5ndGggICAgICAgICwgZmVhdHVyZSAgICAgICAgICkge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRoaXMuYmluZGVycykge1xuICAgICAgICAgICAgdGhpcy5iaW5kZXJzW3Byb3BlcnR5XS5wb3B1bGF0ZVBhaW50QXJyYXkobGVuZ3RoLCBmZWF0dXJlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlZmluZXMoKSAgICAgICAgICAgICAgICB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRoaXMuYmluZGVycykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2guYXBwbHkocmVzdWx0LCB0aGlzLmJpbmRlcnNbcHJvcGVydHldLmRlZmluZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBzZXRVbmlmb3JtcyAgICAgICAgICAgICAgICAgICAgKGNvbnRleHQgICAgICAgICAsIHByb2dyYW0gICAgICAgICAsIHByb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBnbG9iYWxzICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kZXIgPSB0aGlzLmJpbmRlcnNbcHJvcGVydHldO1xuICAgICAgICAgICAgYmluZGVyLnNldFVuaWZvcm1zKGNvbnRleHQsIHByb2dyYW0sIGdsb2JhbHMsIHByb3BlcnRpZXMuZ2V0KHByb3BlcnR5KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRQYWludFZlcnRleEJ1ZmZlcnMoKSAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWZmZXJzO1xuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0ICAgICAgICAgKSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRlcnNbcHJvcGVydHldLnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1ZmZlcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRlciA9IHRoaXMuYmluZGVyc1twcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAoKGJpbmRlciBpbnN0YW5jZW9mIFNvdXJjZUV4cHJlc3Npb25CaW5kZXIgfHxcbiAgICAgICAgICAgICAgICBiaW5kZXIgaW5zdGFuY2VvZiBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyKSAmJlxuICAgICAgICAgICAgICAgIGJpbmRlci5wYWludFZlcnRleEJ1ZmZlclxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVycy5wdXNoKGJpbmRlci5wYWludFZlcnRleEJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYnVmZmVycyA9IGJ1ZmZlcnM7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuYmluZGVyc1twcm9wZXJ0eV0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBQcm9ncmFtQ29uZmlndXJhdGlvblNldCAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGxheW91dEF0dHJpYnV0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICwgbGF5ZXJzICAgICAgICAgICAgICAgICAgICAgICAsIHpvb20gICAgICAgICwgZmlsdGVyUHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICA9ICgpID0+IHRydWUpIHtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zW2xheWVyLmlkXSA9IFByb2dyYW1Db25maWd1cmF0aW9uLmNyZWF0ZUR5bmFtaWMobGF5ZXIsIHpvb20sIGZpbHRlclByb3BlcnRpZXMpO1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnNbbGF5ZXIuaWRdLmxheW91dEF0dHJpYnV0ZXMgPSBsYXlvdXRBdHRyaWJ1dGVzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcG9wdWxhdGVQYWludEFycmF5cyhsZW5ndGggICAgICAgICwgZmVhdHVyZSAgICAgICAgICkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnNba2V5XS5wb3B1bGF0ZVBhaW50QXJyYXlzKGxlbmd0aCwgZmVhdHVyZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQobGF5ZXJJZCAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tsYXllcklkXTtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dCAgICAgICAgICkge1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgaW4gdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zW2xheWVySWRdLnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnNbbGF5ZXJJZF0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBwYWludCBwcm9wZXJ0eSBhcnJheXNcbmZ1bmN0aW9uIHBhaW50QXR0cmlidXRlTmFtZShwcm9wZXJ0eSwgdHlwZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVFeGNlcHRpb25zID0ge1xuICAgICAgICAndGV4dC1vcGFjaXR5JzogJ29wYWNpdHknLFxuICAgICAgICAnaWNvbi1vcGFjaXR5JzogJ29wYWNpdHknLFxuICAgICAgICAndGV4dC1jb2xvcic6ICdmaWxsX2NvbG9yJyxcbiAgICAgICAgJ2ljb24tY29sb3InOiAnZmlsbF9jb2xvcicsXG4gICAgICAgICd0ZXh0LWhhbG8tY29sb3InOiAnaGFsb19jb2xvcicsXG4gICAgICAgICdpY29uLWhhbG8tY29sb3InOiAnaGFsb19jb2xvcicsXG4gICAgICAgICd0ZXh0LWhhbG8tYmx1cic6ICdoYWxvX2JsdXInLFxuICAgICAgICAnaWNvbi1oYWxvLWJsdXInOiAnaGFsb19ibHVyJyxcbiAgICAgICAgJ3RleHQtaGFsby13aWR0aCc6ICdoYWxvX3dpZHRoJyxcbiAgICAgICAgJ2ljb24taGFsby13aWR0aCc6ICdoYWxvX3dpZHRoJyxcbiAgICAgICAgJ2xpbmUtZ2FwLXdpZHRoJzogJ2dhcHdpZHRoJ1xuICAgIH07XG4gICAgcmV0dXJuIGF0dHJpYnV0ZU5hbWVFeGNlcHRpb25zW3Byb3BlcnR5XSB8fFxuICAgICAgICBwcm9wZXJ0eS5yZXBsYWNlKGAke3R5cGV9LWAsICcnKS5yZXBsYWNlKC8tL2csICdfJyk7XG59XG5cbnJlZ2lzdGVyKCdDb25zdGFudEJpbmRlcicsIENvbnN0YW50QmluZGVyKTtcbnJlZ2lzdGVyKCdTb3VyY2VFeHByZXNzaW9uQmluZGVyJywgU291cmNlRXhwcmVzc2lvbkJpbmRlcik7XG5yZWdpc3RlcignQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlcicsIENvbXBvc2l0ZUV4cHJlc3Npb25CaW5kZXIpO1xucmVnaXN0ZXIoJ1Byb2dyYW1Db25maWd1cmF0aW9uJywgUHJvZ3JhbUNvbmZpZ3VyYXRpb24sIHtvbWl0OiBbJ19idWZmZXJzJ119KTtcbnJlZ2lzdGVyKCdQcm9ncmFtQ29uZmlndXJhdGlvblNldCcsIFByb2dyYW1Db25maWd1cmF0aW9uU2V0KTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgUHJvZ3JhbUNvbmZpZ3VyYXRpb24sXG4gICAgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXRcbn07XG4iLCIvLyAgICAgIFxuY29uc3Qge2NyZWF0ZUxheW91dH0gPSByZXF1aXJlKCcuLi91dGlsL3N0cnVjdF9hcnJheScpO1xubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHsgbmFtZTogJ2FfcG9zJywgdHlwZTogJ0ludDE2JywgY29tcG9uZW50czogMiB9LFxuICAgIHsgbmFtZTogJ2FfdGV4dHVyZV9wb3MnLCB0eXBlOiAnSW50MTYnLCBjb21wb25lbnRzOiAyIH1cbl0pO1xuIiwiLy8gICAgICBcblxuY29uc3Qge3dhcm5PbmNlfSA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuY29uc3Qge3JlZ2lzdGVyfSA9IHJlcXVpcmUoJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2ZlcicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuY29uc3QgTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEggPSBNYXRoLnBvdygyLCAxNikgLSAxO1xuXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gXG5cbmNsYXNzIFNlZ21lbnRWZWN0b3Ige1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKHNlZ21lbnRzICAgICAgICAgICAgICAgICAgPSBbXSkge1xuICAgICAgICB0aGlzLnNlZ21lbnRzID0gc2VnbWVudHM7XG4gICAgfVxuXG4gICAgcHJlcGFyZVNlZ21lbnQobnVtVmVydGljZXMgICAgICAgICwgbGF5b3V0VmVydGV4QXJyYXkgICAgICAgICAgICAgLCBpbmRleEFycmF5ICAgICAgICAgICAgICkgICAgICAgICAge1xuICAgICAgICBsZXQgc2VnbWVudCAgICAgICAgICA9IHRoaXMuc2VnbWVudHNbdGhpcy5zZWdtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKG51bVZlcnRpY2VzID4gTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEgpIHdhcm5PbmNlKGBNYXggdmVydGljZXMgcGVyIHNlZ21lbnQgaXMgJHtNQVhfVkVSVEVYX0FSUkFZX0xFTkdUSH06IGJ1Y2tldCByZXF1ZXN0ZWQgJHtudW1WZXJ0aWNlc31gKTtcbiAgICAgICAgaWYgKCFzZWdtZW50IHx8IHNlZ21lbnQudmVydGV4TGVuZ3RoICsgbnVtVmVydGljZXMgPiBtb2R1bGUuZXhwb3J0cy5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSCkge1xuICAgICAgICAgICAgc2VnbWVudCA9ICh7XG4gICAgICAgICAgICAgICAgdmVydGV4T2Zmc2V0OiBsYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgcHJpbWl0aXZlT2Zmc2V0OiBpbmRleEFycmF5Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhMZW5ndGg6IDAsXG4gICAgICAgICAgICAgICAgcHJpbWl0aXZlTGVuZ3RoOiAwXG4gICAgICAgICAgICB9ICAgICApO1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWdtZW50O1xuICAgIH1cblxuICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VnbWVudHM7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIHRoaXMuc2VnbWVudHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgayBpbiBzZWdtZW50LnZhb3MpIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50LnZhb3Nba10uZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5yZWdpc3RlcignU2VnbWVudFZlY3RvcicsIFNlZ21lbnRWZWN0b3IpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBTZWdtZW50VmVjdG9yLFxuXG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gc2l6ZSBvZiBhIHZlcnRleCBhcnJheS4gVGhpcyBsaW1pdCBpcyBpbXBvc2VkIGJ5IFdlYkdMJ3MgMTYgYml0XG4gICAgICogYWRkcmVzc2luZyBvZiB2ZXJ0ZXggYnVmZmVycy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIE1BWF9WRVJURVhfQVJSQVlfTEVOR1RIOiBNQVhfVkVSVEVYX0FSUkFZX0xFTkdUSFxufTtcbiIsIi8vICAgICAgXG5cbi8qKlxuICogQSBjb29yZGluYXRlIGlzIGEgY29sdW1uLCByb3csIHpvb20gY29tYmluYXRpb24sIG9mdGVuIHVzZWRcbiAqIGFzIHRoZSBkYXRhIGNvbXBvbmVudCBvZiBhIHRpbGUuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGNvbHVtblxuICogQHBhcmFtIHtudW1iZXJ9IHJvd1xuICogQHBhcmFtIHtudW1iZXJ9IHpvb21cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIENvb3JkaW5hdGUge1xuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcbiAgICBjb25zdHJ1Y3Rvcihjb2x1bW4gICAgICAgICwgcm93ICAgICAgICAsIHpvb20gICAgICAgICkge1xuICAgICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjtcbiAgICAgICAgdGhpcy5yb3cgPSByb3c7XG4gICAgICAgIHRoaXMuem9vbSA9IHpvb207XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgY2xvbmUgb2YgdGhpcyBjb29yZGluYXRlIHRoYXQgY2FuIGJlIG11dGF0ZWQgd2l0aG91dFxuICAgICAqIGNoYW5naW5nIHRoZSBvcmlnaW5hbCBjb29yZGluYXRlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Q29vcmRpbmF0ZX0gY2xvbmVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIHZhciBjb29yZCA9IG5ldyBDb29yZGluYXRlKDAsIDAsIDApO1xuICAgICAqIHZhciBjMiA9IGNvb3JkLmNsb25lKCk7XG4gICAgICogLy8gc2luY2UgY29vcmQgaXMgY2xvbmVkLCBtb2RpZnlpbmcgYSBwcm9wZXJ0eSBvZiBjMiBkb2VzXG4gICAgICogLy8gbm90IG1vZGlmeSBpdC5cbiAgICAgKiBjMi56b29tID0gMjtcbiAgICAgKi9cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb29yZGluYXRlKHRoaXMuY29sdW1uLCB0aGlzLnJvdywgdGhpcy56b29tKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBab29tIHRoaXMgY29vcmRpbmF0ZSB0byBhIGdpdmVuIHpvb20gbGV2ZWwuIFRoaXMgcmV0dXJucyBhIG5ld1xuICAgICAqIGNvb3JkaW5hdGUgb2JqZWN0LCBub3QgbXV0YXRpbmcgdGhlIG9sZCBvbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gem9vbVxuICAgICAqIEByZXR1cm5zIHtDb29yZGluYXRlfSB6b29tZWQgY29vcmRpbmF0ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgY29vcmQgPSBuZXcgQ29vcmRpbmF0ZSgwLCAwLCAwKTtcbiAgICAgKiB2YXIgYzIgPSBjb29yZC56b29tVG8oMSk7XG4gICAgICogYzIgLy8gZXF1YWxzIG5ldyBDb29yZGluYXRlKDAsIDAsIDEpO1xuICAgICAqL1xuICAgIHpvb21Ubyh6b29tICAgICAgICApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fem9vbVRvKHpvb20pOyB9XG5cbiAgICAvKipcbiAgICAgKiBTdWJ0cmFjdCB0aGUgY29sdW1uIGFuZCByb3cgdmFsdWVzIG9mIHRoaXMgY29vcmRpbmF0ZSBmcm9tIHRob3NlXG4gICAgICogb2YgYW5vdGhlciBjb29yZGluYXRlLiBUaGUgb3RoZXIgY29vcmRpbmF0IHdpbGwgYmUgem9vbWVkIHRvIHRoZVxuICAgICAqIHNhbWUgbGV2ZWwgYXMgYHRoaXNgIGJlZm9yZSB0aGUgc3VidHJhY3Rpb24gb2NjdXJzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Nvb3JkaW5hdGV9IGMgb3RoZXIgY29vcmRpbmF0ZVxuICAgICAqIEByZXR1cm5zIHtDb29yZGluYXRlfSByZXN1bHRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHN1YihjICAgICAgICAgICAgKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3N1YihjKTsgfVxuXG4gICAgX3pvb21Ubyh6b29tICAgICAgICApIHtcbiAgICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLnBvdygyLCB6b29tIC0gdGhpcy56b29tKTtcbiAgICAgICAgdGhpcy5jb2x1bW4gKj0gc2NhbGU7XG4gICAgICAgIHRoaXMucm93ICo9IHNjYWxlO1xuICAgICAgICB0aGlzLnpvb20gPSB6b29tO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfc3ViKGMgICAgICAgICAgICApIHtcbiAgICAgICAgYyA9IGMuem9vbVRvKHRoaXMuem9vbSk7XG4gICAgICAgIHRoaXMuY29sdW1uIC09IGMuY29sdW1uO1xuICAgICAgICB0aGlzLnJvdyAtPSBjLnJvdztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvb3JkaW5hdGU7XG4iLCIvLyAgICAgIFxuXG5jb25zdCB3cmFwID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJykud3JhcDtcblxuLyoqXG4gKiBBIGBMbmdMYXRgIG9iamVjdCByZXByZXNlbnRzIGEgZ2l2ZW4gbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBjb29yZGluYXRlLCBtZWFzdXJlZCBpbiBkZWdyZWVzLlxuICpcbiAqIE1hcGJveCBHTCB1c2VzIGxvbmdpdHVkZSwgbGF0aXR1ZGUgY29vcmRpbmF0ZSBvcmRlciAoYXMgb3Bwb3NlZCB0byBsYXRpdHVkZSwgbG9uZ2l0dWRlKSB0byBtYXRjaCBHZW9KU09OLlxuICpcbiAqIE5vdGUgdGhhdCBhbnkgTWFwYm94IEdMIG1ldGhvZCB0aGF0IGFjY2VwdHMgYSBgTG5nTGF0YCBvYmplY3QgYXMgYW4gYXJndW1lbnQgb3Igb3B0aW9uXG4gKiBjYW4gYWxzbyBhY2NlcHQgYW4gYEFycmF5YCBvZiB0d28gbnVtYmVycyBhbmQgd2lsbCBwZXJmb3JtIGFuIGltcGxpY2l0IGNvbnZlcnNpb24uXG4gKiBUaGlzIGZsZXhpYmxlIHR5cGUgaXMgZG9jdW1lbnRlZCBhcyB7QGxpbmsgTG5nTGF0TGlrZX0uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGxuZyBMb25naXR1ZGUsIG1lYXN1cmVkIGluIGRlZ3JlZXMuXG4gKiBAcGFyYW0ge251bWJlcn0gbGF0IExhdGl0dWRlLCBtZWFzdXJlZCBpbiBkZWdyZWVzLlxuICogQGV4YW1wbGVcbiAqIHZhciBsbCA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk3NDksIDQwLjc3MzYpO1xuICogQHNlZSBbR2V0IGNvb3JkaW5hdGVzIG9mIHRoZSBtb3VzZSBwb2ludGVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL21vdXNlLXBvc2l0aW9uLylcbiAqIEBzZWUgW0Rpc3BsYXkgYSBwb3B1cF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC8pXG4gKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3VzaW5nLWJveC1xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxuICogQHNlZSBbQ3JlYXRlIGEgdGltZWxpbmUgYW5pbWF0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3RpbWVsaW5lLWFuaW1hdGlvbi8pXG4gKi9cbmNsYXNzIExuZ0xhdCB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihsbmcgICAgICAgICwgbGF0ICAgICAgICApIHtcbiAgICAgICAgaWYgKGlzTmFOKGxuZykgfHwgaXNOYU4obGF0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIExuZ0xhdCBvYmplY3Q6ICgke2xuZ30sICR7bGF0fSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxuZyA9ICtsbmc7XG4gICAgICAgIHRoaXMubGF0ID0gK2xhdDtcbiAgICAgICAgaWYgKHRoaXMubGF0ID4gOTAgfHwgdGhpcy5sYXQgPCAtOTApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBMbmdMYXQgbGF0aXR1ZGUgdmFsdWU6IG11c3QgYmUgYmV0d2VlbiAtOTAgYW5kIDkwJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IGBMbmdMYXRgIG9iamVjdCB3aG9zZSBsb25naXR1ZGUgaXMgd3JhcHBlZCB0byB0aGUgcmFuZ2UgKC0xODAsIDE4MCkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgd3JhcHBlZCBgTG5nTGF0YCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgbGwgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KDI4Ni4wMjUxLCA0MC43NzM2KTtcbiAgICAgKiB2YXIgd3JhcHBlZCA9IGxsLndyYXAoKTtcbiAgICAgKiB3cmFwcGVkLmxuZzsgLy8gPSAtNzMuOTc0OVxuICAgICAqL1xuICAgIHdyYXAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0KHdyYXAodGhpcy5sbmcsIC0xODAsIDE4MCksIHRoaXMubGF0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjb29yZGluYXRlcyByZXByZXNlbnRlZCBhcyBhbiBhcnJheSBvZiB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fSBUaGUgY29vcmRpbmF0ZXMgcmVwcmVzZXRlZCBhcyBhbiBhcnJheSBvZiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGxsID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTc0OSwgNDAuNzczNik7XG4gICAgICogbGwudG9BcnJheSgpOyAvLyA9IFstNzMuOTc0OSwgNDAuNzczNl1cbiAgICAgKi9cbiAgICB0b0FycmF5KCkge1xuICAgICAgICByZXR1cm4gW3RoaXMubG5nLCB0aGlzLmxhdF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY29vcmRpbmF0ZXMgcmVwcmVzZW50IGFzIGEgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvb3JkaW5hdGVzIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nIG9mIHRoZSBmb3JtYXQgYCdMbmdMYXQobG5nLCBsYXQpJ2AuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgbGwgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KC03My45NzQ5LCA0MC43NzM2KTtcbiAgICAgKiBsbC50b1N0cmluZygpOyAvLyA9IFwiTG5nTGF0KC03My45NzQ5LCA0MC43NzM2KVwiXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgTG5nTGF0KCR7dGhpcy5sbmd9LCAke3RoaXMubGF0fSlgO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBgTG5nTGF0Qm91bmRzYCBmcm9tIHRoZSBjb29yZGluYXRlcyBleHRlbmRlZCBieSBhIGdpdmVuIGByYWRpdXNgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhZGl1cyBEaXN0YW5jZSBpbiBtZXRlcnMgZnJvbSB0aGUgY29vcmRpbmF0ZXMgdG8gZXh0ZW5kIHRoZSBib3VuZHMuXG4gICAgICogQHJldHVybnMge0xuZ0xhdEJvdW5kc30gQSBuZXcgYExuZ0xhdEJvdW5kc2Agb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY29vcmRpbmF0ZXMgZXh0ZW5kZWQgYnkgdGhlIGByYWRpdXNgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGxsID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTc0OSwgNDAuNzczNik7XG4gICAgICogbGwudG9Cb3VuZHMoMTAwKS50b0FycmF5KCk7IC8vID0gW1stNzMuOTc1MDE4NjIxNDEzMjgsIDQwLjc3MzUxMDE2ODQ3MjI5XSwgWy03My45NzQ3ODEzNzg1ODY3MywgNDAuNzczNjg5ODMxNTI3NzFdXVxuICAgICAqL1xuICAgIHRvQm91bmRzKHJhZGl1cyAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGVhcnRoQ2lyY3VtZmVyZW5jZUluTWV0ZXJzQXRFcXVhdG9yID0gNDAwNzUwMTc7XG4gICAgICAgIGNvbnN0IGxhdEFjY3VyYWN5ID0gMzYwICogcmFkaXVzIC8gZWFydGhDaXJjdW1mZXJlbmNlSW5NZXRlcnNBdEVxdWF0b3IsXG4gICAgICAgICAgICBsbmdBY2N1cmFjeSA9IGxhdEFjY3VyYWN5IC8gTWF0aC5jb3MoKE1hdGguUEkgLyAxODApICogdGhpcy5sYXQpO1xuXG4gICAgICAgIGNvbnN0IExuZ0xhdEJvdW5kcyA9IHJlcXVpcmUoJy4vbG5nX2xhdF9ib3VuZHMnKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXRCb3VuZHMobmV3IExuZ0xhdCh0aGlzLmxuZyAtIGxuZ0FjY3VyYWN5LCB0aGlzLmxhdCAtIGxhdEFjY3VyYWN5KSxcbiAgICAgICAgICAgIG5ldyBMbmdMYXQodGhpcy5sbmcgKyBsbmdBY2N1cmFjeSwgdGhpcy5sYXQgKyBsYXRBY2N1cmFjeSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIGFycmF5IG9mIHR3byBudW1iZXJzIHRvIGEgYExuZ0xhdGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogSWYgYSBgTG5nTGF0YCBvYmplY3QgaXMgcGFzc2VkIGluLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBpdCB1bmNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdExpa2V9IGlucHV0IEFuIGFycmF5IG9mIHR3byBudW1iZXJzIHRvIGNvbnZlcnQsIG9yIGEgYExuZ0xhdGAgb2JqZWN0IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBBIG5ldyBgTG5nTGF0YCBvYmplY3QsIGlmIGEgY29udmVyc2lvbiBvY2N1cnJlZCwgb3IgdGhlIG9yaWdpbmFsIGBMbmdMYXRgIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBhcnIgPSBbLTczLjk3NDksIDQwLjc3MzZdO1xuICAgICAqIHZhciBsbCA9IG1hcGJveGdsLkxuZ0xhdC5jb252ZXJ0KGFycik7XG4gICAgICogbGw7ICAgLy8gPSBMbmdMYXQge2xuZzogLTczLjk3NDksIGxhdDogNDAuNzczNn1cbiAgICAgKi9cbiAgICBzdGF0aWMgY29udmVydChpbnB1dCAgICAgICAgICAgICkgICAgICAgICB7XG4gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIExuZ0xhdCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSAmJiAoaW5wdXQubGVuZ3RoID09PSAyIHx8IGlucHV0Lmxlbmd0aCA9PT0gMykpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTG5nTGF0KE51bWJlcihpbnB1dFswXSksIE51bWJlcihpbnB1dFsxXSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShpbnB1dCkgJiYgdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJiBpbnB1dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXQoTnVtYmVyKGlucHV0LmxuZyksIE51bWJlcihpbnB1dC5sYXQpKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJgTG5nTGF0TGlrZWAgYXJndW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSBMbmdMYXQgaW5zdGFuY2UsIGFuIG9iamVjdCB7bG5nOiA8bG5nPiwgbGF0OiA8bGF0Pn0sIG9yIGFuIGFycmF5IG9mIFs8bG5nPiwgPGxhdD5dXCIpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIHtAbGluayBMbmdMYXR9IG9iamVjdCwgYW4gYXJyYXkgb2YgdHdvIG51bWJlcnMgcmVwcmVzZW50aW5nIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUsXG4gKiBvciBhbiBvYmplY3Qgd2l0aCBgbG5nYCBhbmQgYGxhdGAgcHJvcGVydGllcy5cbiAqXG4gKiBAdHlwZWRlZiB7TG5nTGF0IHwge2xuZzogbnVtYmVyLCBsYXQ6IG51bWJlcn0gfCBbbnVtYmVyLCBudW1iZXJdfSBMbmdMYXRMaWtlXG4gKiBAZXhhbXBsZVxuICogdmFyIHYxID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtMTIyLjQyMDY3OSwgMzcuNzcyNTM3KTtcbiAqIHZhciB2MiA9IFstMTIyLjQyMDY3OSwgMzcuNzcyNTM3XTtcbiAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxubW9kdWxlLmV4cG9ydHMgPSBMbmdMYXQ7XG4iLCIvLyAgICAgIFxuXG5jb25zdCBMbmdMYXQgPSByZXF1aXJlKCcuL2xuZ19sYXQnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbi8qKlxuICogQSBgTG5nTGF0Qm91bmRzYCBvYmplY3QgcmVwcmVzZW50cyBhIGdlb2dyYXBoaWNhbCBib3VuZGluZyBib3gsXG4gKiBkZWZpbmVkIGJ5IGl0cyBzb3V0aHdlc3QgYW5kIG5vcnRoZWFzdCBwb2ludHMgaW4gbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZS5cbiAqXG4gKiBJZiBubyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIHRoZSBjb25zdHJ1Y3RvciwgYSBgbnVsbGAgYm91bmRpbmcgYm94IGlzIGNyZWF0ZWQuXG4gKlxuICogTm90ZSB0aGF0IGFueSBNYXBib3ggR0wgbWV0aG9kIHRoYXQgYWNjZXB0cyBhIGBMbmdMYXRCb3VuZHNgIG9iamVjdCBhcyBhbiBhcmd1bWVudCBvciBvcHRpb25cbiAqIGNhbiBhbHNvIGFjY2VwdCBhbiBgQXJyYXlgIG9mIHR3byB7QGxpbmsgTG5nTGF0TGlrZX0gY29uc3RydWN0cyBhbmQgd2lsbCBwZXJmb3JtIGFuIGltcGxpY2l0IGNvbnZlcnNpb24uXG4gKiBUaGlzIGZsZXhpYmxlIHR5cGUgaXMgZG9jdW1lbnRlZCBhcyB7QGxpbmsgTG5nTGF0Qm91bmRzTGlrZX0uXG4gKlxuICogQHBhcmFtIHtMbmdMYXRMaWtlfSBbc3ddIFRoZSBzb3V0aHdlc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gKiBAcGFyYW0ge0xuZ0xhdExpa2V9IFtuZV0gVGhlIG5vcnRoZWFzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBleGFtcGxlXG4gKiB2YXIgc3cgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KC03My45ODc2LCA0MC43NjYxKTtcbiAqIHZhciBuZSA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjkzOTcsIDQwLjgwMDIpO1xuICogdmFyIGxsYiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoc3csIG5lKTtcbiAqL1xuY2xhc3MgTG5nTGF0Qm91bmRzIHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcblxuICAgIC8vIFRoaXMgY29uc3RydWN0b3IgaXMgdG9vIGZsZXhpYmxlIHRvIHR5cGUuIEl0IHNob3VsZCBub3QgYmUgc28gZmxleGlibGUuXG4gICAgY29uc3RydWN0b3Ioc3cgICAgICwgbmUgICAgICkge1xuICAgICAgICBpZiAoIXN3KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAobmUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U291dGhXZXN0KHN3KS5zZXROb3J0aEVhc3QobmUpO1xuICAgICAgICB9IGVsc2UgaWYgKHN3Lmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTb3V0aFdlc3QoW3N3WzBdLCBzd1sxXV0pLnNldE5vcnRoRWFzdChbc3dbMl0sIHN3WzNdXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFNvdXRoV2VzdChzd1swXSkuc2V0Tm9ydGhFYXN0KHN3WzFdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbm9ydGhlYXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdExpa2V9IG5lXG4gICAgICogQHJldHVybnMge0xuZ0xhdEJvdW5kc30gYHRoaXNgXG4gICAgICovXG4gICAgc2V0Tm9ydGhFYXN0KG5lICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuX25lID0gbmUgaW5zdGFuY2VvZiBMbmdMYXQgPyBuZXcgTG5nTGF0KG5lLmxuZywgbmUubGF0KSA6IExuZ0xhdC5jb252ZXJ0KG5lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBzb3V0aHdlc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gc3dcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0Qm91bmRzfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRTb3V0aFdlc3Qoc3cgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5fc3cgPSBzdyBpbnN0YW5jZW9mIExuZ0xhdCA/IG5ldyBMbmdMYXQoc3cubG5nLCBzdy5sYXQpIDogTG5nTGF0LmNvbnZlcnQoc3cpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRlbmQgdGhlIGJvdW5kcyB0byBpbmNsdWRlIGEgZ2l2ZW4gTG5nTGF0IG9yIExuZ0xhdEJvdW5kcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0fExuZ0xhdEJvdW5kc30gb2JqIG9iamVjdCB0byBleHRlbmQgdG9cbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0Qm91bmRzfSBgdGhpc2BcbiAgICAgKi9cbiAgICBleHRlbmQob2JqKSB7XG4gICAgICAgIGNvbnN0IHN3ID0gdGhpcy5fc3csXG4gICAgICAgICAgICBuZSA9IHRoaXMuX25lO1xuICAgICAgICBsZXQgc3cyLCBuZTI7XG5cbiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIExuZ0xhdCkge1xuICAgICAgICAgICAgc3cyID0gb2JqO1xuICAgICAgICAgICAgbmUyID0gb2JqO1xuXG4gICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTG5nTGF0Qm91bmRzKSB7XG4gICAgICAgICAgICBzdzIgPSBvYmouX3N3O1xuICAgICAgICAgICAgbmUyID0gb2JqLl9uZTtcblxuICAgICAgICAgICAgaWYgKCFzdzIgfHwgIW5lMikgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgICAgICBpZiAob2JqLmV2ZXJ5KEFycmF5LmlzQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4dGVuZChMbmdMYXRCb3VuZHMuY29udmVydChvYmopKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leHRlbmQoTG5nTGF0LmNvbnZlcnQob2JqKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXN3ICYmICFuZSkge1xuICAgICAgICAgICAgdGhpcy5fc3cgPSBuZXcgTG5nTGF0KHN3Mi5sbmcsIHN3Mi5sYXQpO1xuICAgICAgICAgICAgdGhpcy5fbmUgPSBuZXcgTG5nTGF0KG5lMi5sbmcsIG5lMi5sYXQpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdy5sbmcgPSBNYXRoLm1pbihzdzIubG5nLCBzdy5sbmcpO1xuICAgICAgICAgICAgc3cubGF0ID0gTWF0aC5taW4oc3cyLmxhdCwgc3cubGF0KTtcbiAgICAgICAgICAgIG5lLmxuZyA9IE1hdGgubWF4KG5lMi5sbmcsIG5lLmxuZyk7XG4gICAgICAgICAgICBuZS5sYXQgPSBNYXRoLm1heChuZTIubGF0LCBuZS5sYXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGUgZXF1aWRpc3RhbnQgZnJvbSB0aGUgYm91bmRpbmcgYm94J3MgY29ybmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IFRoZSBib3VuZGluZyBib3gncyBjZW50ZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhbLTczLjk4NzYsIDQwLjc2NjFdLCBbLTczLjkzOTcsIDQwLjgwMDJdKTtcbiAgICAgKiBsbGIuZ2V0Q2VudGVyKCk7IC8vID0gTG5nTGF0IHtsbmc6IC03My45NjM2NSwgbGF0OiA0MC43ODMxNX1cbiAgICAgKi9cbiAgICBnZXRDZW50ZXIoKSAgICAgICAgIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXQoKHRoaXMuX3N3LmxuZyArIHRoaXMuX25lLmxuZykgLyAyLCAodGhpcy5fc3cubGF0ICsgdGhpcy5fbmUubGF0KSAvIDIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNvdXRod2VzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IFRoZSBzb3V0aHdlc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICovXG4gICAgZ2V0U291dGhXZXN0KCkgICAgICAgICB7IHJldHVybiB0aGlzLl9zdzsgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBub3J0aGVhc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgKlxuICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIG5vcnRoZWFzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKi9cbiAgICBnZXROb3J0aEVhc3QoKSAgICAgICAgIHsgcmV0dXJuIHRoaXMuX25lOyB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIG5vcnRod2VzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAqXG4gICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgbm9ydGh3ZXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqL1xuICAgIGdldE5vcnRoV2VzdCgpICAgICAgICAgeyByZXR1cm4gbmV3IExuZ0xhdCh0aGlzLmdldFdlc3QoKSwgdGhpcy5nZXROb3J0aCgpKTsgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBzb3V0aGVhc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgKlxuICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIHNvdXRoZWFzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKi9cbiAgICBnZXRTb3V0aEVhc3QoKSAgICAgICAgIHsgcmV0dXJuIG5ldyBMbmdMYXQodGhpcy5nZXRFYXN0KCksIHRoaXMuZ2V0U291dGgoKSk7IH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgd2VzdCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgKlxuICAgICogQHJldHVybnMge251bWJlcn0gVGhlIHdlc3QgZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqL1xuICAgIGdldFdlc3QoKSAgICAgICAgIHsgcmV0dXJuIHRoaXMuX3N3LmxuZzsgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBzb3V0aCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgKlxuICAgICogQHJldHVybnMge251bWJlcn0gVGhlIHNvdXRoIGVkZ2Ugb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKi9cbiAgICBnZXRTb3V0aCgpICAgICAgICAgeyByZXR1cm4gdGhpcy5fc3cubGF0OyB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIGVhc3QgZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICpcbiAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBlYXN0IGVkZ2Ugb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKi9cbiAgICBnZXRFYXN0KCkgICAgICAgICB7IHJldHVybiB0aGlzLl9uZS5sbmc7IH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgbm9ydGggZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICpcbiAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBub3J0aCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICovXG4gICAgZ2V0Tm9ydGgoKSAgICAgICAgIHsgcmV0dXJuIHRoaXMuX25lLmxhdDsgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYm91bmRpbmcgYm94IHJlcHJlc2VudGVkIGFzIGFuIGFycmF5LlxuICAgICAqXG4gICAgICogQHJldHVybnMge0FycmF5PEFycmF5PG51bWJlcj4+fSBUaGUgYm91bmRpbmcgYm94IHJlcHJlc2VudGVkIGFzIGFuIGFycmF5LCBjb25zaXN0aW5nIG9mIHRoZVxuICAgICAqICAgc291dGh3ZXN0IGFuZCBub3J0aGVhc3QgY29vcmRpbmF0ZXMgb2YgdGhlIGJvdW5kaW5nIHJlcHJlc2VudGVkIGFzIGFycmF5cyBvZiBudW1iZXJzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGxsYiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXSk7XG4gICAgICogbGxiLnRvQXJyYXkoKTsgLy8gPSBbWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXV1cbiAgICAgKi9cbiAgICB0b0FycmF5KCkge1xuICAgICAgICByZXR1cm4gW3RoaXMuX3N3LnRvQXJyYXkoKSwgdGhpcy5fbmUudG9BcnJheSgpXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGJvdW5kaW5nIGJveCByZXByZXNlbnRlZCBhcyBhIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBib3VuZGluZyBib3ggcmVwcmVzZW50cyBhcyBhIHN0cmluZyBvZiB0aGUgZm9ybWF0XG4gICAgICogICBgJ0xuZ0xhdEJvdW5kcyhMbmdMYXQobG5nLCBsYXQpLCBMbmdMYXQobG5nLCBsYXQpKSdgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGxsYiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXSk7XG4gICAgICogbGxiLnRvU3RyaW5nKCk7IC8vID0gXCJMbmdMYXRCb3VuZHMoTG5nTGF0KC03My45ODc2LCA0MC43NjYxKSwgTG5nTGF0KC03My45Mzk3LCA0MC44MDAyKSlcIlxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYExuZ0xhdEJvdW5kcygke3RoaXMuX3N3LnRvU3RyaW5nKCl9LCAke3RoaXMuX25lLnRvU3RyaW5nKCl9KWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGJvdW5kaW5nIGJveCBpcyBhbiBlbXB0eS9gbnVsbGAtdHlwZSBib3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBib3VuZHMgaGF2ZSBiZWVuIGRlZmluZWQsIG90aGVyd2lzZSBmYWxzZS5cbiAgICAgKi9cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gISh0aGlzLl9zdyAmJiB0aGlzLl9uZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYW4gYXJyYXkgdG8gYSBgTG5nTGF0Qm91bmRzYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBJZiBhIGBMbmdMYXRCb3VuZHNgIG9iamVjdCBpcyBwYXNzZWQgaW4sIHRoZSBmdW5jdGlvbiByZXR1cm5zIGl0IHVuY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEludGVybmFsbHksIHRoZSBmdW5jdGlvbiBjYWxscyBgTG5nTGF0I2NvbnZlcnRgIHRvIGNvbnZlcnQgYXJyYXlzIHRvIGBMbmdMYXRgIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0Qm91bmRzTGlrZX0gaW5wdXQgQW4gYXJyYXkgb2YgdHdvIGNvb3JkaW5hdGVzIHRvIGNvbnZlcnQsIG9yIGEgYExuZ0xhdEJvdW5kc2Agb2JqZWN0IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0Qm91bmRzfSBBIG5ldyBgTG5nTGF0Qm91bmRzYCBvYmplY3QsIGlmIGEgY29udmVyc2lvbiBvY2N1cnJlZCwgb3IgdGhlIG9yaWdpbmFsIGBMbmdMYXRCb3VuZHNgIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBhcnIgPSBbWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXV07XG4gICAgICogdmFyIGxsYiA9IG1hcGJveGdsLkxuZ0xhdEJvdW5kcy5jb252ZXJ0KGFycik7XG4gICAgICogbGxiOyAgIC8vID0gTG5nTGF0Qm91bmRzIHtfc3c6IExuZ0xhdCB7bG5nOiAtNzMuOTg3NiwgbGF0OiA0MC43NjYxfSwgX25lOiBMbmdMYXQge2xuZzogLTczLjkzOTcsIGxhdDogNDAuODAwMn19XG4gICAgICovXG4gICAgc3RhdGljIGNvbnZlcnQoaW5wdXQgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAge1xuICAgICAgICBpZiAoIWlucHV0IHx8IGlucHV0IGluc3RhbmNlb2YgTG5nTGF0Qm91bmRzKSByZXR1cm4gaW5wdXQ7XG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0Qm91bmRzKGlucHV0KTtcbiAgICB9XG59XG5cbi8qKlxuICogQSB7QGxpbmsgTG5nTGF0Qm91bmRzfSBvYmplY3QsIGFuIGFycmF5IG9mIHtAbGluayBMbmdMYXRMaWtlfSBvYmplY3RzIGluIFtzdywgbmVdIG9yZGVyLFxuICogb3IgYW4gYXJyYXkgb2YgbnVtYmVycyBpbiBbd2VzdCwgc291dGgsIGVhc3QsIG5vcnRoXSBvcmRlci5cbiAqXG4gKiBAdHlwZWRlZiB7TG5nTGF0Qm91bmRzIHwgW0xuZ0xhdExpa2UsIExuZ0xhdExpa2VdIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl19IExuZ0xhdEJvdW5kc0xpa2VcbiAqIEBleGFtcGxlXG4gKiB2YXIgdjEgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKFxuICogICBuZXcgbWFwYm94Z2wuTG5nTGF0KC03My45ODc2LCA0MC43NjYxKSxcbiAqICAgbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTM5NywgNDAuODAwMilcbiAqICk7XG4gKiB2YXIgdjIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKFstNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl0pXG4gKiB2YXIgdjMgPSBbWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXV07XG4gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxubW9kdWxlLmV4cG9ydHMgPSBMbmdMYXRCb3VuZHM7XG4iLCIvLyAgICAgIFxuXG5jb25zdCBMbmdMYXQgPSByZXF1aXJlKCcuL2xuZ19sYXQnKSxcbiAgICBQb2ludCA9IHJlcXVpcmUoJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknKSxcbiAgICBDb29yZGluYXRlID0gcmVxdWlyZSgnLi9jb29yZGluYXRlJyksXG4gICAgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpLFxuICAgIGludGVycCA9IHJlcXVpcmUoJy4uL3N0eWxlLXNwZWMvdXRpbC9pbnRlcnBvbGF0ZScpLm51bWJlcixcbiAgICB0aWxlQ292ZXIgPSByZXF1aXJlKCcuLi91dGlsL3RpbGVfY292ZXInKSxcbiAgICB7Q2Fub25pY2FsVGlsZUlELCBVbndyYXBwZWRUaWxlSUR9ID0gcmVxdWlyZSgnLi4vc291cmNlL3RpbGVfaWQnKSxcbiAgICBFWFRFTlQgPSByZXF1aXJlKCcuLi9kYXRhL2V4dGVudCcpLFxuICAgIGdsbWF0cml4ID0gcmVxdWlyZSgnQG1hcGJveC9nbC1tYXRyaXgnKTtcblxuY29uc3QgdmVjNCA9IGdsbWF0cml4LnZlYzQsXG4gICAgbWF0NCA9IGdsbWF0cml4Lm1hdDQsXG4gICAgbWF0MiA9IGdsbWF0cml4Lm1hdDI7XG5cbi8qKlxuICogQSBzaW5nbGUgdHJhbnNmb3JtLCBnZW5lcmFsbHkgdXNlZCBmb3IgYSBzaW5nbGUgdGlsZSB0byBiZVxuICogc2NhbGVkLCByb3RhdGVkLCBhbmQgem9vbWVkLlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgVHJhbnNmb3JtIHtcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKG1pblpvb20gICAgICAgICAsIG1heFpvb20gICAgICAgICAsIHJlbmRlcldvcmxkQ29waWVzICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLnRpbGVTaXplID0gNTEyOyAvLyBjb25zdGFudFxuXG4gICAgICAgIHRoaXMuX3JlbmRlcldvcmxkQ29waWVzID0gcmVuZGVyV29ybGRDb3BpZXMgPT09IHVuZGVmaW5lZCA/IHRydWUgOiByZW5kZXJXb3JsZENvcGllcztcbiAgICAgICAgdGhpcy5fbWluWm9vbSA9IG1pblpvb20gfHwgMDtcbiAgICAgICAgdGhpcy5fbWF4Wm9vbSA9IG1heFpvb20gfHwgMjI7XG5cbiAgICAgICAgdGhpcy5sYXRSYW5nZSA9IFstODUuMDUxMTMsIDg1LjA1MTEzXTtcblxuICAgICAgICB0aGlzLndpZHRoID0gMDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAwO1xuICAgICAgICB0aGlzLl9jZW50ZXIgPSBuZXcgTG5nTGF0KDAsIDApO1xuICAgICAgICB0aGlzLnpvb20gPSAwO1xuICAgICAgICB0aGlzLmFuZ2xlID0gMDtcbiAgICAgICAgdGhpcy5fZm92ID0gMC42NDM1MDExMDg3OTMyODQ0O1xuICAgICAgICB0aGlzLl9waXRjaCA9IDA7XG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9wb3NNYXRyaXhDYWNoZSA9IHt9O1xuICAgICAgICB0aGlzLl9hbGlnbmVkUG9zTWF0cml4Q2FjaGUgPSB7fTtcbiAgICB9XG5cbiAgICBjbG9uZSgpICAgICAgICAgICAge1xuICAgICAgICBjb25zdCBjbG9uZSA9IG5ldyBUcmFuc2Zvcm0odGhpcy5fbWluWm9vbSwgdGhpcy5fbWF4Wm9vbSwgdGhpcy5fcmVuZGVyV29ybGRDb3BpZXMpO1xuICAgICAgICBjbG9uZS50aWxlU2l6ZSA9IHRoaXMudGlsZVNpemU7XG4gICAgICAgIGNsb25lLmxhdFJhbmdlID0gdGhpcy5sYXRSYW5nZTtcbiAgICAgICAgY2xvbmUud2lkdGggPSB0aGlzLndpZHRoO1xuICAgICAgICBjbG9uZS5oZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICAgICAgY2xvbmUuX2NlbnRlciA9IHRoaXMuX2NlbnRlcjtcbiAgICAgICAgY2xvbmUuem9vbSA9IHRoaXMuem9vbTtcbiAgICAgICAgY2xvbmUuYW5nbGUgPSB0aGlzLmFuZ2xlO1xuICAgICAgICBjbG9uZS5fZm92ID0gdGhpcy5fZm92O1xuICAgICAgICBjbG9uZS5fcGl0Y2ggPSB0aGlzLl9waXRjaDtcbiAgICAgICAgY2xvbmUuX3VubW9kaWZpZWQgPSB0aGlzLl91bm1vZGlmaWVkO1xuICAgICAgICBjbG9uZS5fY2FsY01hdHJpY2VzKCk7XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG5cbiAgICBnZXQgbWluWm9vbSgpICAgICAgICAgeyByZXR1cm4gdGhpcy5fbWluWm9vbTsgfVxuICAgIHNldCBtaW5ab29tKHpvb20gICAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5fbWluWm9vbSA9PT0gem9vbSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9taW5ab29tID0gem9vbTtcbiAgICAgICAgdGhpcy56b29tID0gTWF0aC5tYXgodGhpcy56b29tLCB6b29tKTtcbiAgICB9XG5cbiAgICBnZXQgbWF4Wm9vbSgpICAgICAgICAgeyByZXR1cm4gdGhpcy5fbWF4Wm9vbTsgfVxuICAgIHNldCBtYXhab29tKHpvb20gICAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5fbWF4Wm9vbSA9PT0gem9vbSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9tYXhab29tID0gem9vbTtcbiAgICAgICAgdGhpcy56b29tID0gTWF0aC5taW4odGhpcy56b29tLCB6b29tKTtcbiAgICB9XG5cbiAgICBnZXQgcmVuZGVyV29ybGRDb3BpZXMoKSAgICAgICAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJXb3JsZENvcGllcztcbiAgICB9XG5cbiAgICBnZXQgd29ybGRTaXplKCkgICAgICAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpbGVTaXplICogdGhpcy5zY2FsZTtcbiAgICB9XG5cbiAgICBnZXQgY2VudGVyUG9pbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemUuX2RpdigyKTtcbiAgICB9XG5cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgfVxuXG4gICAgZ2V0IGJlYXJpbmcoKSAgICAgICAgIHtcbiAgICAgICAgcmV0dXJuIC10aGlzLmFuZ2xlIC8gTWF0aC5QSSAqIDE4MDtcbiAgICB9XG4gICAgc2V0IGJlYXJpbmcoYmVhcmluZyAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGIgPSAtdXRpbC53cmFwKGJlYXJpbmcsIC0xODAsIDE4MCkgKiBNYXRoLlBJIC8gMTgwO1xuICAgICAgICBpZiAodGhpcy5hbmdsZSA9PT0gYikgcmV0dXJuO1xuICAgICAgICB0aGlzLl91bm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW5nbGUgPSBiO1xuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcblxuICAgICAgICAvLyAyeDIgbWF0cml4IGZvciByb3RhdGluZyBwb2ludHNcbiAgICAgICAgdGhpcy5yb3RhdGlvbk1hdHJpeCA9IG1hdDIuY3JlYXRlKCk7XG4gICAgICAgIG1hdDIucm90YXRlKHRoaXMucm90YXRpb25NYXRyaXgsIHRoaXMucm90YXRpb25NYXRyaXgsIHRoaXMuYW5nbGUpO1xuICAgIH1cblxuICAgIGdldCBwaXRjaCgpICAgICAgICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGl0Y2ggLyBNYXRoLlBJICogMTgwO1xuICAgIH1cbiAgICBzZXQgcGl0Y2gocGl0Y2ggICAgICAgICkge1xuICAgICAgICBjb25zdCBwID0gdXRpbC5jbGFtcChwaXRjaCwgMCwgNjApIC8gMTgwICogTWF0aC5QSTtcbiAgICAgICAgaWYgKHRoaXMuX3BpdGNoID09PSBwKSByZXR1cm47XG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcGl0Y2ggPSBwO1xuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcbiAgICB9XG5cbiAgICBnZXQgZm92KCkgICAgICAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb3YgLyBNYXRoLlBJICogMTgwO1xuICAgIH1cbiAgICBzZXQgZm92KGZvdiAgICAgICAgKSB7XG4gICAgICAgIGZvdiA9IE1hdGgubWF4KDAuMDEsIE1hdGgubWluKDYwLCBmb3YpKTtcbiAgICAgICAgaWYgKHRoaXMuX2ZvdiA9PT0gZm92KSByZXR1cm47XG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZm92ID0gZm92IC8gMTgwICogTWF0aC5QSTtcbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgfVxuXG4gICAgZ2V0IHpvb20oKSAgICAgICAgIHsgcmV0dXJuIHRoaXMuX3pvb207IH1cbiAgICBzZXQgem9vbSh6b29tICAgICAgICApIHtcbiAgICAgICAgY29uc3QgeiA9IE1hdGgubWluKE1hdGgubWF4KHpvb20sIHRoaXMubWluWm9vbSksIHRoaXMubWF4Wm9vbSk7XG4gICAgICAgIGlmICh0aGlzLl96b29tID09PSB6KSByZXR1cm47XG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fem9vbSA9IHo7XG4gICAgICAgIHRoaXMuc2NhbGUgPSB0aGlzLnpvb21TY2FsZSh6KTtcbiAgICAgICAgdGhpcy50aWxlWm9vbSA9IE1hdGguZmxvb3Ioeik7XG4gICAgICAgIHRoaXMuem9vbUZyYWN0aW9uID0geiAtIHRoaXMudGlsZVpvb207XG4gICAgICAgIHRoaXMuX2NvbnN0cmFpbigpO1xuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcbiAgICB9XG5cbiAgICBnZXQgY2VudGVyKCkgICAgICAgICB7IHJldHVybiB0aGlzLl9jZW50ZXI7IH1cbiAgICBzZXQgY2VudGVyKGNlbnRlciAgICAgICAgKSB7XG4gICAgICAgIGlmIChjZW50ZXIubGF0ID09PSB0aGlzLl9jZW50ZXIubGF0ICYmIGNlbnRlci5sbmcgPT09IHRoaXMuX2NlbnRlci5sbmcpIHJldHVybjtcbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jZW50ZXIgPSBjZW50ZXI7XG4gICAgICAgIHRoaXMuX2NvbnN0cmFpbigpO1xuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB6b29tIGxldmVsIHRoYXQgd2lsbCBjb3ZlciBhbGwgdGlsZXMgdGhlIHRyYW5zZm9ybVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMudGlsZVNpemVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucm91bmRab29tXG4gICAgICogQHJldHVybnMge251bWJlcn0gem9vbSBsZXZlbFxuICAgICAqL1xuICAgIGNvdmVyaW5nWm9vbUxldmVsKG9wdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICByZXR1cm4gKG9wdGlvbnMucm91bmRab29tID8gTWF0aC5yb3VuZCA6IE1hdGguZmxvb3IpKFxuICAgICAgICAgICAgdGhpcy56b29tICsgdGhpcy5zY2FsZVpvb20odGhpcy50aWxlU2l6ZSAvIG9wdGlvbnMudGlsZVNpemUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFueSBcIndyYXBwZWRcIiBjb3BpZXMgb2YgYSBnaXZlbiB0aWxlIGNvb3JkaW5hdGUgdGhhdCBhcmUgdmlzaWJsZVxuICAgICAqIGluIHRoZSBjdXJyZW50IHZpZXcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldFZpc2libGVVbndyYXBwZWRDb29yZGluYXRlcyh0aWxlSUQgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCB1bCA9IHRoaXMucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCgwLCAwKSwgMCk7XG4gICAgICAgIGNvbnN0IHVyID0gdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KHRoaXMud2lkdGgsIDApLCAwKTtcbiAgICAgICAgY29uc3QgdzAgPSBNYXRoLmZsb29yKHVsLmNvbHVtbik7XG4gICAgICAgIGNvbnN0IHcxID0gTWF0aC5mbG9vcih1ci5jb2x1bW4pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbbmV3IFVud3JhcHBlZFRpbGVJRCgwLCB0aWxlSUQpXTtcbiAgICAgICAgaWYgKHRoaXMuX3JlbmRlcldvcmxkQ29waWVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB3ID0gdzA7IHcgPD0gdzE7IHcrKykge1xuICAgICAgICAgICAgICAgIGlmICh3ID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgVW53cmFwcGVkVGlsZUlEKHcsIHRpbGVJRCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFsbCBjb29yZGluYXRlcyB0aGF0IGNvdWxkIGNvdmVyIHRoaXMgdHJhbnNmb3JtIGZvciBhIGNvdmVyaW5nXG4gICAgICogem9vbSBsZXZlbC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLnRpbGVTaXplXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMubWluem9vbVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLm1heHpvb21cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucm91bmRab29tXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLnJlcGFyc2VPdmVyc2NhbGVkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLnJlbmRlcldvcmxkQ29waWVzXG4gICAgICogQHJldHVybnMge0FycmF5PFRpbGU+fSB0aWxlc1xuICAgICAqL1xuICAgIGNvdmVyaW5nVGlsZXMoXG4gICAgICAgIG9wdGlvbnMgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgIFxuICAgICkge1xuICAgICAgICBsZXQgeiA9IHRoaXMuY292ZXJpbmdab29tTGV2ZWwob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGFjdHVhbFogPSB6O1xuXG4gICAgICAgIGlmIChvcHRpb25zLm1pbnpvb20gIT09IHVuZGVmaW5lZCAmJiB6IDwgb3B0aW9ucy5taW56b29tKSByZXR1cm4gW107XG4gICAgICAgIGlmIChvcHRpb25zLm1heHpvb20gIT09IHVuZGVmaW5lZCAmJiB6ID4gb3B0aW9ucy5tYXh6b29tKSB6ID0gb3B0aW9ucy5tYXh6b29tO1xuXG4gICAgICAgIGNvbnN0IGNlbnRlckNvb3JkID0gdGhpcy5wb2ludENvb3JkaW5hdGUodGhpcy5jZW50ZXJQb2ludCwgeik7XG4gICAgICAgIGNvbnN0IGNlbnRlclBvaW50ID0gbmV3IFBvaW50KGNlbnRlckNvb3JkLmNvbHVtbiAtIDAuNSwgY2VudGVyQ29vcmQucm93IC0gMC41KTtcbiAgICAgICAgY29uc3QgY29ybmVyQ29vcmRzID0gW1xuICAgICAgICAgICAgdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KDAsIDApLCB6KSxcbiAgICAgICAgICAgIHRoaXMucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCh0aGlzLndpZHRoLCAwKSwgeiksXG4gICAgICAgICAgICB0aGlzLnBvaW50Q29vcmRpbmF0ZShuZXcgUG9pbnQodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpLCB6KSxcbiAgICAgICAgICAgIHRoaXMucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCgwLCB0aGlzLmhlaWdodCksIHopXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiB0aWxlQ292ZXIoeiwgY29ybmVyQ29vcmRzLCBvcHRpb25zLnJlcGFyc2VPdmVyc2NhbGVkID8gYWN0dWFsWiA6IHosIHRoaXMuX3JlbmRlcldvcmxkQ29waWVzKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGNlbnRlclBvaW50LmRpc3QoYS5jYW5vbmljYWwpIC0gY2VudGVyUG9pbnQuZGlzdChiLmNhbm9uaWNhbCkpO1xuICAgIH1cblxuICAgIHJlc2l6ZSh3aWR0aCAgICAgICAgLCBoZWlnaHQgICAgICAgICkge1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICAgIHRoaXMucGl4ZWxzVG9HTFVuaXRzID0gWzIgLyB3aWR0aCwgLTIgLyBoZWlnaHRdO1xuICAgICAgICB0aGlzLl9jb25zdHJhaW4oKTtcbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgfVxuXG4gICAgZ2V0IHVubW9kaWZpZWQoKSAgICAgICAgICB7IHJldHVybiB0aGlzLl91bm1vZGlmaWVkOyB9XG5cbiAgICB6b29tU2NhbGUoem9vbSAgICAgICAgKSB7IHJldHVybiBNYXRoLnBvdygyLCB6b29tKTsgfVxuICAgIHNjYWxlWm9vbShzY2FsZSAgICAgICAgKSB7IHJldHVybiBNYXRoLmxvZyhzY2FsZSkgLyBNYXRoLkxOMjsgfVxuXG4gICAgcHJvamVjdChsbmdsYXQgICAgICAgICkge1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KFxuICAgICAgICAgICAgdGhpcy5sbmdYKGxuZ2xhdC5sbmcpLFxuICAgICAgICAgICAgdGhpcy5sYXRZKGxuZ2xhdC5sYXQpKTtcbiAgICB9XG5cbiAgICB1bnByb2plY3QocG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXQoXG4gICAgICAgICAgICB0aGlzLnhMbmcocG9pbnQueCksXG4gICAgICAgICAgICB0aGlzLnlMYXQocG9pbnQueSkpO1xuICAgIH1cblxuICAgIGdldCB4KCkgICAgICAgICB7IHJldHVybiB0aGlzLmxuZ1godGhpcy5jZW50ZXIubG5nKTsgfVxuICAgIGdldCB5KCkgICAgICAgICB7IHJldHVybiB0aGlzLmxhdFkodGhpcy5jZW50ZXIubGF0KTsgfVxuXG4gICAgZ2V0IHBvaW50KCkgeyByZXR1cm4gbmV3IFBvaW50KHRoaXMueCwgdGhpcy55KTsgfVxuXG4gICAgLyoqXG4gICAgICogbGF0aXR1ZGUgdG8gYWJzb2x1dGUgeCBjb29yZFxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IHBpeGVsIGNvb3JkaW5hdGVcbiAgICAgKi9cbiAgICBsbmdYKGxuZyAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiAoMTgwICsgbG5nKSAqIHRoaXMud29ybGRTaXplIC8gMzYwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBsYXRpdHVkZSB0byBhYnNvbHV0ZSB5IGNvb3JkXG4gICAgICogQHJldHVybnMge251bWJlcn0gcGl4ZWwgY29vcmRpbmF0ZVxuICAgICAqL1xuICAgIGxhdFkobGF0ICAgICAgICApIHtcbiAgICAgICAgY29uc3QgeSA9IDE4MCAvIE1hdGguUEkgKiBNYXRoLmxvZyhNYXRoLnRhbihNYXRoLlBJIC8gNCArIGxhdCAqIE1hdGguUEkgLyAzNjApKTtcbiAgICAgICAgcmV0dXJuICgxODAgLSB5KSAqIHRoaXMud29ybGRTaXplIC8gMzYwO1xuICAgIH1cblxuICAgIHhMbmcoeCkge1xuICAgICAgICByZXR1cm4geCAqIDM2MCAvIHRoaXMud29ybGRTaXplIC0gMTgwO1xuICAgIH1cbiAgICB5TGF0KHkpIHtcbiAgICAgICAgY29uc3QgeTIgPSAxODAgLSB5ICogMzYwIC8gdGhpcy53b3JsZFNpemU7XG4gICAgICAgIHJldHVybiAzNjAgLyBNYXRoLlBJICogTWF0aC5hdGFuKE1hdGguZXhwKHkyICogTWF0aC5QSSAvIDE4MCkpIC0gOTA7XG4gICAgfVxuXG4gICAgc2V0TG9jYXRpb25BdFBvaW50KGxuZ2xhdCAgICAgICAgLCBwb2ludCAgICAgICApIHtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlID0gdGhpcy5wb2ludENvb3JkaW5hdGUocG9pbnQpLl9zdWIodGhpcy5wb2ludENvb3JkaW5hdGUodGhpcy5jZW50ZXJQb2ludCkpO1xuICAgICAgICB0aGlzLmNlbnRlciA9IHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKHRoaXMubG9jYXRpb25Db29yZGluYXRlKGxuZ2xhdCkuX3N1Yih0cmFuc2xhdGUpKTtcbiAgICAgICAgaWYgKHRoaXMuX3JlbmRlcldvcmxkQ29waWVzKSB7XG4gICAgICAgICAgICB0aGlzLmNlbnRlciA9IHRoaXMuY2VudGVyLndyYXAoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgbG9jYXRpb24sIHJldHVybiB0aGUgc2NyZWVuIHBvaW50IHRoYXQgY29ycmVzcG9uZHMgdG8gaXRcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdH0gbG5nbGF0IGxvY2F0aW9uXG4gICAgICogQHJldHVybnMge1BvaW50fSBzY3JlZW4gcG9pbnRcbiAgICAgKi9cbiAgICBsb2NhdGlvblBvaW50KGxuZ2xhdCAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvb3JkaW5hdGVQb2ludCh0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZShsbmdsYXQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHBvaW50IG9uIHNjcmVlbiwgcmV0dXJuIGl0cyBsbmdsYXRcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHNjcmVlbiBwb2ludFxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IGxuZ2xhdCBsb2NhdGlvblxuICAgICAqL1xuICAgIHBvaW50TG9jYXRpb24ocCAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKHRoaXMucG9pbnRDb29yZGluYXRlKHApKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIGdlb2dyYXBoaWNhbCBsbmdsYXQsIHJldHVybiBhbiB1bnJvdW5kZWRcbiAgICAgKiBjb29yZGluYXRlIHRoYXQgcmVwcmVzZW50cyBpdCBhdCB0aGlzIHRyYW5zZm9ybSdzIHpvb20gbGV2ZWwuXG4gICAgICogQHBhcmFtIHtMbmdMYXR9IGxuZ2xhdFxuICAgICAqIEByZXR1cm5zIHtDb29yZGluYXRlfVxuICAgICAqL1xuICAgIGxvY2F0aW9uQ29vcmRpbmF0ZShsbmdsYXQgICAgICAgICkge1xuICAgICAgICByZXR1cm4gbmV3IENvb3JkaW5hdGUoXG4gICAgICAgICAgICB0aGlzLmxuZ1gobG5nbGF0LmxuZykgLyB0aGlzLnRpbGVTaXplLFxuICAgICAgICAgICAgdGhpcy5sYXRZKGxuZ2xhdC5sYXQpIC8gdGhpcy50aWxlU2l6ZSxcbiAgICAgICAgICAgIHRoaXMuem9vbSkuem9vbVRvKHRoaXMudGlsZVpvb20pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgQ29vcmRpbmF0ZSwgcmV0dXJuIGl0cyBnZW9ncmFwaGljYWwgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZFxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IGxuZ2xhdFxuICAgICAqL1xuICAgIGNvb3JkaW5hdGVMb2NhdGlvbihjb29yZCkge1xuICAgICAgICBjb25zdCB6b29tZWRDb29yZCA9IGNvb3JkLnpvb21Ubyh0aGlzLnpvb20pO1xuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdChcbiAgICAgICAgICAgIHRoaXMueExuZyh6b29tZWRDb29yZC5jb2x1bW4gKiB0aGlzLnRpbGVTaXplKSxcbiAgICAgICAgICAgIHRoaXMueUxhdCh6b29tZWRDb29yZC5yb3cgKiB0aGlzLnRpbGVTaXplKSk7XG4gICAgfVxuXG4gICAgcG9pbnRDb29yZGluYXRlKHAgICAgICAgLCB6b29tICAgICAgICAgKSB7XG4gICAgICAgIGlmICh6b29tID09PSB1bmRlZmluZWQpIHpvb20gPSB0aGlzLnRpbGVab29tO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldFogPSAwO1xuICAgICAgICAvLyBzaW5jZSB3ZSBkb24ndCBrbm93IHRoZSBjb3JyZWN0IHByb2plY3RlZCB6IHZhbHVlIGZvciB0aGUgcG9pbnQsXG4gICAgICAgIC8vIHVucHJvamVjdCB0d28gcG9pbnRzIHRvIGdldCBhIGxpbmUgYW5kIHRoZW4gZmluZCB0aGUgcG9pbnQgb24gdGhhdFxuICAgICAgICAvLyBsaW5lIHdpdGggej0wXG5cbiAgICAgICAgY29uc3QgY29vcmQwID0gW3AueCwgcC55LCAwLCAxXTtcbiAgICAgICAgY29uc3QgY29vcmQxID0gW3AueCwgcC55LCAxLCAxXTtcblxuICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQoY29vcmQwLCBjb29yZDAsIHRoaXMucGl4ZWxNYXRyaXhJbnZlcnNlKTtcbiAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KGNvb3JkMSwgY29vcmQxLCB0aGlzLnBpeGVsTWF0cml4SW52ZXJzZSk7XG5cbiAgICAgICAgY29uc3QgdzAgPSBjb29yZDBbM107XG4gICAgICAgIGNvbnN0IHcxID0gY29vcmQxWzNdO1xuICAgICAgICBjb25zdCB4MCA9IGNvb3JkMFswXSAvIHcwO1xuICAgICAgICBjb25zdCB4MSA9IGNvb3JkMVswXSAvIHcxO1xuICAgICAgICBjb25zdCB5MCA9IGNvb3JkMFsxXSAvIHcwO1xuICAgICAgICBjb25zdCB5MSA9IGNvb3JkMVsxXSAvIHcxO1xuICAgICAgICBjb25zdCB6MCA9IGNvb3JkMFsyXSAvIHcwO1xuICAgICAgICBjb25zdCB6MSA9IGNvb3JkMVsyXSAvIHcxO1xuXG4gICAgICAgIGNvbnN0IHQgPSB6MCA9PT0gejEgPyAwIDogKHRhcmdldFogLSB6MCkgLyAoejEgLSB6MCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBDb29yZGluYXRlKFxuICAgICAgICAgICAgaW50ZXJwKHgwLCB4MSwgdCkgLyB0aGlzLnRpbGVTaXplLFxuICAgICAgICAgICAgaW50ZXJwKHkwLCB5MSwgdCkgLyB0aGlzLnRpbGVTaXplLFxuICAgICAgICAgICAgdGhpcy56b29tKS5fem9vbVRvKHpvb20pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgY29vcmRpbmF0ZSwgcmV0dXJuIHRoZSBzY3JlZW4gcG9pbnQgdGhhdCBjb3JyZXNwb25kcyB0byBpdFxuICAgICAqIEBwYXJhbSB7Q29vcmRpbmF0ZX0gY29vcmRcbiAgICAgKiBAcmV0dXJucyB7UG9pbnR9IHNjcmVlbiBwb2ludFxuICAgICAqL1xuICAgIGNvb3JkaW5hdGVQb2ludChjb29yZCkge1xuICAgICAgICBjb25zdCB6b29tZWRDb29yZCA9IGNvb3JkLnpvb21Ubyh0aGlzLnpvb20pO1xuICAgICAgICBjb25zdCBwID0gW3pvb21lZENvb3JkLmNvbHVtbiAqIHRoaXMudGlsZVNpemUsIHpvb21lZENvb3JkLnJvdyAqIHRoaXMudGlsZVNpemUsIDAsIDFdO1xuICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQocCwgcCwgdGhpcy5waXhlbE1hdHJpeCk7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQocFswXSAvIHBbM10sIHBbMV0gLyBwWzNdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIHBvc01hdHJpeCB0aGF0LCBnaXZlbiBhIHRpbGUgY29vcmRpbmF0ZSwgd291bGQgYmUgdXNlZCB0byBkaXNwbGF5IHRoZSB0aWxlIG9uIGEgbWFwLlxuICAgICAqIEBwYXJhbSB7VW53cmFwcGVkVGlsZUlEfSB1bndyYXBwZWRUaWxlSUQ7XG4gICAgICovXG4gICAgY2FsY3VsYXRlUG9zTWF0cml4KHVud3JhcHBlZFRpbGVJRCAgICAgICAgICAgICAgICAgLCBhbGlnbmVkICAgICAgICAgID0gZmFsc2UpICAgICAgICAgICAgICAge1xuICAgICAgICBjb25zdCBwb3NNYXRyaXhLZXkgPSB1bndyYXBwZWRUaWxlSUQua2V5O1xuICAgICAgICBjb25zdCBjYWNoZSA9IGFsaWduZWQgPyB0aGlzLl9hbGlnbmVkUG9zTWF0cml4Q2FjaGUgOiB0aGlzLl9wb3NNYXRyaXhDYWNoZTtcbiAgICAgICAgaWYgKGNhY2hlW3Bvc01hdHJpeEtleV0pIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZVtwb3NNYXRyaXhLZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2Fub25pY2FsID0gdW53cmFwcGVkVGlsZUlELmNhbm9uaWNhbDtcbiAgICAgICAgY29uc3Qgc2NhbGUgPSB0aGlzLndvcmxkU2l6ZSAvIHRoaXMuem9vbVNjYWxlKGNhbm9uaWNhbC56KTtcbiAgICAgICAgY29uc3QgdW53cmFwcGVkWCA9IGNhbm9uaWNhbC54ICsgTWF0aC5wb3coMiwgY2Fub25pY2FsLnopICogdW53cmFwcGVkVGlsZUlELndyYXA7XG5cbiAgICAgICAgY29uc3QgcG9zTWF0cml4ID0gbWF0NC5pZGVudGl0eShuZXcgRmxvYXQ2NEFycmF5KDE2KSk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKHBvc01hdHJpeCwgcG9zTWF0cml4LCBbdW53cmFwcGVkWCAqIHNjYWxlLCBjYW5vbmljYWwueSAqIHNjYWxlLCAwXSk7XG4gICAgICAgIG1hdDQuc2NhbGUocG9zTWF0cml4LCBwb3NNYXRyaXgsIFtzY2FsZSAvIEVYVEVOVCwgc2NhbGUgLyBFWFRFTlQsIDFdKTtcbiAgICAgICAgbWF0NC5tdWx0aXBseShwb3NNYXRyaXgsIGFsaWduZWQgPyB0aGlzLmFsaWduZWRQcm9qTWF0cml4IDogdGhpcy5wcm9qTWF0cml4LCBwb3NNYXRyaXgpO1xuXG4gICAgICAgIGNhY2hlW3Bvc01hdHJpeEtleV0gPSBuZXcgRmxvYXQzMkFycmF5KHBvc01hdHJpeCk7XG4gICAgICAgIHJldHVybiBjYWNoZVtwb3NNYXRyaXhLZXldO1xuICAgIH1cblxuICAgIF9jb25zdHJhaW4oKSB7XG4gICAgICAgIGlmICghdGhpcy5jZW50ZXIgfHwgIXRoaXMud2lkdGggfHwgIXRoaXMuaGVpZ2h0IHx8IHRoaXMuX2NvbnN0cmFpbmluZykgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuX2NvbnN0cmFpbmluZyA9IHRydWU7XG5cbiAgICAgICAgbGV0IG1pblkgPSAtOTA7XG4gICAgICAgIGxldCBtYXhZID0gOTA7XG4gICAgICAgIGxldCBtaW5YID0gLTE4MDtcbiAgICAgICAgbGV0IG1heFggPSAxODA7XG4gICAgICAgIGxldCBzeSwgc3gsIHgyLCB5MjtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZSxcbiAgICAgICAgICAgIHVubW9kaWZpZWQgPSB0aGlzLl91bm1vZGlmaWVkO1xuXG4gICAgICAgIGlmICh0aGlzLmxhdFJhbmdlKSB7XG4gICAgICAgICAgICBjb25zdCBsYXRSYW5nZSA9IHRoaXMubGF0UmFuZ2U7XG4gICAgICAgICAgICBtaW5ZID0gdGhpcy5sYXRZKGxhdFJhbmdlWzFdKTtcbiAgICAgICAgICAgIG1heFkgPSB0aGlzLmxhdFkobGF0UmFuZ2VbMF0pO1xuICAgICAgICAgICAgc3kgPSBtYXhZIC0gbWluWSA8IHNpemUueSA/IHNpemUueSAvIChtYXhZIC0gbWluWSkgOiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubG5nUmFuZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGxuZ1JhbmdlID0gdGhpcy5sbmdSYW5nZTtcbiAgICAgICAgICAgIG1pblggPSB0aGlzLmxuZ1gobG5nUmFuZ2VbMF0pO1xuICAgICAgICAgICAgbWF4WCA9IHRoaXMubG5nWChsbmdSYW5nZVsxXSk7XG4gICAgICAgICAgICBzeCA9IG1heFggLSBtaW5YIDwgc2l6ZS54ID8gc2l6ZS54IC8gKG1heFggLSBtaW5YKSA6IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBob3cgbXVjaCB0aGUgbWFwIHNob3VsZCBzY2FsZSB0byBmaXQgdGhlIHNjcmVlbiBpbnRvIGdpdmVuIGxhdGl0dWRlL2xvbmdpdHVkZSByYW5nZXNcbiAgICAgICAgY29uc3QgcyA9IE1hdGgubWF4KHN4IHx8IDAsIHN5IHx8IDApO1xuXG4gICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICB0aGlzLmNlbnRlciA9IHRoaXMudW5wcm9qZWN0KG5ldyBQb2ludChcbiAgICAgICAgICAgICAgICBzeCA/IChtYXhYICsgbWluWCkgLyAyIDogdGhpcy54LFxuICAgICAgICAgICAgICAgIHN5ID8gKG1heFkgKyBtaW5ZKSAvIDIgOiB0aGlzLnkpKTtcbiAgICAgICAgICAgIHRoaXMuem9vbSArPSB0aGlzLnNjYWxlWm9vbShzKTtcbiAgICAgICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSB1bm1vZGlmaWVkO1xuICAgICAgICAgICAgdGhpcy5fY29uc3RyYWluaW5nID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXRSYW5nZSkge1xuICAgICAgICAgICAgY29uc3QgeSA9IHRoaXMueSxcbiAgICAgICAgICAgICAgICBoMiA9IHNpemUueSAvIDI7XG5cbiAgICAgICAgICAgIGlmICh5IC0gaDIgPCBtaW5ZKSB5MiA9IG1pblkgKyBoMjtcbiAgICAgICAgICAgIGlmICh5ICsgaDIgPiBtYXhZKSB5MiA9IG1heFkgLSBoMjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxuZ1JhbmdlKSB7XG4gICAgICAgICAgICBjb25zdCB4ID0gdGhpcy54LFxuICAgICAgICAgICAgICAgIHcyID0gc2l6ZS54IC8gMjtcblxuICAgICAgICAgICAgaWYgKHggLSB3MiA8IG1pblgpIHgyID0gbWluWCArIHcyO1xuICAgICAgICAgICAgaWYgKHggKyB3MiA+IG1heFgpIHgyID0gbWF4WCAtIHcyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFuIHRoZSBtYXAgaWYgdGhlIHNjcmVlbiBnb2VzIG9mZiB0aGUgcmFuZ2VcbiAgICAgICAgaWYgKHgyICE9PSB1bmRlZmluZWQgfHwgeTIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSB0aGlzLnVucHJvamVjdChuZXcgUG9pbnQoXG4gICAgICAgICAgICAgICAgeDIgIT09IHVuZGVmaW5lZCA/IHgyIDogdGhpcy54LFxuICAgICAgICAgICAgICAgIHkyICE9PSB1bmRlZmluZWQgPyB5MiA6IHRoaXMueSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IHVubW9kaWZpZWQ7XG4gICAgICAgIHRoaXMuX2NvbnN0cmFpbmluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIF9jYWxjTWF0cmljZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5oZWlnaHQpIHJldHVybjtcblxuICAgICAgICB0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgPSAwLjUgLyBNYXRoLnRhbih0aGlzLl9mb3YgLyAyKSAqIHRoaXMuaGVpZ2h0O1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNlbnRlciBwb2ludCBbd2lkdGgvMiwgaGVpZ2h0LzJdIHRvIHRoZVxuICAgICAgICAvLyBjZW50ZXIgdG9wIHBvaW50IFt3aWR0aC8yLCAwXSBpbiBaIHVuaXRzLCB1c2luZyB0aGUgbGF3IG9mIHNpbmVzLlxuICAgICAgICAvLyAxIFogdW5pdCBpcyBlcXVpdmFsZW50IHRvIDEgaG9yaXpvbnRhbCBweCBhdCB0aGUgY2VudGVyIG9mIHRoZSBtYXBcbiAgICAgICAgLy8gKHRoZSBkaXN0YW5jZSBiZXR3ZWVuW3dpZHRoLzIsIGhlaWdodC8yXSBhbmQgW3dpZHRoLzIgKyAxLCBoZWlnaHQvMl0pXG4gICAgICAgIGNvbnN0IGhhbGZGb3YgPSB0aGlzLl9mb3YgLyAyO1xuICAgICAgICBjb25zdCBncm91bmRBbmdsZSA9IE1hdGguUEkgLyAyICsgdGhpcy5fcGl0Y2g7XG4gICAgICAgIGNvbnN0IHRvcEhhbGZTdXJmYWNlRGlzdGFuY2UgPSBNYXRoLnNpbihoYWxmRm92KSAqIHRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSAvIE1hdGguc2luKE1hdGguUEkgLSBncm91bmRBbmdsZSAtIGhhbGZGb3YpO1xuICAgICAgICBjb25zdCB4ID0gdGhpcy54LCB5ID0gdGhpcy55O1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB6IGRpc3RhbmNlIG9mIHRoZSBmYXJ0aGVzdCBmcmFnbWVudCB0aGF0IHNob3VsZCBiZSByZW5kZXJlZC5cbiAgICAgICAgY29uc3QgZnVydGhlc3REaXN0YW5jZSA9IE1hdGguY29zKE1hdGguUEkgLyAyIC0gdGhpcy5fcGl0Y2gpICogdG9wSGFsZlN1cmZhY2VEaXN0YW5jZSArIHRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZTtcbiAgICAgICAgLy8gQWRkIGEgYml0IGV4dHJhIHRvIGF2b2lkIHByZWNpc2lvbiBwcm9ibGVtcyB3aGVuIGEgZnJhZ21lbnQncyBkaXN0YW5jZSBpcyBleGFjdGx5IGBmdXJ0aGVzdERpc3RhbmNlYFxuICAgICAgICBjb25zdCBmYXJaID0gZnVydGhlc3REaXN0YW5jZSAqIDEuMDE7XG5cbiAgICAgICAgLy8gbWF0cml4IGZvciBjb252ZXJzaW9uIGZyb20gbG9jYXRpb24gdG8gR0wgY29vcmRpbmF0ZXMgKC0xIC4uIDEpXG4gICAgICAgIGxldCBtID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG4gICAgICAgIG1hdDQucGVyc3BlY3RpdmUobSwgdGhpcy5fZm92LCB0aGlzLndpZHRoIC8gdGhpcy5oZWlnaHQsIDEsIGZhclopO1xuXG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgWzEsIC0xLCAxXSk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG0sIG0sIFswLCAwLCAtdGhpcy5jYW1lcmFUb0NlbnRlckRpc3RhbmNlXSk7XG4gICAgICAgIG1hdDQucm90YXRlWChtLCBtLCB0aGlzLl9waXRjaCk7XG4gICAgICAgIG1hdDQucm90YXRlWihtLCBtLCB0aGlzLmFuZ2xlKTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUobSwgbSwgWy14LCAteSwgMF0pO1xuXG4gICAgICAgIC8vIHNjYWxlIHZlcnRpY2FsbHkgdG8gbWV0ZXJzIHBlciBwaXhlbCAoaW52ZXJzZSBvZiBncm91bmQgcmVzb2x1dGlvbik6XG4gICAgICAgIC8vIHdvcmxkU2l6ZSAvIChjaXJjdW1mZXJlbmNlT2ZFYXJ0aCAqIGNvcyhsYXQgKiDPgCAvIDE4MCkpXG4gICAgICAgIGNvbnN0IHZlcnRpY2FsU2NhbGUgPSB0aGlzLndvcmxkU2l6ZSAvICgyICogTWF0aC5QSSAqIDYzNzgxMzcgKiBNYXRoLmFicyhNYXRoLmNvcyh0aGlzLmNlbnRlci5sYXQgKiAoTWF0aC5QSSAvIDE4MCkpKSk7XG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgWzEsIDEsIHZlcnRpY2FsU2NhbGUsIDFdKTtcblxuICAgICAgICB0aGlzLnByb2pNYXRyaXggPSBtO1xuXG4gICAgICAgIC8vIE1ha2UgYSBzZWNvbmQgcHJvamVjdGlvbiBtYXRyaXggdGhhdCBpcyBhbGlnbmVkIHRvIGEgcGl4ZWwgZ3JpZCBmb3IgcmVuZGVyaW5nIHJhc3RlciB0aWxlcy5cbiAgICAgICAgLy8gV2UncmUgcm91bmRpbmcgdGhlIChmbG9hdGluZyBwb2ludCkgeC95IHZhbHVlcyB0byBhY2hpZXZlIHRvIGF2b2lkIHJlbmRlcmluZyByYXN0ZXIgaW1hZ2VzIHRvIGZyYWN0aW9uYWxcbiAgICAgICAgLy8gY29vcmRpbmF0ZXMuIEFkZGl0aW9uYWxseSwgd2UgYWRqdXN0IGJ5IGhhbGYgYSBwaXhlbCBpbiBlaXRoZXIgZGlyZWN0aW9uIGluIGNhc2UgdGhhdCB2aWV3cG9ydCBkaW1lbnNpb25cbiAgICAgICAgLy8gaXMgYW4gb2RkIGludGVnZXIgdG8gcHJlc2VydmUgcmVuZGVyaW5nIHRvIHRoZSBwaXhlbCBncmlkLiBXZSdyZSByb3RhdGluZyB0aGlzIHNoaWZ0IGJhc2VkIG9uIHRoZSBhbmdsZVxuICAgICAgICAvLyBvZiB0aGUgdHJhbnNmb3JtYXRpb24gc28gdGhhdCAwwrAsIDkwwrAsIDE4MMKwLCBhbmQgMjcwwrAgcmFzdGVycyBhcmUgY3Jpc3AsIGFuZCBhZGp1c3QgdGhlIHNoaWZ0IHNvIHRoYXRcbiAgICAgICAgLy8gaXQgaXMgYWx3YXlzIDw9IDAuNSBwaXhlbHMuXG4gICAgICAgIGNvbnN0IHhTaGlmdCA9ICh0aGlzLndpZHRoICUgMikgLyAyLCB5U2hpZnQgPSAodGhpcy5oZWlnaHQgJSAyKSAvIDIsXG4gICAgICAgICAgICBhbmdsZUNvcyA9IE1hdGguY29zKHRoaXMuYW5nbGUpLCBhbmdsZVNpbiA9IE1hdGguc2luKHRoaXMuYW5nbGUpLFxuICAgICAgICAgICAgZHggPSB4IC0gTWF0aC5yb3VuZCh4KSArIGFuZ2xlQ29zICogeFNoaWZ0ICsgYW5nbGVTaW4gKiB5U2hpZnQsXG4gICAgICAgICAgICBkeSA9IHkgLSBNYXRoLnJvdW5kKHkpICsgYW5nbGVDb3MgKiB5U2hpZnQgKyBhbmdsZVNpbiAqIHhTaGlmdDtcbiAgICAgICAgY29uc3QgYWxpZ25lZE0gPSBuZXcgRmxvYXQ2NEFycmF5KG0pO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShhbGlnbmVkTSwgYWxpZ25lZE0sIFsgZHggPiAwLjUgPyBkeCAtIDEgOiBkeCwgZHkgPiAwLjUgPyBkeSAtIDEgOiBkeSwgMCBdKTtcbiAgICAgICAgdGhpcy5hbGlnbmVkUHJvak1hdHJpeCA9IGFsaWduZWRNO1xuXG4gICAgICAgIC8vIG1hdHJpeCBmb3IgY29udmVyc2lvbiBmcm9tIGxvY2F0aW9uIHRvIHNjcmVlbiBjb29yZGluYXRlc1xuICAgICAgICBtID0gbWF0NC5jcmVhdGUoKTtcbiAgICAgICAgbWF0NC5zY2FsZShtLCBtLCBbdGhpcy53aWR0aCAvIDIsIC10aGlzLmhlaWdodCAvIDIsIDFdKTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUobSwgbSwgWzEsIC0xLCAwXSk7XG4gICAgICAgIHRoaXMucGl4ZWxNYXRyaXggPSBtYXQ0Lm11bHRpcGx5KG5ldyBGbG9hdDY0QXJyYXkoMTYpLCBtLCB0aGlzLnByb2pNYXRyaXgpO1xuXG4gICAgICAgIC8vIGludmVyc2UgbWF0cml4IGZvciBjb252ZXJzaW9uIGZyb20gc2NyZWVuIGNvb3JkaW5hZXMgdG8gbG9jYXRpb25cbiAgICAgICAgbSA9IG1hdDQuaW52ZXJ0KG5ldyBGbG9hdDY0QXJyYXkoMTYpLCB0aGlzLnBpeGVsTWF0cml4KTtcbiAgICAgICAgaWYgKCFtKSB0aHJvdyBuZXcgRXJyb3IoXCJmYWlsZWQgdG8gaW52ZXJ0IG1hdHJpeFwiKTtcbiAgICAgICAgdGhpcy5waXhlbE1hdHJpeEludmVyc2UgPSBtO1xuXG4gICAgICAgIHRoaXMuX3Bvc01hdHJpeENhY2hlID0ge307XG4gICAgICAgIHRoaXMuX2FsaWduZWRQb3NNYXRyaXhDYWNoZSA9IHt9O1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2Zvcm07XG4iLCIvLyAgICAgIFxuY29uc3QgQ29sb3IgPSByZXF1aXJlKCcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jb25zdCBaRVJPID0gMHgwMDAwO1xuY29uc3QgT05FID0gMHgwMDAxO1xuY29uc3QgT05FX01JTlVTX1NSQ19BTFBIQSA9IDB4MDMwMztcblxuY2xhc3MgQ29sb3JNb2RlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihibGVuZEZ1bmN0aW9uICAgICAgICAgICAgICAgLCBibGVuZENvbG9yICAgICAgICwgbWFzayAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLmJsZW5kRnVuY3Rpb24gPSBibGVuZEZ1bmN0aW9uO1xuICAgICAgICB0aGlzLmJsZW5kQ29sb3IgPSBibGVuZENvbG9yO1xuICAgICAgICB0aGlzLm1hc2sgPSBtYXNrO1xuICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbn1cblxuQ29sb3JNb2RlLlJlcGxhY2UgPSBbT05FLCBaRVJPXTtcblxuQ29sb3JNb2RlLmRpc2FibGVkID0gbmV3IENvbG9yTW9kZShDb2xvck1vZGUuUmVwbGFjZSwgQ29sb3IudHJhbnNwYXJlbnQsIFtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZV0pO1xuQ29sb3JNb2RlLnVuYmxlbmRlZCA9IG5ldyBDb2xvck1vZGUoQ29sb3JNb2RlLlJlcGxhY2UsIENvbG9yLnRyYW5zcGFyZW50LCBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pO1xuQ29sb3JNb2RlLmFscGhhQmxlbmRlZCA9IG5ldyBDb2xvck1vZGUoW09ORSwgT05FX01JTlVTX1NSQ19BTFBIQV0sIENvbG9yLnRyYW5zcGFyZW50LCBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbG9yTW9kZTtcbiIsIi8vICAgICAgXG5jb25zdCBJbmRleEJ1ZmZlciA9IHJlcXVpcmUoJy4vaW5kZXhfYnVmZmVyJyk7XG5jb25zdCBWZXJ0ZXhCdWZmZXIgPSByZXF1aXJlKCcuL3ZlcnRleF9idWZmZXInKTtcbmNvbnN0IEZyYW1lYnVmZmVyID0gcmVxdWlyZSgnLi9mcmFtZWJ1ZmZlcicpO1xuY29uc3QgRGVwdGhNb2RlID0gcmVxdWlyZSgnLi9kZXB0aF9tb2RlJyk7XG5jb25zdCBTdGVuY2lsTW9kZSA9IHJlcXVpcmUoJy4vc3RlbmNpbF9tb2RlJyk7XG5jb25zdCBDb2xvck1vZGUgPSByZXF1aXJlKCcuL2NvbG9yX21vZGUnKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbmNvbnN0IHtcbiAgICBDbGVhckNvbG9yLFxuICAgIENsZWFyRGVwdGgsXG4gICAgQ2xlYXJTdGVuY2lsLFxuICAgIENvbG9yTWFzayxcbiAgICBEZXB0aE1hc2ssXG4gICAgU3RlbmNpbE1hc2ssXG4gICAgU3RlbmNpbEZ1bmMsXG4gICAgU3RlbmNpbE9wLFxuICAgIFN0ZW5jaWxUZXN0LFxuICAgIERlcHRoUmFuZ2UsXG4gICAgRGVwdGhUZXN0LFxuICAgIERlcHRoRnVuYyxcbiAgICBCbGVuZCxcbiAgICBCbGVuZEZ1bmMsXG4gICAgQmxlbmRDb2xvcixcbiAgICBQcm9ncmFtLFxuICAgIExpbmVXaWR0aCxcbiAgICBBY3RpdmVUZXh0dXJlVW5pdCxcbiAgICBWaWV3cG9ydCxcbiAgICBCaW5kRnJhbWVidWZmZXIsXG4gICAgQmluZFJlbmRlcmJ1ZmZlcixcbiAgICBCaW5kVGV4dHVyZSxcbiAgICBCaW5kVmVydGV4QnVmZmVyLFxuICAgIEJpbmRFbGVtZW50QnVmZmVyLFxuICAgIEJpbmRWZXJ0ZXhBcnJheU9FUyxcbiAgICBQaXhlbFN0b3JlVW5wYWNrLFxuICAgIFBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLFxufSA9IHJlcXVpcmUoJy4vdmFsdWUnKTtcblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgXG5cblxuY2xhc3MgQ29udGV4dCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihnbCAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy5leHRWZXJ0ZXhBcnJheU9iamVjdCA9IHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCdPRVNfdmVydGV4X2FycmF5X29iamVjdCcpO1xuICAgICAgICB0aGlzLmxpbmVXaWR0aFJhbmdlID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLkFMSUFTRURfTElORV9XSURUSF9SQU5HRSk7XG5cbiAgICAgICAgdGhpcy5jbGVhckNvbG9yID0gbmV3IENsZWFyQ29sb3IodGhpcyk7XG4gICAgICAgIHRoaXMuY2xlYXJEZXB0aCA9IG5ldyBDbGVhckRlcHRoKHRoaXMpO1xuICAgICAgICB0aGlzLmNsZWFyU3RlbmNpbCA9IG5ldyBDbGVhclN0ZW5jaWwodGhpcyk7XG4gICAgICAgIHRoaXMuY29sb3JNYXNrID0gbmV3IENvbG9yTWFzayh0aGlzKTtcbiAgICAgICAgdGhpcy5kZXB0aE1hc2sgPSBuZXcgRGVwdGhNYXNrKHRoaXMpO1xuICAgICAgICB0aGlzLnN0ZW5jaWxNYXNrID0gbmV3IFN0ZW5jaWxNYXNrKHRoaXMpO1xuICAgICAgICB0aGlzLnN0ZW5jaWxGdW5jID0gbmV3IFN0ZW5jaWxGdW5jKHRoaXMpO1xuICAgICAgICB0aGlzLnN0ZW5jaWxPcCA9IG5ldyBTdGVuY2lsT3AodGhpcyk7XG4gICAgICAgIHRoaXMuc3RlbmNpbFRlc3QgPSBuZXcgU3RlbmNpbFRlc3QodGhpcyk7XG4gICAgICAgIHRoaXMuZGVwdGhSYW5nZSA9IG5ldyBEZXB0aFJhbmdlKHRoaXMpO1xuICAgICAgICB0aGlzLmRlcHRoVGVzdCA9IG5ldyBEZXB0aFRlc3QodGhpcyk7XG4gICAgICAgIHRoaXMuZGVwdGhGdW5jID0gbmV3IERlcHRoRnVuYyh0aGlzKTtcbiAgICAgICAgdGhpcy5ibGVuZCA9IG5ldyBCbGVuZCh0aGlzKTtcbiAgICAgICAgdGhpcy5ibGVuZEZ1bmMgPSBuZXcgQmxlbmRGdW5jKHRoaXMpO1xuICAgICAgICB0aGlzLmJsZW5kQ29sb3IgPSBuZXcgQmxlbmRDb2xvcih0aGlzKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtID0gbmV3IFByb2dyYW0odGhpcyk7XG4gICAgICAgIHRoaXMubGluZVdpZHRoID0gbmV3IExpbmVXaWR0aCh0aGlzKTtcbiAgICAgICAgdGhpcy5hY3RpdmVUZXh0dXJlID0gbmV3IEFjdGl2ZVRleHR1cmVVbml0KHRoaXMpO1xuICAgICAgICB0aGlzLnZpZXdwb3J0ID0gbmV3IFZpZXdwb3J0KHRoaXMpO1xuICAgICAgICB0aGlzLmJpbmRGcmFtZWJ1ZmZlciA9IG5ldyBCaW5kRnJhbWVidWZmZXIodGhpcyk7XG4gICAgICAgIHRoaXMuYmluZFJlbmRlcmJ1ZmZlciA9IG5ldyBCaW5kUmVuZGVyYnVmZmVyKHRoaXMpO1xuICAgICAgICB0aGlzLmJpbmRUZXh0dXJlID0gbmV3IEJpbmRUZXh0dXJlKHRoaXMpO1xuICAgICAgICB0aGlzLmJpbmRWZXJ0ZXhCdWZmZXIgPSBuZXcgQmluZFZlcnRleEJ1ZmZlcih0aGlzKTtcbiAgICAgICAgdGhpcy5iaW5kRWxlbWVudEJ1ZmZlciA9IG5ldyBCaW5kRWxlbWVudEJ1ZmZlcih0aGlzKTtcbiAgICAgICAgdGhpcy5iaW5kVmVydGV4QXJyYXlPRVMgPSB0aGlzLmV4dFZlcnRleEFycmF5T2JqZWN0ICYmIG5ldyBCaW5kVmVydGV4QXJyYXlPRVModGhpcyk7XG4gICAgICAgIHRoaXMucGl4ZWxTdG9yZVVucGFjayA9IG5ldyBQaXhlbFN0b3JlVW5wYWNrKHRoaXMpO1xuICAgICAgICB0aGlzLnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhID0gbmV3IFBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljID0gKFxuICAgICAgICAgICAgZ2wuZ2V0RXh0ZW5zaW9uKCdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnKSB8fFxuICAgICAgICAgICAgZ2wuZ2V0RXh0ZW5zaW9uKCdNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJykgfHxcbiAgICAgICAgICAgIGdsLmdldEV4dGVuc2lvbignV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycpXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYykge1xuICAgICAgICAgICAgdGhpcy5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWNNYXggPSBnbC5nZXRQYXJhbWV0ZXIodGhpcy5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWMuTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXh0VGV4dHVyZUhhbGZGbG9hdCA9IGdsLmdldEV4dGVuc2lvbignT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcpO1xuICAgICAgICBpZiAodGhpcy5leHRUZXh0dXJlSGFsZkZsb2F0KSB7XG4gICAgICAgICAgICBnbC5nZXRFeHRlbnNpb24oJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJyk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGNyZWF0ZUluZGV4QnVmZmVyKGFycmF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgZHluYW1pY0RyYXcgICAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5kZXhCdWZmZXIodGhpcywgYXJyYXksIGR5bmFtaWNEcmF3KTtcbiAgICB9XG5cbiAgICBjcmVhdGVWZXJ0ZXhCdWZmZXIoYXJyYXkgICAgICAgICAgICAgLCBhdHRyaWJ1dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGR5bmFtaWNEcmF3ICAgICAgICAgICkge1xuICAgICAgICByZXR1cm4gbmV3IFZlcnRleEJ1ZmZlcih0aGlzLCBhcnJheSwgYXR0cmlidXRlcywgZHluYW1pY0RyYXcpO1xuICAgIH1cblxuICAgIGNyZWF0ZVJlbmRlcmJ1ZmZlcihzdG9yYWdlRm9ybWF0ICAgICAgICAsIHdpZHRoICAgICAgICAsIGhlaWdodCAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcblxuICAgICAgICBjb25zdCByYm8gPSBnbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcbiAgICAgICAgdGhpcy5iaW5kUmVuZGVyYnVmZmVyLnNldChyYm8pO1xuICAgICAgICBnbC5yZW5kZXJidWZmZXJTdG9yYWdlKGdsLlJFTkRFUkJVRkZFUiwgc3RvcmFnZUZvcm1hdCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHRoaXMuYmluZFJlbmRlcmJ1ZmZlci5zZXQobnVsbCk7XG5cbiAgICAgICAgcmV0dXJuIHJibztcbiAgICB9XG5cbiAgICBjcmVhdGVGcmFtZWJ1ZmZlcih3aWR0aCAgICAgICAgLCBoZWlnaHQgICAgICAgICkge1xuICAgICAgICByZXR1cm4gbmV3IEZyYW1lYnVmZmVyKHRoaXMsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cblxuICAgIGNsZWFyKHtjb2xvciwgZGVwdGh9ICAgICAgICAgICApIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBsZXQgbWFzayA9IDA7XG5cbiAgICAgICAgaWYgKGNvbG9yKSB7XG4gICAgICAgICAgICBtYXNrIHw9IGdsLkNPTE9SX0JVRkZFUl9CSVQ7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ29sb3Iuc2V0KGNvbG9yKTtcbiAgICAgICAgICAgIHRoaXMuY29sb3JNYXNrLnNldChbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkZXB0aCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG1hc2sgfD0gZ2wuREVQVEhfQlVGRkVSX0JJVDtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJEZXB0aC5zZXQoZGVwdGgpO1xuICAgICAgICAgICAgdGhpcy5kZXB0aE1hc2suc2V0KHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2VlIG5vdGUgaW4gUGFpbnRlciNjbGVhclN0ZW5jaWw6IGltcGxlbWVudCB0aGlzIHRoZSBlYXN5IHdheSBvbmNlIEdQVSBidWcvd29ya2Fyb3VuZCBpcyBmaXhlZCB1cHN0cmVhbVxuICAgICAgICAvLyBpZiAodHlwZW9mIHN0ZW5jaWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vICAgICBtYXNrIHw9IGdsLlNURU5DSUxfQlVGRkVSX0JJVDtcbiAgICAgICAgLy8gICAgIHRoaXMuY2xlYXJTdGVuY2lsLnNldChzdGVuY2lsKTtcbiAgICAgICAgLy8gICAgIHRoaXMuc3RlbmNpbE1hc2suc2V0KDB4RkYpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgZ2wuY2xlYXIobWFzayk7XG4gICAgfVxuXG4gICAgc2V0RGVwdGhNb2RlKGRlcHRoTW9kZSAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKGRlcHRoTW9kZS5mdW5jID09PSB0aGlzLmdsLkFMV0FZUyAmJiAhZGVwdGhNb2RlLm1hc2spIHtcbiAgICAgICAgICAgIHRoaXMuZGVwdGhUZXN0LnNldChmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlcHRoVGVzdC5zZXQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmRlcHRoRnVuYy5zZXQoZGVwdGhNb2RlLmZ1bmMpO1xuICAgICAgICAgICAgdGhpcy5kZXB0aE1hc2suc2V0KGRlcHRoTW9kZS5tYXNrKTtcbiAgICAgICAgICAgIHRoaXMuZGVwdGhSYW5nZS5zZXQoZGVwdGhNb2RlLnJhbmdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFN0ZW5jaWxNb2RlKHN0ZW5jaWxNb2RlICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGlmIChzdGVuY2lsTW9kZS5mdW5jID09PSB0aGlzLmdsLkFMV0FZUyAmJiAhc3RlbmNpbE1vZGUubWFzaykge1xuICAgICAgICAgICAgdGhpcy5zdGVuY2lsVGVzdC5zZXQoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGVuY2lsVGVzdC5zZXQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnN0ZW5jaWxNYXNrLnNldChzdGVuY2lsTW9kZS5tYXNrKTtcbiAgICAgICAgICAgIHRoaXMuc3RlbmNpbE9wLnNldChbc3RlbmNpbE1vZGUuZmFpbCwgc3RlbmNpbE1vZGUuZGVwdGhGYWlsLCBzdGVuY2lsTW9kZS5wYXNzXSk7XG4gICAgICAgICAgICB0aGlzLnN0ZW5jaWxGdW5jLnNldCh7XG4gICAgICAgICAgICAgICAgZnVuYzogc3RlbmNpbE1vZGUudGVzdC5mdW5jLFxuICAgICAgICAgICAgICAgIHJlZjogc3RlbmNpbE1vZGUucmVmLFxuICAgICAgICAgICAgICAgIG1hc2s6IHN0ZW5jaWxNb2RlLnRlc3QubWFza1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRDb2xvck1vZGUoY29sb3JNb2RlICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBpZiAodXRpbC5kZWVwRXF1YWwoY29sb3JNb2RlLmJsZW5kRnVuY3Rpb24sIENvbG9yTW9kZS5SZXBsYWNlKSkge1xuICAgICAgICAgICAgdGhpcy5ibGVuZC5zZXQoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ibGVuZC5zZXQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmJsZW5kRnVuYy5zZXQoY29sb3JNb2RlLmJsZW5kRnVuY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy5ibGVuZENvbG9yLnNldChjb2xvck1vZGUuYmxlbmRDb2xvcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbG9yTWFzay5zZXQoY29sb3JNb2RlLm1hc2spO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDb250ZXh0O1xuIiwiLy8gICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuY29uc3QgQUxXQVlTID0gMHgwMjA3O1xuXG5jbGFzcyBEZXB0aE1vZGUge1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAvLyBEZXB0aE1hc2sgZW51bXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGRlcHRoRnVuYyAgICAgICAgICAgICAgICwgZGVwdGhNYXNrICAgICAgICAgICAgICAgLCBkZXB0aFJhbmdlICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLmZ1bmMgPSBkZXB0aEZ1bmM7XG4gICAgICAgIHRoaXMubWFzayA9IGRlcHRoTWFzaztcbiAgICAgICAgdGhpcy5yYW5nZSA9IGRlcHRoUmFuZ2U7XG4gICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbn1cblxuRGVwdGhNb2RlLlJlYWRPbmx5ID0gZmFsc2U7XG5EZXB0aE1vZGUuUmVhZFdyaXRlID0gdHJ1ZTtcblxuRGVwdGhNb2RlLmRpc2FibGVkID0gbmV3IERlcHRoTW9kZShBTFdBWVMsIERlcHRoTW9kZS5SZWFkT25seSwgWzAsIDFdKTtcblxubW9kdWxlLmV4cG9ydHMgPSBEZXB0aE1vZGU7XG4iLCIvLyAgICAgIFxuY29uc3QgeyBDb2xvckF0dGFjaG1lbnQsIERlcHRoQXR0YWNobWVudCB9ID0gcmVxdWlyZSgnLi92YWx1ZScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNsYXNzIEZyYW1lYnVmZmVyIHtcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0ICAgICAgICAgLCB3aWR0aCAgICAgICAgLCBoZWlnaHQgICAgICAgICkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIGNvbnN0IGZibyA9IHRoaXMuZnJhbWVidWZmZXIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuXG4gICAgICAgIHRoaXMuY29sb3JBdHRhY2htZW50ID0gbmV3IENvbG9yQXR0YWNobWVudChjb250ZXh0LCBmYm8pO1xuICAgICAgICB0aGlzLmRlcHRoQXR0YWNobWVudCA9IG5ldyBEZXB0aEF0dGFjaG1lbnQoY29udGV4dCwgZmJvKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcblxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gdGhpcy5jb2xvckF0dGFjaG1lbnQuZ2V0KCk7XG4gICAgICAgIGlmICh0ZXh0dXJlKSBnbC5kZWxldGVUZXh0dXJlKHRleHR1cmUpO1xuXG4gICAgICAgIGNvbnN0IHJlbmRlcmJ1ZmZlciA9IHRoaXMuZGVwdGhBdHRhY2htZW50LmdldCgpO1xuICAgICAgICBpZiAocmVuZGVyYnVmZmVyKSBnbC5kZWxldGVSZW5kZXJidWZmZXIocmVuZGVyYnVmZmVyKTtcblxuICAgICAgICBnbC5kZWxldGVGcmFtZWJ1ZmZlcih0aGlzLmZyYW1lYnVmZmVyKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRnJhbWVidWZmZXI7XG4iLCIvLyAgICAgIFxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5cbmNsYXNzIEluZGV4QnVmZmVyIHtcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0ICAgICAgICAgLCBhcnJheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGR5bmFtaWNEcmF3ICAgICAgICAgICkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgIHRoaXMuZHluYW1pY0RyYXcgPSBCb29sZWFuKGR5bmFtaWNEcmF3KTtcblxuICAgICAgICB0aGlzLnVuYmluZFZBTygpO1xuXG4gICAgICAgIGNvbnRleHQuYmluZEVsZW1lbnRCdWZmZXIuc2V0KHRoaXMuYnVmZmVyKTtcbiAgICAgICAgZ2wuYnVmZmVyRGF0YShnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgYXJyYXkuYXJyYXlCdWZmZXIsIHRoaXMuZHluYW1pY0RyYXcgPyBnbC5EWU5BTUlDX0RSQVcgOiBnbC5TVEFUSUNfRFJBVyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmR5bmFtaWNEcmF3KSB7XG4gICAgICAgICAgICBkZWxldGUgYXJyYXkuYXJyYXlCdWZmZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1bmJpbmRWQU8oKSB7XG4gICAgICAgIC8vIFRoZSBib3VuZCBpbmRleCBidWZmZXIgaXMgcGFydCBvZiB2ZXJ0ZXggYXJyYXkgb2JqZWN0IHN0YXRlLiBXZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIG1vZGlmeSB3aGF0ZXZlciBWQU8gaGFwcGVucyB0byBiZSBjdXJyZW50bHkgYm91bmQsIHNvIG1ha2Ugc3VyZSB0aGUgZGVmYXVsdFxuICAgICAgICAvLyB2ZXJ0ZXggYXJyYXkgcHJvdmlkZWQgYnkgdGhlIGNvbnRleHQgaXMgYm91bmQgaW5zdGVhZC5cbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5leHRWZXJ0ZXhBcnJheU9iamVjdCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUy5zZXQobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kKCkge1xuICAgICAgICB0aGlzLmNvbnRleHQuYmluZEVsZW1lbnRCdWZmZXIuc2V0KHRoaXMuYnVmZmVyKTtcbiAgICB9XG5cbiAgICB1cGRhdGVEYXRhKGFycmF5ICAgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgYXNzZXJ0KHRoaXMuZHluYW1pY0RyYXcpO1xuICAgICAgICAvLyBUaGUgcmlnaHQgVkFPIHdpbGwgZ2V0IHRoaXMgYnVmZmVyIHJlLWJvdW5kIGxhdGVyIGluIFZlcnRleEFycmF5T2JqZWN0I2JpbmRcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy81NjIwXG4gICAgICAgIHRoaXMudW5iaW5kVkFPKCk7XG4gICAgICAgIHRoaXMuYmluZCgpO1xuICAgICAgICBnbC5idWZmZXJTdWJEYXRhKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCAwLCBhcnJheS5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgZ2wuZGVsZXRlQnVmZmVyKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBJbmRleEJ1ZmZlcjtcbiIsIi8vICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jb25zdCBBTFdBWVMgPSAweDAyMDc7XG5jb25zdCBLRUVQID0gMHgxRTAwO1xuXG5jbGFzcyBTdGVuY2lsTW9kZSB7XG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcih0ZXN0ICAgICAgICAgICAgICwgcmVmICAgICAgICAsIG1hc2sgICAgICAgICwgZmFpbCAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgIGRlcHRoRmFpbCAgICAgICAgICAgICAgICAgICAsIHBhc3MgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMudGVzdCA9IHRlc3Q7XG4gICAgICAgIHRoaXMucmVmID0gcmVmO1xuICAgICAgICB0aGlzLm1hc2sgPSBtYXNrO1xuICAgICAgICB0aGlzLmZhaWwgPSBmYWlsO1xuICAgICAgICB0aGlzLmRlcHRoRmFpbCA9IGRlcHRoRmFpbDtcbiAgICAgICAgdGhpcy5wYXNzID0gcGFzcztcbiAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG59XG5cblN0ZW5jaWxNb2RlLmRpc2FibGVkID0gbmV3IFN0ZW5jaWxNb2RlKHsgZnVuYzogQUxXQVlTLCBtYXNrOiAwIH0sIDAsIDAsIEtFRVAsIEtFRVAsIEtFRVApO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0ZW5jaWxNb2RlO1xuIiwiLy8gICAgICBcblxuY29uc3QgQ29sb3IgPSByZXF1aXJlKCcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuIFxuXG5jbGFzcyBDbGVhckNvbG9yICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoY29udGV4dCAgICAgICAgICkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBDb2xvci50cmFuc3BhcmVudDtcbiAgICB9XG5cbiAgICBnZXQoKSAgICAgICAgeyByZXR1cm4gdGhpcy5jdXJyZW50OyB9XG5cbiAgICBzZXQodiAgICAgICApICAgICAgIHtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgaWYgKHYuciAhPT0gYy5yIHx8IHYuZyAhPT0gYy5nIHx8IHYuYiAhPT0gYy5iIHx8IHYuYSAhPT0gYy5hKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2wuY2xlYXJDb2xvcih2LnIsIHYuZywgdi5iLCB2LmEpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgQ2xlYXJEZXB0aCAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoY29udGV4dCAgICAgICAgICkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSAxO1xuICAgIH1cblxuICAgIGdldCgpICAgICAgICAgeyByZXR1cm4gdGhpcy5jdXJyZW50OyB9XG5cbiAgICBzZXQodiAgICAgICAgKSAgICAgICB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnQgIT09IHYpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5nbC5jbGVhckRlcHRoKHYpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgQ2xlYXJTdGVuY2lsICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0ICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IDA7XG4gICAgfVxuXG4gICAgZ2V0KCkgICAgICAgICB7IHJldHVybiB0aGlzLmN1cnJlbnQ7IH1cblxuICAgIHNldCh2ICAgICAgICApICAgICAgIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudCAhPT0gdikge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdsLmNsZWFyU3RlbmNpbCh2KTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIENvbG9yTWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0ICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IFt0cnVlLCB0cnVlLCB0cnVlLCB0cnVlXTtcbiAgICB9XG5cbiAgICBnZXQoKSAgICAgICAgICAgICAgICB7IHJldHVybiB0aGlzLmN1cnJlbnQ7IH1cblxuICAgIHNldCh2ICAgICAgICAgICAgICAgKSAgICAgICB7XG4gICAgICAgIGNvbnN0IGMgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgIGlmICh2WzBdICE9PSBjWzBdIHx8IHZbMV0gIT09IGNbMV0gfHwgdlsyXSAhPT0gY1syXSB8fCB2WzNdICE9PSBjWzNdKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2wuY29sb3JNYXNrKHZbMF0sIHZbMV0sIHZbMl0sIHZbM10pO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgRGVwdGhNYXNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXQoKSAgICAgICAgICAgICAgICB7IHJldHVybiB0aGlzLmN1cnJlbnQ7IH1cblxuICAgIHNldCh2ICAgICAgICAgICAgICAgKSAgICAgICB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnQgIT09IHYpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5nbC5kZXB0aE1hc2sodik7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBTdGVuY2lsTWFzayAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoY29udGV4dCAgICAgICAgICkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSAweEZGO1xuICAgIH1cblxuICAgIGdldCgpICAgICAgICAgeyByZXR1cm4gdGhpcy5jdXJyZW50OyB9XG5cbiAgICBzZXQodiAgICAgICAgKSAgICAgICB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnQgIT09IHYpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5nbC5zdGVuY2lsTWFzayh2KTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFN0ZW5jaWxGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0ICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHtcbiAgICAgICAgICAgIGZ1bmM6IGNvbnRleHQuZ2wuQUxXQVlTLFxuICAgICAgICAgICAgcmVmOiAwLFxuICAgICAgICAgICAgbWFzazogMHhGRlxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCgpICAgICAgICAgICAgICAgICAgeyByZXR1cm4gdGhpcy5jdXJyZW50OyB9XG5cbiAgICBzZXQodiAgICAgICAgICAgICAgICAgKSAgICAgICB7XG4gICAgICAgIGNvbnN0IGMgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgIGlmICh2LmZ1bmMgIT09IGMuZnVuYyB8fCB2LnJlZiAhPT0gYy5yZWYgfHwgdi5tYXNrICE9PSBjLm1hc2spIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5nbC5zdGVuY2lsRnVuYyh2LmZ1bmMsIHYucmVmLCB2Lm1hc2spO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgU3RlbmNpbE9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IFtnbC5LRUVQLCBnbC5LRUVQLCBnbC5LRUVQXTtcbiAgICB9XG5cbiAgICBnZXQoKSAgICAgICAgICAgICAgICB7IHJldHVybiB0aGlzLmN1cnJlbnQ7IH1cblxuICAgIHNldCh2ICAgICAgICAgICAgICAgKSAgICAgICB7XG4gICAgICAgIGNvbnN0IGMgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgIGlmICh2WzBdICE9PSBjWzBdIHx8IHZbMV0gIT09IGNbMV0gfHwgdlsyXSAhPT0gY1syXSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdsLnN0ZW5jaWxPcCh2WzBdLCB2WzFdLCB2WzJdKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFN0ZW5jaWxUZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0KCkgICAgICAgICAgeyByZXR1cm4gdGhpcy5jdXJyZW50OyB9XG5cbiAgICBzZXQodiAgICAgICAgICkgICAgICAge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50ICE9PSB2KSB7XG4gICAgICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgICAgICAgZ2wuZW5hYmxlKGdsLlNURU5DSUxfVEVTVCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdsLmRpc2FibGUoZ2wuU1RFTkNJTF9URVNUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIERlcHRoUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0ICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IFswLCAxXTtcbiAgICB9XG5cbiAgICBnZXQoKSAgICAgICAgICAgICAgICAgeyByZXR1cm4gdGhpcy5jdXJyZW50OyB9XG5cbiAgICBzZXQodiAgICAgICAgICAgICAgICApICAgICAgIHtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgaWYgKHZbMF0gIT09IGNbMF0gfHwgdlsxXSAhPT0gY1sxXSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdsLmRlcHRoUmFuZ2UodlswXSwgdlsxXSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBEZXB0aFRlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoY29udGV4dCAgICAgICAgICkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQoKSAgICAgICAgICB7IHJldHVybiB0aGlzLmN1cnJlbnQ7IH1cblxuICAgIHNldCh2ICAgICAgICAgKSAgICAgICB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnQgIT09IHYpIHtcbiAgICAgICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgICAgICBnbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdsLmRpc2FibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBEZXB0aEZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoY29udGV4dCAgICAgICAgICkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBjb250ZXh0LmdsLkxFU1M7XG4gICAgfVxuXG4gICAgZ2V0KCkgICAgICAgICAgICAgICAgeyByZXR1cm4gdGhpcy5jdXJyZW50OyB9XG5cbiAgICBzZXQodiAgICAgICAgICAgICAgICkgICAgICAge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50ICE9PSB2KSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2wuZGVwdGhGdW5jKHYpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgQmxlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoY29udGV4dCAgICAgICAgICkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQoKSAgICAgICAgICB7IHJldHVybiB0aGlzLmN1cnJlbnQ7IH1cblxuICAgIHNldCh2ICAgICAgICAgKSAgICAgICB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnQgIT09IHYpIHtcbiAgICAgICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgICAgICBnbC5lbmFibGUoZ2wuQkxFTkQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBnbC5kaXNhYmxlKGdsLkJMRU5EKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIEJsZW5kRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0ICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBbZ2wuT05FLCBnbC5aRVJPXTtcbiAgICB9XG5cbiAgICBnZXQoKSAgICAgICAgICAgICAgICB7IHJldHVybiB0aGlzLmN1cnJlbnQ7IH1cblxuICAgIHNldCh2ICAgICAgICAgICAgICAgKSAgICAgICB7XG4gICAgICAgIGNvbnN0IGMgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgIGlmICh2WzBdICE9PSBjWzBdIHx8IHZbMV0gIT09IGNbMV0pIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5nbC5ibGVuZEZ1bmModlswXSwgdlsxXSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBCbGVuZENvbG9yICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoY29udGV4dCAgICAgICAgICkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBDb2xvci50cmFuc3BhcmVudDtcbiAgICB9XG5cbiAgICBnZXQoKSAgICAgICAgeyByZXR1cm4gdGhpcy5jdXJyZW50OyB9XG5cbiAgICBzZXQodiAgICAgICApICAgICAgIHtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgaWYgKHYuciAhPT0gYy5yIHx8IHYuZyAhPT0gYy5nIHx8IHYuYiAhPT0gYy5iIHx8IHYuYSAhPT0gYy5hKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2wuYmxlbmRDb2xvcih2LnIsIHYuZywgdi5iLCB2LmEpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgUHJvZ3JhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0ICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0KCkgICAgICAgICAgICAgICAgeyByZXR1cm4gdGhpcy5jdXJyZW50OyB9XG5cbiAgICBzZXQodiAgICAgICAgICAgICAgICkgICAgICAge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50ICE9PSB2KSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2wudXNlUHJvZ3JhbSh2KTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIExpbmVXaWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoY29udGV4dCAgICAgICAgICkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSAxO1xuICAgIH1cblxuICAgIGdldCgpICAgICAgICAgeyByZXR1cm4gdGhpcy5jdXJyZW50OyB9XG5cbiAgICBzZXQodiAgICAgICAgKSAgICAgICB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5jb250ZXh0LmxpbmVXaWR0aFJhbmdlO1xuICAgICAgICBjb25zdCBjbGFtcGVkID0gdXRpbC5jbGFtcCh2LCByYW5nZVswXSwgcmFuZ2VbMV0pO1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50ICE9PSBjbGFtcGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2wubGluZVdpZHRoKGNsYW1wZWQpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgQWN0aXZlVGV4dHVyZVVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gY29udGV4dC5nbC5URVhUVVJFMDtcbiAgICB9XG5cbiAgICBnZXQoKSAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRoaXMuY3VycmVudDsgfVxuXG4gICAgc2V0KHYgICAgICAgICAgICAgICAgICkgICAgICAge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50ICE9PSB2KSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZ2wuYWN0aXZlVGV4dHVyZSh2KTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFZpZXdwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0ICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBbMCwgMCwgZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0XTtcbiAgICB9XG5cbiAgICBnZXQoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIHRoaXMuY3VycmVudDsgfVxuXG4gICAgc2V0KHYgICAgICAgICAgICAgICkgICAgICAge1xuICAgICAgICBjb25zdCBjID0gdGhpcy5jdXJyZW50O1xuICAgICAgICBpZiAodlswXSAhPT0gY1swXSB8fCB2WzFdICE9PSBjWzFdIHx8IHZbMl0gIT09IGNbMl0gfHwgdlszXSAhPT0gY1szXSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdsLnZpZXdwb3J0KHZbMF0sIHZbMV0sIHZbMl0sIHZbM10pO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgQmluZEZyYW1lYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoY29udGV4dCAgICAgICAgICkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cblxuICAgIGdldCgpICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB0aGlzLmN1cnJlbnQ7IH1cblxuICAgIHNldCh2ICAgICAgICAgICAgICAgICAgICkgICAgICAge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50ICE9PSB2KSB7XG4gICAgICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgdik7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBCaW5kUmVuZGVyYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0ICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0KCkgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB0aGlzLmN1cnJlbnQ7IH1cblxuICAgIHNldCh2ICAgICAgICAgICAgICAgICAgICApICAgICAgIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudCAhPT0gdikge1xuICAgICAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgICAgICBnbC5iaW5kUmVuZGVyYnVmZmVyKGdsLlJFTkRFUkJVRkZFUiwgdik7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBCaW5kVGV4dHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0ICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0KCkgICAgICAgICAgICAgICAgeyByZXR1cm4gdGhpcy5jdXJyZW50OyB9XG5cbiAgICBzZXQodiAgICAgICAgICAgICAgICkgICAgICAge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50ICE9PSB2KSB7XG4gICAgICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHYpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgQmluZFZlcnRleEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoY29udGV4dCAgICAgICAgICkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cblxuICAgIGdldCgpICAgICAgICAgICAgICAgeyByZXR1cm4gdGhpcy5jdXJyZW50OyB9XG5cbiAgICBzZXQodiAgICAgICAgICAgICAgKSAgICAgICB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnQgIT09IHYpIHtcbiAgICAgICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHYpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgQmluZEVsZW1lbnRCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIHRoaXMuY3VycmVudDsgfVxuXG4gICAgc2V0KHYgICAgICAgICAgICAgICkgICAgICAge1xuICAgICAgICAvLyBBbHdheXMgcmViaW5kXG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICB9XG59XG5cbmNsYXNzIEJpbmRWZXJ0ZXhBcnJheU9FUyAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoY29udGV4dCAgICAgICAgICkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cblxuICAgIGdldCgpICAgICAgeyByZXR1cm4gdGhpcy5jdXJyZW50OyB9XG5cbiAgICBzZXQodiAgICAgKSAgICAgICB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnQgIT09IHYgJiYgdGhpcy5jb250ZXh0LmV4dFZlcnRleEFycmF5T2JqZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZXh0VmVydGV4QXJyYXlPYmplY3QuYmluZFZlcnRleEFycmF5T0VTKHYpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgUGl4ZWxTdG9yZVVucGFjayAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoY29udGV4dCAgICAgICAgICkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSA0O1xuICAgIH1cblxuICAgIGdldCgpICAgICAgICAgeyByZXR1cm4gdGhpcy5jdXJyZW50OyB9XG5cbiAgICBzZXQodiAgICAgICAgKSAgICAgICB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnQgIT09IHYpIHtcbiAgICAgICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICAgICAgZ2wucGl4ZWxTdG9yZWkoZ2wuVU5QQUNLX0FMSUdOTUVOVCwgdik7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBQaXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYSAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0ICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCgpICAgICAgICAgIHsgcmV0dXJuIHRoaXMuY3VycmVudDsgfVxuXG4gICAgc2V0KHYgICAgICAgICApICAgICAgIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudCAhPT0gdikge1xuICAgICAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgICAgICBnbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsICh2ICAgICApKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogRnJhbWVidWZmZXIgdmFsdWVzXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBGcmFtZWJ1ZmZlclZhbHVlICAgIHtcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQgICAgICAgICAsIHBhcmVudCAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG5cbiAgICBnZXQoKSAgICAgeyByZXR1cm4gdGhpcy5jdXJyZW50OyB9XG59XG5cbmNsYXNzIENvbG9yQXR0YWNobWVudCBleHRlbmRzIEZyYW1lYnVmZmVyVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0ICAgICAgICAgLCBwYXJlbnQgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgc3VwZXIoY29udGV4dCwgcGFyZW50KTtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHNldCh2ICAgICAgICAgICAgICAgKSAgICAgICB7XG4gICAgICAgIGlmICh0aGlzLmRpcnR5IHx8IHRoaXMuY3VycmVudCAhPT0gdikge1xuICAgICAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuYmluZEZyYW1lYnVmZmVyLnNldCh0aGlzLnBhcmVudCk7XG4gICAgICAgICAgICAvLyBub3RlOiBpdCdzIHBvc3NpYmxlIHRvIGF0dGFjaCBhIHJlbmRlcmJ1ZmZlciB0byB0aGUgY29sb3JcbiAgICAgICAgICAgIC8vIGF0dGFjaG1lbnQgcG9pbnQsIGJ1dCB0aHVzIGZhciBNQkdMIG9ubHkgdXNlcyB0ZXh0dXJlcyBmb3IgY29sb3JcbiAgICAgICAgICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuVEVYVFVSRV8yRCwgdiwgMCk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0RGlydHkoKSB7XG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIH1cbn1cblxuY2xhc3MgRGVwdGhBdHRhY2htZW50IGV4dGVuZHMgRnJhbWVidWZmZXJWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgc2V0KHYgICAgICAgICAgICAgICAgICAgICkgICAgICAge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50ICE9PSB2KSB7XG4gICAgICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5iaW5kRnJhbWVidWZmZXIuc2V0KHRoaXMucGFyZW50KTtcbiAgICAgICAgICAgIC8vIG5vdGU6IGl0J3MgcG9zc2libGUgdG8gYXR0YWNoIGEgdGV4dHVyZSB0byB0aGUgZGVwdGggYXR0YWNobWVudFxuICAgICAgICAgICAgLy8gcG9pbnQsIGJ1dCB0aHVzIGZhciBNQkdMIG9ubHkgdXNlcyByZW5kZXJidWZmZXJzIGZvciBkZXB0aFxuICAgICAgICAgICAgZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGdsLkRFUFRIX0FUVEFDSE1FTlQsIGdsLlJFTkRFUkJVRkZFUiwgdik7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBDbGVhckNvbG9yLFxuICAgIENsZWFyRGVwdGgsXG4gICAgQ2xlYXJTdGVuY2lsLFxuICAgIENvbG9yTWFzayxcbiAgICBEZXB0aE1hc2ssXG4gICAgU3RlbmNpbE1hc2ssXG4gICAgU3RlbmNpbEZ1bmMsXG4gICAgU3RlbmNpbE9wLFxuICAgIFN0ZW5jaWxUZXN0LFxuICAgIERlcHRoUmFuZ2UsXG4gICAgRGVwdGhUZXN0LFxuICAgIERlcHRoRnVuYyxcbiAgICBCbGVuZCxcbiAgICBCbGVuZEZ1bmMsXG4gICAgQmxlbmRDb2xvcixcbiAgICBQcm9ncmFtLFxuICAgIExpbmVXaWR0aCxcbiAgICBBY3RpdmVUZXh0dXJlVW5pdCxcbiAgICBWaWV3cG9ydCxcbiAgICBCaW5kRnJhbWVidWZmZXIsXG4gICAgQmluZFJlbmRlcmJ1ZmZlcixcbiAgICBCaW5kVGV4dHVyZSxcbiAgICBCaW5kVmVydGV4QnVmZmVyLFxuICAgIEJpbmRFbGVtZW50QnVmZmVyLFxuICAgIEJpbmRWZXJ0ZXhBcnJheU9FUyxcbiAgICBQaXhlbFN0b3JlVW5wYWNrLFxuICAgIFBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLFxuXG4gICAgQ29sb3JBdHRhY2htZW50LFxuICAgIERlcHRoQXR0YWNobWVudCxcbn07XG4iLCIvLyAgICAgIFxuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcbiAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuLyoqXG4gKiBAZW51bSB7c3RyaW5nfSBBdHRyaWJ1dGVUeXBlXG4gKiBAcHJpdmF0ZVxuICogQHJlYWRvbmx5XG4gKi9cbmNvbnN0IEF0dHJpYnV0ZVR5cGUgPSB7XG4gICAgSW50ODogICAnQllURScsXG4gICAgVWludDg6ICAnVU5TSUdORURfQllURScsXG4gICAgSW50MTY6ICAnU0hPUlQnLFxuICAgIFVpbnQxNjogJ1VOU0lHTkVEX1NIT1JUJyxcbiAgICBJbnQzMjogICdJTlQnLFxuICAgIFVpbnQzMjogJ1VOU0lHTkVEX0lOVCcsXG4gICAgRmxvYXQzMjogJ0ZMT0FUJ1xufTtcblxuLyoqXG4gKiBUaGUgYFZlcnRleEJ1ZmZlcmAgY2xhc3MgdHVybnMgYSBgU3RydWN0QXJyYXlgIGludG8gYSBXZWJHTCBidWZmZXIuIEVhY2ggbWVtYmVyIG9mIHRoZSBTdHJ1Y3RBcnJheSdzXG4gKiBTdHJ1Y3QgdHlwZSBpcyBjb252ZXJ0ZWQgdG8gYSBXZWJHTCBhdHJpYnV0ZS5cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFZlcnRleEJ1ZmZlciB7XG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBkeW5hbWljRHJhdyBXaGV0aGVyIHRoaXMgYnVmZmVyIHdpbGwgYmUgcmVwZWF0ZWRseSB1cGRhdGVkLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQgICAgICAgICAsIGFycmF5ICAgICAgICAgICAgICwgYXR0cmlidXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBkeW5hbWljRHJhdyAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG4gICAgICAgIHRoaXMuaXRlbVNpemUgPSBhcnJheS5ieXRlc1BlckVsZW1lbnQ7XG4gICAgICAgIHRoaXMuZHluYW1pY0RyYXcgPSBkeW5hbWljRHJhdztcblxuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgIGNvbnRleHQuYmluZFZlcnRleEJ1ZmZlci5zZXQodGhpcy5idWZmZXIpO1xuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgYXJyYXkuYXJyYXlCdWZmZXIsIHRoaXMuZHluYW1pY0RyYXcgPyBnbC5EWU5BTUlDX0RSQVcgOiBnbC5TVEFUSUNfRFJBVyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmR5bmFtaWNEcmF3KSB7XG4gICAgICAgICAgICBkZWxldGUgYXJyYXkuYXJyYXlCdWZmZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kKCkge1xuICAgICAgICB0aGlzLmNvbnRleHQuYmluZFZlcnRleEJ1ZmZlci5zZXQodGhpcy5idWZmZXIpO1xuICAgIH1cblxuICAgIHVwZGF0ZURhdGEoYXJyYXkgICAgICAgICAgICAgKSB7XG4gICAgICAgIGFzc2VydChhcnJheS5sZW5ndGggPT09IHRoaXMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIHRoaXMuYmluZCgpO1xuICAgICAgICBnbC5idWZmZXJTdWJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgMCwgYXJyYXkuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVuYWJsZUF0dHJpYnV0ZXMoZ2wgICAgICAgICAgICAgICAgICAgICAgICwgcHJvZ3JhbSAgICAgICAgICkge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgY29uc3QgbWVtYmVyID0gdGhpcy5hdHRyaWJ1dGVzW2pdO1xuICAgICAgICAgICAgY29uc3QgYXR0cmliSW5kZXggICAgICAgICAgICAgICAgPSBwcm9ncmFtLmF0dHJpYnV0ZXNbbWVtYmVyLm5hbWVdO1xuICAgICAgICAgICAgaWYgKGF0dHJpYkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShhdHRyaWJJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGF0dHJpYnV0ZSBwb2ludGVycyBpbiBhIFdlYkdMIGNvbnRleHRcbiAgICAgKiBAcGFyYW0gZ2wgVGhlIFdlYkdMIGNvbnRleHRcbiAgICAgKiBAcGFyYW0gcHJvZ3JhbSBUaGUgYWN0aXZlIFdlYkdMIHByb2dyYW1cbiAgICAgKiBAcGFyYW0gdmVydGV4T2Zmc2V0IEluZGV4IG9mIHRoZSBzdGFydGluZyB2ZXJ0ZXggb2YgdGhlIHNlZ21lbnRcbiAgICAgKi9cbiAgICBzZXRWZXJ0ZXhBdHRyaWJQb2ludGVycyhnbCAgICAgICAgICAgICAgICAgICAgICAgLCBwcm9ncmFtICAgICAgICAgLCB2ZXJ0ZXhPZmZzZXQgICAgICAgICApIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG1lbWJlciA9IHRoaXMuYXR0cmlidXRlc1tqXTtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJpYkluZGV4ICAgICAgICAgICAgICAgID0gcHJvZ3JhbS5hdHRyaWJ1dGVzW21lbWJlci5uYW1lXTtcblxuICAgICAgICAgICAgaWYgKGF0dHJpYkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgbWVtYmVyLmNvbXBvbmVudHMsXG4gICAgICAgICAgICAgICAgICAgIChnbCAgICAgKVtBdHRyaWJ1dGVUeXBlW21lbWJlci50eXBlXV0sXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1TaXplLFxuICAgICAgICAgICAgICAgICAgICBtZW1iZXIub2Zmc2V0ICsgKHRoaXMuaXRlbVNpemUgKiAodmVydGV4T2Zmc2V0IHx8IDApKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IHRoZSBHTCBidWZmZXIgYm91bmQgdG8gdGhlIGdpdmVuIFdlYkdMIGNvbnRleHRcbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyKSB7XG4gICAgICAgICAgICBnbC5kZWxldGVCdWZmZXIodGhpcy5idWZmZXIpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYnVmZmVyO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFZlcnRleEJ1ZmZlcjtcbiIsIi8vICAgICAgXG5cbmNvbnN0IHN1cHBvcnRlZCA9IHJlcXVpcmUoJ0BtYXBib3gvbWFwYm94LWdsLXN1cHBvcnRlZCcpO1xuY29uc3QgYnJvd3NlciA9IHJlcXVpcmUoJy4vdXRpbC9icm93c2VyJyk7XG5jb25zdCB2ZXJzaW9uICAgICAgICAgPSByZXF1aXJlKCcuLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uO1xuY29uc3QgTWFwID0gcmVxdWlyZSgnLi91aS9tYXAnKTtcbmNvbnN0IE5hdmlnYXRpb25Db250cm9sID0gcmVxdWlyZSgnLi91aS9jb250cm9sL25hdmlnYXRpb25fY29udHJvbCcpO1xuY29uc3QgR2VvbG9jYXRlQ29udHJvbCA9IHJlcXVpcmUoJy4vdWkvY29udHJvbC9nZW9sb2NhdGVfY29udHJvbCcpO1xuY29uc3QgQXR0cmlidXRpb25Db250cm9sID0gcmVxdWlyZSgnLi91aS9jb250cm9sL2F0dHJpYnV0aW9uX2NvbnRyb2wnKTtcbmNvbnN0IFNjYWxlQ29udHJvbCA9IHJlcXVpcmUoJy4vdWkvY29udHJvbC9zY2FsZV9jb250cm9sJyk7XG5jb25zdCBGdWxsc2NyZWVuQ29udHJvbCA9IHJlcXVpcmUoJy4vdWkvY29udHJvbC9mdWxsc2NyZWVuX2NvbnRyb2wnKTtcbmNvbnN0IFBvcHVwID0gcmVxdWlyZSgnLi91aS9wb3B1cCcpO1xuY29uc3QgTWFya2VyID0gcmVxdWlyZSgnLi91aS9tYXJrZXInKTtcbmNvbnN0IFN0eWxlID0gcmVxdWlyZSgnLi9zdHlsZS9zdHlsZScpO1xuY29uc3QgTG5nTGF0ID0gcmVxdWlyZSgnLi9nZW8vbG5nX2xhdCcpO1xuY29uc3QgTG5nTGF0Qm91bmRzID0gcmVxdWlyZSgnLi9nZW8vbG5nX2xhdF9ib3VuZHMnKTtcbmNvbnN0IFBvaW50ID0gcmVxdWlyZSgnQG1hcGJveC9wb2ludC1nZW9tZXRyeScpO1xuY29uc3QgRXZlbnRlZCA9IHJlcXVpcmUoJy4vdXRpbC9ldmVudGVkJyk7XG5jb25zdCBjb25maWcgPSByZXF1aXJlKCcuL3V0aWwvY29uZmlnJyk7XG5jb25zdCBydGxUZXh0UGx1Z2luID0gcmVxdWlyZSgnLi9zb3VyY2UvcnRsX3RleHRfcGx1Z2luJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHZlcnNpb24sXG4gICAgc3VwcG9ydGVkLFxuXG4gICAgd29ya2VyQ291bnQ6IE1hdGgubWF4KE1hdGguZmxvb3IoYnJvd3Nlci5oYXJkd2FyZUNvbmN1cnJlbmN5IC8gMiksIDEpLFxuICAgIHNldFJUTFRleHRQbHVnaW46IHJ0bFRleHRQbHVnaW4uc2V0UlRMVGV4dFBsdWdpbixcblxuICAgIE1hcCxcbiAgICBOYXZpZ2F0aW9uQ29udHJvbCxcbiAgICBHZW9sb2NhdGVDb250cm9sLFxuICAgIEF0dHJpYnV0aW9uQ29udHJvbCxcbiAgICBTY2FsZUNvbnRyb2wsXG4gICAgRnVsbHNjcmVlbkNvbnRyb2wsXG4gICAgUG9wdXAsXG4gICAgTWFya2VyLFxuICAgIFN0eWxlLFxuICAgIExuZ0xhdCxcbiAgICBMbmdMYXRCb3VuZHMsXG4gICAgUG9pbnQsXG4gICAgRXZlbnRlZCxcbiAgICBjb25maWcsXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBtYXAncyBbYWNjZXNzIHRva2VuXShodHRwczovL3d3dy5tYXBib3guY29tL2hlbHAvZGVmaW5lLWFjY2Vzcy10b2tlbi8pLlxuICAgICAqXG4gICAgICogQHZhciB7c3RyaW5nfSBhY2Nlc3NUb2tlblxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwYm94Z2wuYWNjZXNzVG9rZW4gPSBteUFjY2Vzc1Rva2VuO1xuICAgICAqIEBzZWUgW0Rpc3BsYXkgYSBtYXBdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGVzLylcbiAgICAgKi9cbiAgICBnZXQgYWNjZXNzVG9rZW4oKSB7XG4gICAgICAgIHJldHVybiBjb25maWcuQUNDRVNTX1RPS0VOO1xuICAgIH0sXG5cbiAgICBzZXQgYWNjZXNzVG9rZW4odG9rZW4gICAgICAgICkge1xuICAgICAgICBjb25maWcuQUNDRVNTX1RPS0VOID0gdG9rZW47XG4gICAgfVxufTtcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiBNYXBib3ggR0wgSlMgaW4gdXNlIGFzIHNwZWNpZmllZCBpbiBgcGFja2FnZS5qc29uYCxcbiAqIGBDSEFOR0VMT0cubWRgLCBhbmQgdGhlIEdpdEh1YiByZWxlYXNlLlxuICpcbiAqIEB2YXIge3N0cmluZ30gdmVyc2lvblxuICovXG5cbi8qKlxuICogVGVzdCB3aGV0aGVyIHRoZSBicm93c2VyIFtzdXBwb3J0cyBNYXBib3ggR0wgSlNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vaGVscC9tYXBib3gtYnJvd3Nlci1zdXBwb3J0LyNtYXBib3gtZ2wtanMpLlxuICpcbiAqIEBmdW5jdGlvbiBzdXBwb3J0ZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdD1mYWxzZV0gSWYgYHRydWVgLFxuICogICB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gYGZhbHNlYCBpZiB0aGUgcGVyZm9ybWFuY2Ugb2YgTWFwYm94IEdMIEpTIHdvdWxkXG4gKiAgIGJlIGRyYW1hdGljYWxseSB3b3JzZSB0aGFuIGV4cGVjdGVkIChlLmcuIGEgc29mdHdhcmUgV2ViR0wgcmVuZGVyZXIgd291bGQgYmUgdXNlZCkuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqIG1hcGJveGdsLnN1cHBvcnRlZCgpIC8vID0gdHJ1ZVxuICogQHNlZSBbQ2hlY2sgZm9yIGJyb3dzZXIgc3VwcG9ydF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jaGVjay1mb3Itc3VwcG9ydC8pXG4gKi9cblxuLyoqXG4gKiBTZXRzIHRoZSBtYXAncyBbUlRMIHRleHQgcGx1Z2luXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9wbHVnaW5zLyNtYXBib3gtZ2wtcnRsLXRleHQpLlxuICogTmVjZXNzYXJ5IGZvciBzdXBwb3J0aW5nIGxhbmd1YWdlcyBsaWtlIEFyYWJpYyBhbmQgSGVicmV3IHRoYXQgYXJlIHdyaXR0ZW4gcmlnaHQtdG8tbGVmdC5cbiAqXG4gKiBAZnVuY3Rpb24gc2V0UlRMVGV4dFBsdWdpblxuICogQHBhcmFtIHtzdHJpbmd9IHBsdWdpblVSTCBVUkwgcG9pbnRpbmcgdG8gdGhlIE1hcGJveCBSVEwgdGV4dCBwbHVnaW4gc291cmNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIHdpdGggYW4gZXJyb3IgYXJndW1lbnQgaWYgdGhlcmUgaXMgYW4gZXJyb3IuXG4gKiBAZXhhbXBsZVxuICogbWFwYm94Z2wuc2V0UlRMVGV4dFBsdWdpbignaHR0cHM6Ly9hcGkubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvcGx1Z2lucy9tYXBib3gtZ2wtcnRsLXRleHQvdjAuMS4xL21hcGJveC1nbC1ydGwtdGV4dC5qcycpO1xuICogQHNlZSBbQWRkIHN1cHBvcnQgZm9yIHJpZ2h0LXRvLWxlZnQgc2NyaXB0c10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9tYXBib3gtZ2wtcnRsLXRleHQvKVxuICovXG4iLCIvLyAgICAgIFxuXG5jb25zdCBwYXR0ZXJuID0gcmVxdWlyZSgnLi9wYXR0ZXJuJyk7XG5jb25zdCBTdGVuY2lsTW9kZSA9IHJlcXVpcmUoJy4uL2dsL3N0ZW5jaWxfbW9kZScpO1xuY29uc3QgRGVwdGhNb2RlID0gcmVxdWlyZSgnLi4vZ2wvZGVwdGhfbW9kZScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5tb2R1bGUuZXhwb3J0cyA9IGRyYXdCYWNrZ3JvdW5kO1xuXG5mdW5jdGlvbiBkcmF3QmFja2dyb3VuZChwYWludGVyICAgICAgICAgLCBzb3VyY2VDYWNoZSAgICAgICAgICAgICAsIGxheWVyICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgIGNvbnN0IGNvbG9yID0gbGF5ZXIucGFpbnQuZ2V0KCdiYWNrZ3JvdW5kLWNvbG9yJyk7XG4gICAgY29uc3Qgb3BhY2l0eSA9IGxheWVyLnBhaW50LmdldCgnYmFja2dyb3VuZC1vcGFjaXR5Jyk7XG5cbiAgICBpZiAob3BhY2l0eSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gcGFpbnRlci50cmFuc2Zvcm07XG4gICAgY29uc3QgdGlsZVNpemUgPSB0cmFuc2Zvcm0udGlsZVNpemU7XG4gICAgY29uc3QgaW1hZ2UgPSBsYXllci5wYWludC5nZXQoJ2JhY2tncm91bmQtcGF0dGVybicpO1xuXG4gICAgY29uc3QgcGFzcyA9ICghaW1hZ2UgJiYgY29sb3IuYSA9PT0gMSAmJiBvcGFjaXR5ID09PSAxKSA/ICdvcGFxdWUnIDogJ3RyYW5zbHVjZW50JztcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzICE9PSBwYXNzKSByZXR1cm47XG5cbiAgICBjb250ZXh0LnNldFN0ZW5jaWxNb2RlKFN0ZW5jaWxNb2RlLmRpc2FibGVkKTtcbiAgICBjb250ZXh0LnNldERlcHRoTW9kZShwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKDAsIHBhc3MgPT09ICdvcGFxdWUnID8gRGVwdGhNb2RlLlJlYWRXcml0ZSA6IERlcHRoTW9kZS5SZWFkT25seSkpO1xuICAgIGNvbnRleHQuc2V0Q29sb3JNb2RlKHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKTtcblxuICAgIGxldCBwcm9ncmFtO1xuICAgIGlmIChpbWFnZSkge1xuICAgICAgICBpZiAocGF0dGVybi5pc1BhdHRlcm5NaXNzaW5nKGltYWdlLCBwYWludGVyKSkgcmV0dXJuO1xuICAgICAgICBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdiYWNrZ3JvdW5kUGF0dGVybicpO1xuICAgICAgICBwYXR0ZXJuLnByZXBhcmUoaW1hZ2UsIHBhaW50ZXIsIHByb2dyYW0pO1xuICAgICAgICBwYWludGVyLnRpbGVFeHRlbnRQYXR0ZXJuVkFPLmJpbmQoY29udGV4dCwgcHJvZ3JhbSwgcGFpbnRlci50aWxlRXh0ZW50QnVmZmVyLCBbXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgnYmFja2dyb3VuZCcpO1xuICAgICAgICBnbC51bmlmb3JtNGZ2KHByb2dyYW0udW5pZm9ybXMudV9jb2xvciwgW2NvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIsIGNvbG9yLmFdKTtcbiAgICAgICAgcGFpbnRlci50aWxlRXh0ZW50VkFPLmJpbmQoY29udGV4dCwgcHJvZ3JhbSwgcGFpbnRlci50aWxlRXh0ZW50QnVmZmVyLCBbXSk7XG4gICAgfVxuXG4gICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udW5pZm9ybXMudV9vcGFjaXR5LCBvcGFjaXR5KTtcbiAgICBjb25zdCB0aWxlSURzID0gdHJhbnNmb3JtLmNvdmVyaW5nVGlsZXMoe3RpbGVTaXplfSk7XG5cbiAgICBmb3IgKGNvbnN0IHRpbGVJRCBvZiB0aWxlSURzKSB7XG4gICAgICAgIGlmIChpbWFnZSkge1xuICAgICAgICAgICAgcGF0dGVybi5zZXRUaWxlKHt0aWxlSUQsIHRpbGVTaXplfSwgcGFpbnRlciwgcHJvZ3JhbSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLnVuaWZvcm1zLnVfbWF0cml4LCBmYWxzZSwgcGFpbnRlci50cmFuc2Zvcm0uY2FsY3VsYXRlUG9zTWF0cml4KHRpbGVJRC50b1Vud3JhcHBlZCgpKSk7XG4gICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIHBhaW50ZXIudGlsZUV4dGVudEJ1ZmZlci5sZW5ndGgpO1xuICAgIH1cbn1cbiIsIi8vICAgICAgXG5cbmNvbnN0IHBpeGVsc1RvVGlsZVVuaXRzID0gcmVxdWlyZSgnLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzJyk7XG5jb25zdCBTdGVuY2lsTW9kZSA9IHJlcXVpcmUoJy4uL2dsL3N0ZW5jaWxfbW9kZScpO1xuY29uc3QgRGVwdGhNb2RlID0gcmVxdWlyZSgnLi4vZ2wvZGVwdGhfbW9kZScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbm1vZHVsZS5leHBvcnRzID0gZHJhd0NpcmNsZXM7XG5cbmZ1bmN0aW9uIGRyYXdDaXJjbGVzKHBhaW50ZXIgICAgICAgICAsIHNvdXJjZUNhY2hlICAgICAgICAgICAgICwgbGF5ZXIgICAgICAgICAgICAgICAgICAsIGNvb3JkcyAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzICE9PSAndHJhbnNsdWNlbnQnKSByZXR1cm47XG5cbiAgICBjb25zdCBvcGFjaXR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdjaXJjbGUtb3BhY2l0eScpO1xuICAgIGNvbnN0IHN0cm9rZVdpZHRoID0gbGF5ZXIucGFpbnQuZ2V0KCdjaXJjbGUtc3Ryb2tlLXdpZHRoJyk7XG4gICAgY29uc3Qgc3Ryb2tlT3BhY2l0eSA9IGxheWVyLnBhaW50LmdldCgnY2lyY2xlLXN0cm9rZS1vcGFjaXR5Jyk7XG5cbiAgICBpZiAob3BhY2l0eS5jb25zdGFudE9yKDEpID09PSAwICYmIChzdHJva2VXaWR0aC5jb25zdGFudE9yKDEpID09PSAwIHx8IHN0cm9rZU9wYWNpdHkuY29uc3RhbnRPcigxKSA9PT0gMCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgY29udGV4dC5zZXREZXB0aE1vZGUocGFpbnRlci5kZXB0aE1vZGVGb3JTdWJsYXllcigwLCBEZXB0aE1vZGUuUmVhZE9ubHkpKTtcbiAgICAvLyBBbGxvdyBjaXJjbGVzIHRvIGJlIGRyYXduIGFjcm9zcyBib3VuZGFyaWVzLCBzbyB0aGF0XG4gICAgLy8gbGFyZ2UgY2lyY2xlcyBhcmUgbm90IGNsaXBwZWQgdG8gdGlsZXNcbiAgICBjb250ZXh0LnNldFN0ZW5jaWxNb2RlKFN0ZW5jaWxNb2RlLmRpc2FibGVkKTtcbiAgICBjb250ZXh0LnNldENvbG9yTW9kZShwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSk7XG5cbiAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvb3JkID0gY29vcmRzW2ldO1xuXG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgY29uc3QgYnVja2V0ICAgICAgICAgICAgICAgICAgID0gKHRpbGUuZ2V0QnVja2V0KGxheWVyKSAgICAgKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHByZXZQcm9ncmFtID0gcGFpbnRlci5jb250ZXh0LnByb2dyYW0uZ2V0KCk7XG4gICAgICAgIGNvbnN0IHByb2dyYW1Db25maWd1cmF0aW9uID0gYnVja2V0LnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQobGF5ZXIuaWQpO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdjaXJjbGUnLCBwcm9ncmFtQ29uZmlndXJhdGlvbik7XG4gICAgICAgIGlmIChmaXJzdCB8fCBwcm9ncmFtLnByb2dyYW0gIT09IHByZXZQcm9ncmFtKSB7XG4gICAgICAgICAgICBwcm9ncmFtQ29uZmlndXJhdGlvbi5zZXRVbmlmb3Jtcyhjb250ZXh0LCBwcm9ncmFtLCBsYXllci5wYWludCwge3pvb206IHBhaW50ZXIudHJhbnNmb3JtLnpvb219KTtcbiAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBnbC51bmlmb3JtMWYocHJvZ3JhbS51bmlmb3Jtcy51X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UsIHBhaW50ZXIudHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UpO1xuICAgICAgICBnbC51bmlmb3JtMWkocHJvZ3JhbS51bmlmb3Jtcy51X3NjYWxlX3dpdGhfbWFwLCBsYXllci5wYWludC5nZXQoJ2NpcmNsZS1waXRjaC1zY2FsZScpID09PSAnbWFwJyA/IDEgOiAwKTtcbiAgICAgICAgaWYgKGxheWVyLnBhaW50LmdldCgnY2lyY2xlLXBpdGNoLWFsaWdubWVudCcpID09PSAnbWFwJykge1xuICAgICAgICAgICAgZ2wudW5pZm9ybTFpKHByb2dyYW0udW5pZm9ybXMudV9waXRjaF93aXRoX21hcCwgMSk7XG4gICAgICAgICAgICBjb25zdCBwaXhlbFJhdGlvID0gcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgMSwgcGFpbnRlci50cmFuc2Zvcm0uem9vbSk7XG4gICAgICAgICAgICBnbC51bmlmb3JtMmYocHJvZ3JhbS51bmlmb3Jtcy51X2V4dHJ1ZGVfc2NhbGUsIHBpeGVsUmF0aW8sIHBpeGVsUmF0aW8pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2wudW5pZm9ybTFpKHByb2dyYW0udW5pZm9ybXMudV9waXRjaF93aXRoX21hcCwgMCk7XG4gICAgICAgICAgICBnbC51bmlmb3JtMmZ2KHByb2dyYW0udW5pZm9ybXMudV9leHRydWRlX3NjYWxlLCBwYWludGVyLnRyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLnVuaWZvcm1zLnVfbWF0cml4LCBmYWxzZSwgcGFpbnRlci50cmFuc2xhdGVQb3NNYXRyaXgoXG4gICAgICAgICAgICBjb29yZC5wb3NNYXRyaXgsXG4gICAgICAgICAgICB0aWxlLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdjaXJjbGUtdHJhbnNsYXRlJyksXG4gICAgICAgICAgICBsYXllci5wYWludC5nZXQoJ2NpcmNsZS10cmFuc2xhdGUtYW5jaG9yJylcbiAgICAgICAgKSk7XG5cbiAgICAgICAgcHJvZ3JhbS5kcmF3KFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIGdsLlRSSUFOR0xFUyxcbiAgICAgICAgICAgIGxheWVyLmlkLFxuICAgICAgICAgICAgYnVja2V0LmxheW91dFZlcnRleEJ1ZmZlcixcbiAgICAgICAgICAgIGJ1Y2tldC5pbmRleEJ1ZmZlcixcbiAgICAgICAgICAgIGJ1Y2tldC5zZWdtZW50cyxcbiAgICAgICAgICAgIHByb2dyYW1Db25maWd1cmF0aW9uKTtcbiAgICB9XG59XG4iLCIvLyAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbmNvbnN0IHBpeGVsc1RvVGlsZVVuaXRzID0gcmVxdWlyZSgnLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzJyk7XG5jb25zdCBEZXB0aE1vZGUgPSByZXF1aXJlKCcuLi9nbC9kZXB0aF9tb2RlJyk7XG5jb25zdCBTdGVuY2lsTW9kZSA9IHJlcXVpcmUoJy4uL2dsL3N0ZW5jaWxfbW9kZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRyYXdDb2xsaXNpb25EZWJ1ZztcblxuZnVuY3Rpb24gZHJhd0NvbGxpc2lvbkRlYnVnR2VvbWV0cnkocGFpbnRlciAgICAgICAgICwgc291cmNlQ2FjaGUgICAgICAgICAgICAgLCBsYXllciAgICAgICAgICAgICwgY29vcmRzICAgICAgICAgICAgICAgICAgICAgICAgICwgZHJhd0NpcmNsZXMgICAgICAgICApIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCBwcm9ncmFtID0gZHJhd0NpcmNsZXMgPyBwYWludGVyLnVzZVByb2dyYW0oJ2NvbGxpc2lvbkNpcmNsZScpIDogcGFpbnRlci51c2VQcm9ncmFtKCdjb2xsaXNpb25Cb3gnKTtcblxuICAgIGNvbnRleHQuc2V0RGVwdGhNb2RlKERlcHRoTW9kZS5kaXNhYmxlZCk7XG4gICAgY29udGV4dC5zZXRTdGVuY2lsTW9kZShTdGVuY2lsTW9kZS5kaXNhYmxlZCk7XG4gICAgY29udGV4dC5zZXRDb2xvck1vZGUocGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCkpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY29vcmQgPSBjb29yZHNbaV07XG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgY29uc3QgYnVja2V0ICAgICAgICAgICAgICAgID0gKHRpbGUuZ2V0QnVja2V0KGxheWVyKSAgICAgKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBidWZmZXJzID0gZHJhd0NpcmNsZXMgPyBidWNrZXQuY29sbGlzaW9uQ2lyY2xlIDogYnVja2V0LmNvbGxpc2lvbkJveDtcbiAgICAgICAgaWYgKCFidWZmZXJzKSBjb250aW51ZTtcblxuXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS51bmlmb3Jtcy51X21hdHJpeCwgZmFsc2UsIGNvb3JkLnBvc01hdHJpeCk7XG5cbiAgICAgICAgaWYgKCFkcmF3Q2lyY2xlcykge1xuICAgICAgICAgICAgY29udGV4dC5saW5lV2lkdGguc2V0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udW5pZm9ybXMudV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlLCBwYWludGVyLnRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlKTtcbiAgICAgICAgY29uc3QgcGl4ZWxSYXRpbyA9IHBpeGVsc1RvVGlsZVVuaXRzKHRpbGUsIDEsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20pO1xuICAgICAgICBjb25zdCBzY2FsZSA9IE1hdGgucG93KDIsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20gLSB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWik7XG4gICAgICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVuaWZvcm1zLnVfcGl4ZWxzX3RvX3RpbGVfdW5pdHMsIHBpeGVsUmF0aW8pO1xuICAgICAgICBnbC51bmlmb3JtMmYocHJvZ3JhbS51bmlmb3Jtcy51X2V4dHJ1ZGVfc2NhbGUsXG4gICAgICAgICAgICBwYWludGVyLnRyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHNbMF0gLyAocGl4ZWxSYXRpbyAqIHNjYWxlKSxcbiAgICAgICAgICAgIHBhaW50ZXIudHJhbnNmb3JtLnBpeGVsc1RvR0xVbml0c1sxXSAvIChwaXhlbFJhdGlvICogc2NhbGUpKTtcblxuICAgICAgICBwcm9ncmFtLmRyYXcoXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgZHJhd0NpcmNsZXMgPyBnbC5UUklBTkdMRVMgOiBnbC5MSU5FUyxcbiAgICAgICAgICAgIGxheWVyLmlkLFxuICAgICAgICAgICAgYnVmZmVycy5sYXlvdXRWZXJ0ZXhCdWZmZXIsXG4gICAgICAgICAgICBidWZmZXJzLmluZGV4QnVmZmVyLFxuICAgICAgICAgICAgYnVmZmVycy5zZWdtZW50cyxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBidWZmZXJzLmNvbGxpc2lvblZlcnRleEJ1ZmZlcixcbiAgICAgICAgICAgIG51bGwpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhd0NvbGxpc2lvbkRlYnVnKHBhaW50ZXIgICAgICAgICAsIHNvdXJjZUNhY2hlICAgICAgICAgICAgICwgbGF5ZXIgICAgICAgICAgICAsIGNvb3JkcyAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICBkcmF3Q29sbGlzaW9uRGVidWdHZW9tZXRyeShwYWludGVyLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3JkcywgZmFsc2UpO1xuICAgIGRyYXdDb2xsaXNpb25EZWJ1Z0dlb21ldHJ5KHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzLCB0cnVlKTtcbn1cbiIsIi8vICAgICAgXG5cbmNvbnN0IGJyb3dzZXIgPSByZXF1aXJlKCcuLi91dGlsL2Jyb3dzZXInKTtcbmNvbnN0IG1hdDQgPSByZXF1aXJlKCdAbWFwYm94L2dsLW1hdHJpeCcpLm1hdDQ7XG5jb25zdCBFWFRFTlQgPSByZXF1aXJlKCcuLi9kYXRhL2V4dGVudCcpO1xuY29uc3QgVmVydGV4QXJyYXlPYmplY3QgPSByZXF1aXJlKCcuL3ZlcnRleF9hcnJheV9vYmplY3QnKTtcbmNvbnN0IHtQb3NBcnJheX0gPSByZXF1aXJlKCcuLi9kYXRhL2FycmF5X3R5cGVzJyk7XG5jb25zdCBwb3NBdHRyaWJ1dGVzID0gcmVxdWlyZSgnLi4vZGF0YS9wb3NfYXR0cmlidXRlcycpO1xuY29uc3QgRGVwdGhNb2RlID0gcmVxdWlyZSgnLi4vZ2wvZGVwdGhfbW9kZScpO1xuY29uc3QgU3RlbmNpbE1vZGUgPSByZXF1aXJlKCcuLi9nbC9zdGVuY2lsX21vZGUnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5tb2R1bGUuZXhwb3J0cyA9IGRyYXdEZWJ1ZztcblxuZnVuY3Rpb24gZHJhd0RlYnVnKHBhaW50ZXIgICAgICAgICAsIHNvdXJjZUNhY2hlICAgICAgICAgICAgICwgY29vcmRzICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGRyYXdEZWJ1Z1RpbGUocGFpbnRlciwgc291cmNlQ2FjaGUsIGNvb3Jkc1tpXSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmF3RGVidWdUaWxlKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBjb29yZCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgY29udGV4dC5saW5lV2lkdGguc2V0KDEgKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW8pO1xuXG4gICAgY29uc3QgcG9zTWF0cml4ID0gY29vcmQucG9zTWF0cml4O1xuICAgIGNvbnN0IHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0oJ2RlYnVnJyk7XG5cbiAgICBjb250ZXh0LnNldERlcHRoTW9kZShEZXB0aE1vZGUuZGlzYWJsZWQpO1xuICAgIGNvbnRleHQuc2V0U3RlbmNpbE1vZGUoU3RlbmNpbE1vZGUuZGlzYWJsZWQpO1xuICAgIGNvbnRleHQuc2V0Q29sb3JNb2RlKHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKTtcblxuICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS51bmlmb3Jtcy51X21hdHJpeCwgZmFsc2UsIHBvc01hdHJpeCk7XG4gICAgZ2wudW5pZm9ybTRmKHByb2dyYW0udW5pZm9ybXMudV9jb2xvciwgMSwgMCwgMCwgMSk7XG4gICAgcGFpbnRlci5kZWJ1Z1ZBTy5iaW5kKGNvbnRleHQsIHByb2dyYW0sIHBhaW50ZXIuZGVidWdCdWZmZXIsIFtdKTtcbiAgICBnbC5kcmF3QXJyYXlzKGdsLkxJTkVfU1RSSVAsIDAsIHBhaW50ZXIuZGVidWdCdWZmZXIubGVuZ3RoKTtcblxuICAgIGNvbnN0IHZlcnRpY2VzID0gY3JlYXRlVGV4dFZlcnRpY2llcyhjb29yZC50b1N0cmluZygpLCA1MCwgMjAwLCA1KTtcbiAgICBjb25zdCBkZWJ1Z1RleHRBcnJheSA9IG5ldyBQb3NBcnJheSgpO1xuICAgIGZvciAobGV0IHYgPSAwOyB2IDwgdmVydGljZXMubGVuZ3RoOyB2ICs9IDIpIHtcbiAgICAgICAgZGVidWdUZXh0QXJyYXkuZW1wbGFjZUJhY2sodmVydGljZXNbdl0sIHZlcnRpY2VzW3YgKyAxXSk7XG4gICAgfVxuICAgIGNvbnN0IGRlYnVnVGV4dEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKGRlYnVnVGV4dEFycmF5LCBwb3NBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgIGNvbnN0IGRlYnVnVGV4dFZBTyA9IG5ldyBWZXJ0ZXhBcnJheU9iamVjdCgpO1xuICAgIGRlYnVnVGV4dFZBTy5iaW5kKGNvbnRleHQsIHByb2dyYW0sIGRlYnVnVGV4dEJ1ZmZlciwgW10pO1xuICAgIGdsLnVuaWZvcm00Zihwcm9ncmFtLnVuaWZvcm1zLnVfY29sb3IsIDEsIDEsIDEsIDEpO1xuXG4gICAgLy8gRHJhdyB0aGUgaGFsbyB3aXRoIG11bHRpcGxlIDFweCBsaW5lcyBpbnN0ZWFkIG9mIG9uZSB3aWRlciBsaW5lIGJlY2F1c2VcbiAgICAvLyB0aGUgZ2wgc3BlYyBkb2Vzbid0IGd1YXJhbnRlZSBzdXBwb3J0IGZvciBsaW5lcyB3aXRoIHdpZHRoID4gMS5cbiAgICBjb25zdCB0aWxlU2l6ZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpLnRpbGVTaXplO1xuICAgIGNvbnN0IG9uZVBpeGVsID0gRVhURU5UIC8gKE1hdGgucG93KDIsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20gLSBjb29yZC5vdmVyc2NhbGVkWikgKiB0aWxlU2l6ZSk7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zID0gW1stMSwgLTFdLCBbLTEsIDFdLCBbMSwgLTFdLCBbMSwgMV1dO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJhbnNsYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb25zW2ldO1xuICAgICAgICBnbC51bmlmb3JtTWF0cml4NGZ2KHByb2dyYW0udW5pZm9ybXMudV9tYXRyaXgsIGZhbHNlLCBtYXQ0LnRyYW5zbGF0ZShbXSwgcG9zTWF0cml4LCBbb25lUGl4ZWwgKiB0cmFuc2xhdGlvblswXSwgb25lUGl4ZWwgKiB0cmFuc2xhdGlvblsxXSwgMF0pKTtcbiAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5MSU5FUywgMCwgZGVidWdUZXh0QnVmZmVyLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgZ2wudW5pZm9ybTRmKHByb2dyYW0udW5pZm9ybXMudV9jb2xvciwgMCwgMCwgMCwgMSk7XG4gICAgZ2wudW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLnVuaWZvcm1zLnVfbWF0cml4LCBmYWxzZSwgcG9zTWF0cml4KTtcbiAgICBnbC5kcmF3QXJyYXlzKGdsLkxJTkVTLCAwLCBkZWJ1Z1RleHRCdWZmZXIubGVuZ3RoKTtcbn1cblxuLy8gRm9udCBkYXRhIEZyb20gSGVyc2hleSBTaW1wbGV4IEZvbnRcbi8vIGh0dHA6Ly9wYXVsYm91cmtlLm5ldC9kYXRhZm9ybWF0cy9oZXJzaGV5L1xuY29uc3Qgc2ltcGxleEZvbnQgPSB7XG4gICAgXCIgXCI6IFsxNiwgW11dLFxuICAgIFwiIVwiOiBbMTAsIFs1LCAyMSwgNSwgNywgLTEsIC0xLCA1LCAyLCA0LCAxLCA1LCAwLCA2LCAxLCA1LCAyXV0sXG4gICAgXCJcXFwiXCI6IFsxNiwgWzQsIDIxLCA0LCAxNCwgLTEsIC0xLCAxMiwgMjEsIDEyLCAxNF1dLFxuICAgIFwiI1wiOiBbMjEsIFsxMSwgMjUsIDQsIC03LCAtMSwgLTEsIDE3LCAyNSwgMTAsIC03LCAtMSwgLTEsIDQsIDEyLCAxOCwgMTIsIC0xLCAtMSwgMywgNiwgMTcsIDZdXSxcbiAgICBcIiRcIjogWzIwLCBbOCwgMjUsIDgsIC00LCAtMSwgLTEsIDEyLCAyNSwgMTIsIC00LCAtMSwgLTEsIDE3LCAxOCwgMTUsIDIwLCAxMiwgMjEsIDgsIDIxLCA1LCAyMCwgMywgMTgsIDMsIDE2LCA0LCAxNCwgNSwgMTMsIDcsIDEyLCAxMywgMTAsIDE1LCA5LCAxNiwgOCwgMTcsIDYsIDE3LCAzLCAxNSwgMSwgMTIsIDAsIDgsIDAsIDUsIDEsIDMsIDNdXSxcbiAgICBcIiVcIjogWzI0LCBbMjEsIDIxLCAzLCAwLCAtMSwgLTEsIDgsIDIxLCAxMCwgMTksIDEwLCAxNywgOSwgMTUsIDcsIDE0LCA1LCAxNCwgMywgMTYsIDMsIDE4LCA0LCAyMCwgNiwgMjEsIDgsIDIxLCAxMCwgMjAsIDEzLCAxOSwgMTYsIDE5LCAxOSwgMjAsIDIxLCAyMSwgLTEsIC0xLCAxNywgNywgMTUsIDYsIDE0LCA0LCAxNCwgMiwgMTYsIDAsIDE4LCAwLCAyMCwgMSwgMjEsIDMsIDIxLCA1LCAxOSwgNywgMTcsIDddXSxcbiAgICBcIiZcIjogWzI2LCBbMjMsIDEyLCAyMywgMTMsIDIyLCAxNCwgMjEsIDE0LCAyMCwgMTMsIDE5LCAxMSwgMTcsIDYsIDE1LCAzLCAxMywgMSwgMTEsIDAsIDcsIDAsIDUsIDEsIDQsIDIsIDMsIDQsIDMsIDYsIDQsIDgsIDUsIDksIDEyLCAxMywgMTMsIDE0LCAxNCwgMTYsIDE0LCAxOCwgMTMsIDIwLCAxMSwgMjEsIDksIDIwLCA4LCAxOCwgOCwgMTYsIDksIDEzLCAxMSwgMTAsIDE2LCAzLCAxOCwgMSwgMjAsIDAsIDIyLCAwLCAyMywgMSwgMjMsIDJdXSxcbiAgICBcIidcIjogWzEwLCBbNSwgMTksIDQsIDIwLCA1LCAyMSwgNiwgMjAsIDYsIDE4LCA1LCAxNiwgNCwgMTVdXSxcbiAgICBcIihcIjogWzE0LCBbMTEsIDI1LCA5LCAyMywgNywgMjAsIDUsIDE2LCA0LCAxMSwgNCwgNywgNSwgMiwgNywgLTIsIDksIC01LCAxMSwgLTddXSxcbiAgICBcIilcIjogWzE0LCBbMywgMjUsIDUsIDIzLCA3LCAyMCwgOSwgMTYsIDEwLCAxMSwgMTAsIDcsIDksIDIsIDcsIC0yLCA1LCAtNSwgMywgLTddXSxcbiAgICBcIipcIjogWzE2LCBbOCwgMjEsIDgsIDksIC0xLCAtMSwgMywgMTgsIDEzLCAxMiwgLTEsIC0xLCAxMywgMTgsIDMsIDEyXV0sXG4gICAgXCIrXCI6IFsyNiwgWzEzLCAxOCwgMTMsIDAsIC0xLCAtMSwgNCwgOSwgMjIsIDldXSxcbiAgICBcIixcIjogWzEwLCBbNiwgMSwgNSwgMCwgNCwgMSwgNSwgMiwgNiwgMSwgNiwgLTEsIDUsIC0zLCA0LCAtNF1dLFxuICAgIFwiLVwiOiBbMjYsIFs0LCA5LCAyMiwgOV1dLFxuICAgIFwiLlwiOiBbMTAsIFs1LCAyLCA0LCAxLCA1LCAwLCA2LCAxLCA1LCAyXV0sXG4gICAgXCIvXCI6IFsyMiwgWzIwLCAyNSwgMiwgLTddXSxcbiAgICBcIjBcIjogWzIwLCBbOSwgMjEsIDYsIDIwLCA0LCAxNywgMywgMTIsIDMsIDksIDQsIDQsIDYsIDEsIDksIDAsIDExLCAwLCAxNCwgMSwgMTYsIDQsIDE3LCA5LCAxNywgMTIsIDE2LCAxNywgMTQsIDIwLCAxMSwgMjEsIDksIDIxXV0sXG4gICAgXCIxXCI6IFsyMCwgWzYsIDE3LCA4LCAxOCwgMTEsIDIxLCAxMSwgMF1dLFxuICAgIFwiMlwiOiBbMjAsIFs0LCAxNiwgNCwgMTcsIDUsIDE5LCA2LCAyMCwgOCwgMjEsIDEyLCAyMSwgMTQsIDIwLCAxNSwgMTksIDE2LCAxNywgMTYsIDE1LCAxNSwgMTMsIDEzLCAxMCwgMywgMCwgMTcsIDBdXSxcbiAgICBcIjNcIjogWzIwLCBbNSwgMjEsIDE2LCAyMSwgMTAsIDEzLCAxMywgMTMsIDE1LCAxMiwgMTYsIDExLCAxNywgOCwgMTcsIDYsIDE2LCAzLCAxNCwgMSwgMTEsIDAsIDgsIDAsIDUsIDEsIDQsIDIsIDMsIDRdXSxcbiAgICBcIjRcIjogWzIwLCBbMTMsIDIxLCAzLCA3LCAxOCwgNywgLTEsIC0xLCAxMywgMjEsIDEzLCAwXV0sXG4gICAgXCI1XCI6IFsyMCwgWzE1LCAyMSwgNSwgMjEsIDQsIDEyLCA1LCAxMywgOCwgMTQsIDExLCAxNCwgMTQsIDEzLCAxNiwgMTEsIDE3LCA4LCAxNywgNiwgMTYsIDMsIDE0LCAxLCAxMSwgMCwgOCwgMCwgNSwgMSwgNCwgMiwgMywgNF1dLFxuICAgIFwiNlwiOiBbMjAsIFsxNiwgMTgsIDE1LCAyMCwgMTIsIDIxLCAxMCwgMjEsIDcsIDIwLCA1LCAxNywgNCwgMTIsIDQsIDcsIDUsIDMsIDcsIDEsIDEwLCAwLCAxMSwgMCwgMTQsIDEsIDE2LCAzLCAxNywgNiwgMTcsIDcsIDE2LCAxMCwgMTQsIDEyLCAxMSwgMTMsIDEwLCAxMywgNywgMTIsIDUsIDEwLCA0LCA3XV0sXG4gICAgXCI3XCI6IFsyMCwgWzE3LCAyMSwgNywgMCwgLTEsIC0xLCAzLCAyMSwgMTcsIDIxXV0sXG4gICAgXCI4XCI6IFsyMCwgWzgsIDIxLCA1LCAyMCwgNCwgMTgsIDQsIDE2LCA1LCAxNCwgNywgMTMsIDExLCAxMiwgMTQsIDExLCAxNiwgOSwgMTcsIDcsIDE3LCA0LCAxNiwgMiwgMTUsIDEsIDEyLCAwLCA4LCAwLCA1LCAxLCA0LCAyLCAzLCA0LCAzLCA3LCA0LCA5LCA2LCAxMSwgOSwgMTIsIDEzLCAxMywgMTUsIDE0LCAxNiwgMTYsIDE2LCAxOCwgMTUsIDIwLCAxMiwgMjEsIDgsIDIxXV0sXG4gICAgXCI5XCI6IFsyMCwgWzE2LCAxNCwgMTUsIDExLCAxMywgOSwgMTAsIDgsIDksIDgsIDYsIDksIDQsIDExLCAzLCAxNCwgMywgMTUsIDQsIDE4LCA2LCAyMCwgOSwgMjEsIDEwLCAyMSwgMTMsIDIwLCAxNSwgMTgsIDE2LCAxNCwgMTYsIDksIDE1LCA0LCAxMywgMSwgMTAsIDAsIDgsIDAsIDUsIDEsIDQsIDNdXSxcbiAgICBcIjpcIjogWzEwLCBbNSwgMTQsIDQsIDEzLCA1LCAxMiwgNiwgMTMsIDUsIDE0LCAtMSwgLTEsIDUsIDIsIDQsIDEsIDUsIDAsIDYsIDEsIDUsIDJdXSxcbiAgICBcIjtcIjogWzEwLCBbNSwgMTQsIDQsIDEzLCA1LCAxMiwgNiwgMTMsIDUsIDE0LCAtMSwgLTEsIDYsIDEsIDUsIDAsIDQsIDEsIDUsIDIsIDYsIDEsIDYsIC0xLCA1LCAtMywgNCwgLTRdXSxcbiAgICBcIjxcIjogWzI0LCBbMjAsIDE4LCA0LCA5LCAyMCwgMF1dLFxuICAgIFwiPVwiOiBbMjYsIFs0LCAxMiwgMjIsIDEyLCAtMSwgLTEsIDQsIDYsIDIyLCA2XV0sXG4gICAgXCI+XCI6IFsyNCwgWzQsIDE4LCAyMCwgOSwgNCwgMF1dLFxuICAgIFwiP1wiOiBbMTgsIFszLCAxNiwgMywgMTcsIDQsIDE5LCA1LCAyMCwgNywgMjEsIDExLCAyMSwgMTMsIDIwLCAxNCwgMTksIDE1LCAxNywgMTUsIDE1LCAxNCwgMTMsIDEzLCAxMiwgOSwgMTAsIDksIDcsIC0xLCAtMSwgOSwgMiwgOCwgMSwgOSwgMCwgMTAsIDEsIDksIDJdXSxcbiAgICBcIkBcIjogWzI3LCBbMTgsIDEzLCAxNywgMTUsIDE1LCAxNiwgMTIsIDE2LCAxMCwgMTUsIDksIDE0LCA4LCAxMSwgOCwgOCwgOSwgNiwgMTEsIDUsIDE0LCA1LCAxNiwgNiwgMTcsIDgsIC0xLCAtMSwgMTIsIDE2LCAxMCwgMTQsIDksIDExLCA5LCA4LCAxMCwgNiwgMTEsIDUsIC0xLCAtMSwgMTgsIDE2LCAxNywgOCwgMTcsIDYsIDE5LCA1LCAyMSwgNSwgMjMsIDcsIDI0LCAxMCwgMjQsIDEyLCAyMywgMTUsIDIyLCAxNywgMjAsIDE5LCAxOCwgMjAsIDE1LCAyMSwgMTIsIDIxLCA5LCAyMCwgNywgMTksIDUsIDE3LCA0LCAxNSwgMywgMTIsIDMsIDksIDQsIDYsIDUsIDQsIDcsIDIsIDksIDEsIDEyLCAwLCAxNSwgMCwgMTgsIDEsIDIwLCAyLCAyMSwgMywgLTEsIC0xLCAxOSwgMTYsIDE4LCA4LCAxOCwgNiwgMTksIDVdXSxcbiAgICBcIkFcIjogWzE4LCBbOSwgMjEsIDEsIDAsIC0xLCAtMSwgOSwgMjEsIDE3LCAwLCAtMSwgLTEsIDQsIDcsIDE0LCA3XV0sXG4gICAgXCJCXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMywgMjEsIDE2LCAyMCwgMTcsIDE5LCAxOCwgMTcsIDE4LCAxNSwgMTcsIDEzLCAxNiwgMTIsIDEzLCAxMSwgLTEsIC0xLCA0LCAxMSwgMTMsIDExLCAxNiwgMTAsIDE3LCA5LCAxOCwgNywgMTgsIDQsIDE3LCAyLCAxNiwgMSwgMTMsIDAsIDQsIDBdXSxcbiAgICBcIkNcIjogWzIxLCBbMTgsIDE2LCAxNywgMTgsIDE1LCAyMCwgMTMsIDIxLCA5LCAyMSwgNywgMjAsIDUsIDE4LCA0LCAxNiwgMywgMTMsIDMsIDgsIDQsIDUsIDUsIDMsIDcsIDEsIDksIDAsIDEzLCAwLCAxNSwgMSwgMTcsIDMsIDE4LCA1XV0sXG4gICAgXCJEXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMSwgMjEsIDE0LCAyMCwgMTYsIDE4LCAxNywgMTYsIDE4LCAxMywgMTgsIDgsIDE3LCA1LCAxNiwgMywgMTQsIDEsIDExLCAwLCA0LCAwXV0sXG4gICAgXCJFXCI6IFsxOSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxNywgMjEsIC0xLCAtMSwgNCwgMTEsIDEyLCAxMSwgLTEsIC0xLCA0LCAwLCAxNywgMF1dLFxuICAgIFwiRlwiOiBbMTgsIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCA0LCAyMSwgMTcsIDIxLCAtMSwgLTEsIDQsIDExLCAxMiwgMTFdXSxcbiAgICBcIkdcIjogWzIxLCBbMTgsIDE2LCAxNywgMTgsIDE1LCAyMCwgMTMsIDIxLCA5LCAyMSwgNywgMjAsIDUsIDE4LCA0LCAxNiwgMywgMTMsIDMsIDgsIDQsIDUsIDUsIDMsIDcsIDEsIDksIDAsIDEzLCAwLCAxNSwgMSwgMTcsIDMsIDE4LCA1LCAxOCwgOCwgLTEsIC0xLCAxMywgOCwgMTgsIDhdXSxcbiAgICBcIkhcIjogWzIyLCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgMTgsIDIxLCAxOCwgMCwgLTEsIC0xLCA0LCAxMSwgMTgsIDExXV0sXG4gICAgXCJJXCI6IFs4LCBbNCwgMjEsIDQsIDBdXSxcbiAgICBcIkpcIjogWzE2LCBbMTIsIDIxLCAxMiwgNSwgMTEsIDIsIDEwLCAxLCA4LCAwLCA2LCAwLCA0LCAxLCAzLCAyLCAyLCA1LCAyLCA3XV0sXG4gICAgXCJLXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDE4LCAyMSwgNCwgNywgLTEsIC0xLCA5LCAxMiwgMTgsIDBdXSxcbiAgICBcIkxcIjogWzE3LCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgNCwgMCwgMTYsIDBdXSxcbiAgICBcIk1cIjogWzI0LCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgNCwgMjEsIDEyLCAwLCAtMSwgLTEsIDIwLCAyMSwgMTIsIDAsIC0xLCAtMSwgMjAsIDIxLCAyMCwgMF1dLFxuICAgIFwiTlwiOiBbMjIsIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCA0LCAyMSwgMTgsIDAsIC0xLCAtMSwgMTgsIDIxLCAxOCwgMF1dLFxuICAgIFwiT1wiOiBbMjIsIFs5LCAyMSwgNywgMjAsIDUsIDE4LCA0LCAxNiwgMywgMTMsIDMsIDgsIDQsIDUsIDUsIDMsIDcsIDEsIDksIDAsIDEzLCAwLCAxNSwgMSwgMTcsIDMsIDE4LCA1LCAxOSwgOCwgMTksIDEzLCAxOCwgMTYsIDE3LCAxOCwgMTUsIDIwLCAxMywgMjEsIDksIDIxXV0sXG4gICAgXCJQXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMywgMjEsIDE2LCAyMCwgMTcsIDE5LCAxOCwgMTcsIDE4LCAxNCwgMTcsIDEyLCAxNiwgMTEsIDEzLCAxMCwgNCwgMTBdXSxcbiAgICBcIlFcIjogWzIyLCBbOSwgMjEsIDcsIDIwLCA1LCAxOCwgNCwgMTYsIDMsIDEzLCAzLCA4LCA0LCA1LCA1LCAzLCA3LCAxLCA5LCAwLCAxMywgMCwgMTUsIDEsIDE3LCAzLCAxOCwgNSwgMTksIDgsIDE5LCAxMywgMTgsIDE2LCAxNywgMTgsIDE1LCAyMCwgMTMsIDIxLCA5LCAyMSwgLTEsIC0xLCAxMiwgNCwgMTgsIC0yXV0sXG4gICAgXCJSXCI6IFsyMSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMywgMjEsIDE2LCAyMCwgMTcsIDE5LCAxOCwgMTcsIDE4LCAxNSwgMTcsIDEzLCAxNiwgMTIsIDEzLCAxMSwgNCwgMTEsIC0xLCAtMSwgMTEsIDExLCAxOCwgMF1dLFxuICAgIFwiU1wiOiBbMjAsIFsxNywgMTgsIDE1LCAyMCwgMTIsIDIxLCA4LCAyMSwgNSwgMjAsIDMsIDE4LCAzLCAxNiwgNCwgMTQsIDUsIDEzLCA3LCAxMiwgMTMsIDEwLCAxNSwgOSwgMTYsIDgsIDE3LCA2LCAxNywgMywgMTUsIDEsIDEyLCAwLCA4LCAwLCA1LCAxLCAzLCAzXV0sXG4gICAgXCJUXCI6IFsxNiwgWzgsIDIxLCA4LCAwLCAtMSwgLTEsIDEsIDIxLCAxNSwgMjFdXSxcbiAgICBcIlVcIjogWzIyLCBbNCwgMjEsIDQsIDYsIDUsIDMsIDcsIDEsIDEwLCAwLCAxMiwgMCwgMTUsIDEsIDE3LCAzLCAxOCwgNiwgMTgsIDIxXV0sXG4gICAgXCJWXCI6IFsxOCwgWzEsIDIxLCA5LCAwLCAtMSwgLTEsIDE3LCAyMSwgOSwgMF1dLFxuICAgIFwiV1wiOiBbMjQsIFsyLCAyMSwgNywgMCwgLTEsIC0xLCAxMiwgMjEsIDcsIDAsIC0xLCAtMSwgMTIsIDIxLCAxNywgMCwgLTEsIC0xLCAyMiwgMjEsIDE3LCAwXV0sXG4gICAgXCJYXCI6IFsyMCwgWzMsIDIxLCAxNywgMCwgLTEsIC0xLCAxNywgMjEsIDMsIDBdXSxcbiAgICBcIllcIjogWzE4LCBbMSwgMjEsIDksIDExLCA5LCAwLCAtMSwgLTEsIDE3LCAyMSwgOSwgMTFdXSxcbiAgICBcIlpcIjogWzIwLCBbMTcsIDIxLCAzLCAwLCAtMSwgLTEsIDMsIDIxLCAxNywgMjEsIC0xLCAtMSwgMywgMCwgMTcsIDBdXSxcbiAgICBcIltcIjogWzE0LCBbNCwgMjUsIDQsIC03LCAtMSwgLTEsIDUsIDI1LCA1LCAtNywgLTEsIC0xLCA0LCAyNSwgMTEsIDI1LCAtMSwgLTEsIDQsIC03LCAxMSwgLTddXSxcbiAgICBcIlxcXFxcIjogWzE0LCBbMCwgMjEsIDE0LCAtM11dLFxuICAgIFwiXVwiOiBbMTQsIFs5LCAyNSwgOSwgLTcsIC0xLCAtMSwgMTAsIDI1LCAxMCwgLTcsIC0xLCAtMSwgMywgMjUsIDEwLCAyNSwgLTEsIC0xLCAzLCAtNywgMTAsIC03XV0sXG4gICAgXCJeXCI6IFsxNiwgWzYsIDE1LCA4LCAxOCwgMTAsIDE1LCAtMSwgLTEsIDMsIDEyLCA4LCAxNywgMTMsIDEyLCAtMSwgLTEsIDgsIDE3LCA4LCAwXV0sXG4gICAgXCJfXCI6IFsxNiwgWzAsIC0yLCAxNiwgLTJdXSxcbiAgICBcImBcIjogWzEwLCBbNiwgMjEsIDUsIDIwLCA0LCAxOCwgNCwgMTYsIDUsIDE1LCA2LCAxNiwgNSwgMTddXSxcbiAgICBcImFcIjogWzE5LCBbMTUsIDE0LCAxNSwgMCwgLTEsIC0xLCAxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJiXCI6IFsxOSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDExLCA2LCAxMywgOCwgMTQsIDExLCAxNCwgMTMsIDEzLCAxNSwgMTEsIDE2LCA4LCAxNiwgNiwgMTUsIDMsIDEzLCAxLCAxMSwgMCwgOCwgMCwgNiwgMSwgNCwgM11dLFxuICAgIFwiY1wiOiBbMTgsIFsxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJkXCI6IFsxOSwgWzE1LCAyMSwgMTUsIDAsIC0xLCAtMSwgMTUsIDExLCAxMywgMTMsIDExLCAxNCwgOCwgMTQsIDYsIDEzLCA0LCAxMSwgMywgOCwgMywgNiwgNCwgMywgNiwgMSwgOCwgMCwgMTEsIDAsIDEzLCAxLCAxNSwgM11dLFxuICAgIFwiZVwiOiBbMTgsIFszLCA4LCAxNSwgOCwgMTUsIDEwLCAxNCwgMTIsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJmXCI6IFsxMiwgWzEwLCAyMSwgOCwgMjEsIDYsIDIwLCA1LCAxNywgNSwgMCwgLTEsIC0xLCAyLCAxNCwgOSwgMTRdXSxcbiAgICBcImdcIjogWzE5LCBbMTUsIDE0LCAxNSwgLTIsIDE0LCAtNSwgMTMsIC02LCAxMSwgLTcsIDgsIC03LCA2LCAtNiwgLTEsIC0xLCAxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJoXCI6IFsxOSwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDEwLCA3LCAxMywgOSwgMTQsIDEyLCAxNCwgMTQsIDEzLCAxNSwgMTAsIDE1LCAwXV0sXG4gICAgXCJpXCI6IFs4LCBbMywgMjEsIDQsIDIwLCA1LCAyMSwgNCwgMjIsIDMsIDIxLCAtMSwgLTEsIDQsIDE0LCA0LCAwXV0sXG4gICAgXCJqXCI6IFsxMCwgWzUsIDIxLCA2LCAyMCwgNywgMjEsIDYsIDIyLCA1LCAyMSwgLTEsIC0xLCA2LCAxNCwgNiwgLTMsIDUsIC02LCAzLCAtNywgMSwgLTddXSxcbiAgICBcImtcIjogWzE3LCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgMTQsIDE0LCA0LCA0LCAtMSwgLTEsIDgsIDgsIDE1LCAwXV0sXG4gICAgXCJsXCI6IFs4LCBbNCwgMjEsIDQsIDBdXSxcbiAgICBcIm1cIjogWzMwLCBbNCwgMTQsIDQsIDAsIC0xLCAtMSwgNCwgMTAsIDcsIDEzLCA5LCAxNCwgMTIsIDE0LCAxNCwgMTMsIDE1LCAxMCwgMTUsIDAsIC0xLCAtMSwgMTUsIDEwLCAxOCwgMTMsIDIwLCAxNCwgMjMsIDE0LCAyNSwgMTMsIDI2LCAxMCwgMjYsIDBdXSxcbiAgICBcIm5cIjogWzE5LCBbNCwgMTQsIDQsIDAsIC0xLCAtMSwgNCwgMTAsIDcsIDEzLCA5LCAxNCwgMTIsIDE0LCAxNCwgMTMsIDE1LCAxMCwgMTUsIDBdXSxcbiAgICBcIm9cIjogWzE5LCBbOCwgMTQsIDYsIDEzLCA0LCAxMSwgMywgOCwgMywgNiwgNCwgMywgNiwgMSwgOCwgMCwgMTEsIDAsIDEzLCAxLCAxNSwgMywgMTYsIDYsIDE2LCA4LCAxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNF1dLFxuICAgIFwicFwiOiBbMTksIFs0LCAxNCwgNCwgLTcsIC0xLCAtMSwgNCwgMTEsIDYsIDEzLCA4LCAxNCwgMTEsIDE0LCAxMywgMTMsIDE1LCAxMSwgMTYsIDgsIDE2LCA2LCAxNSwgMywgMTMsIDEsIDExLCAwLCA4LCAwLCA2LCAxLCA0LCAzXV0sXG4gICAgXCJxXCI6IFsxOSwgWzE1LCAxNCwgMTUsIC03LCAtMSwgLTEsIDE1LCAxMSwgMTMsIDEzLCAxMSwgMTQsIDgsIDE0LCA2LCAxMywgNCwgMTEsIDMsIDgsIDMsIDYsIDQsIDMsIDYsIDEsIDgsIDAsIDExLCAwLCAxMywgMSwgMTUsIDNdXSxcbiAgICBcInJcIjogWzEzLCBbNCwgMTQsIDQsIDAsIC0xLCAtMSwgNCwgOCwgNSwgMTEsIDcsIDEzLCA5LCAxNCwgMTIsIDE0XV0sXG4gICAgXCJzXCI6IFsxNywgWzE0LCAxMSwgMTMsIDEzLCAxMCwgMTQsIDcsIDE0LCA0LCAxMywgMywgMTEsIDQsIDksIDYsIDgsIDExLCA3LCAxMywgNiwgMTQsIDQsIDE0LCAzLCAxMywgMSwgMTAsIDAsIDcsIDAsIDQsIDEsIDMsIDNdXSxcbiAgICBcInRcIjogWzEyLCBbNSwgMjEsIDUsIDQsIDYsIDEsIDgsIDAsIDEwLCAwLCAtMSwgLTEsIDIsIDE0LCA5LCAxNF1dLFxuICAgIFwidVwiOiBbMTksIFs0LCAxNCwgNCwgNCwgNSwgMSwgNywgMCwgMTAsIDAsIDEyLCAxLCAxNSwgNCwgLTEsIC0xLCAxNSwgMTQsIDE1LCAwXV0sXG4gICAgXCJ2XCI6IFsxNiwgWzIsIDE0LCA4LCAwLCAtMSwgLTEsIDE0LCAxNCwgOCwgMF1dLFxuICAgIFwid1wiOiBbMjIsIFszLCAxNCwgNywgMCwgLTEsIC0xLCAxMSwgMTQsIDcsIDAsIC0xLCAtMSwgMTEsIDE0LCAxNSwgMCwgLTEsIC0xLCAxOSwgMTQsIDE1LCAwXV0sXG4gICAgXCJ4XCI6IFsxNywgWzMsIDE0LCAxNCwgMCwgLTEsIC0xLCAxNCwgMTQsIDMsIDBdXSxcbiAgICBcInlcIjogWzE2LCBbMiwgMTQsIDgsIDAsIC0xLCAtMSwgMTQsIDE0LCA4LCAwLCA2LCAtNCwgNCwgLTYsIDIsIC03LCAxLCAtN11dLFxuICAgIFwielwiOiBbMTcsIFsxNCwgMTQsIDMsIDAsIC0xLCAtMSwgMywgMTQsIDE0LCAxNCwgLTEsIC0xLCAzLCAwLCAxNCwgMF1dLFxuICAgIFwie1wiOiBbMTQsIFs5LCAyNSwgNywgMjQsIDYsIDIzLCA1LCAyMSwgNSwgMTksIDYsIDE3LCA3LCAxNiwgOCwgMTQsIDgsIDEyLCA2LCAxMCwgLTEsIC0xLCA3LCAyNCwgNiwgMjIsIDYsIDIwLCA3LCAxOCwgOCwgMTcsIDksIDE1LCA5LCAxMywgOCwgMTEsIDQsIDksIDgsIDcsIDksIDUsIDksIDMsIDgsIDEsIDcsIDAsIDYsIC0yLCA2LCAtNCwgNywgLTYsIC0xLCAtMSwgNiwgOCwgOCwgNiwgOCwgNCwgNywgMiwgNiwgMSwgNSwgLTEsIDUsIC0zLCA2LCAtNSwgNywgLTYsIDksIC03XV0sXG4gICAgXCJ8XCI6IFs4LCBbNCwgMjUsIDQsIC03XV0sXG4gICAgXCJ9XCI6IFsxNCwgWzUsIDI1LCA3LCAyNCwgOCwgMjMsIDksIDIxLCA5LCAxOSwgOCwgMTcsIDcsIDE2LCA2LCAxNCwgNiwgMTIsIDgsIDEwLCAtMSwgLTEsIDcsIDI0LCA4LCAyMiwgOCwgMjAsIDcsIDE4LCA2LCAxNywgNSwgMTUsIDUsIDEzLCA2LCAxMSwgMTAsIDksIDYsIDcsIDUsIDUsIDUsIDMsIDYsIDEsIDcsIDAsIDgsIC0yLCA4LCAtNCwgNywgLTYsIC0xLCAtMSwgOCwgOCwgNiwgNiwgNiwgNCwgNywgMiwgOCwgMSwgOSwgLTEsIDksIC0zLCA4LCAtNSwgNywgLTYsIDUsIC03XV0sXG4gICAgXCJ+XCI6IFsyNCwgWzMsIDYsIDMsIDgsIDQsIDExLCA2LCAxMiwgOCwgMTIsIDEwLCAxMSwgMTQsIDgsIDE2LCA3LCAxOCwgNywgMjAsIDgsIDIxLCAxMCwgLTEsIC0xLCAzLCA4LCA0LCAxMCwgNiwgMTEsIDgsIDExLCAxMCwgMTAsIDE0LCA3LCAxNiwgNiwgMTgsIDYsIDIwLCA3LCAyMSwgMTAsIDIxLCAxMl1dXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVUZXh0VmVydGljaWVzKHRleHQsIGxlZnQsIGJhc2VsaW5lLCBzY2FsZSkge1xuICAgIHNjYWxlID0gc2NhbGUgfHwgMTtcblxuICAgIGNvbnN0IHN0cm9rZXMgPSBbXTtcbiAgICBsZXQgaSwgbGVuLCBqLCBsZW4yLCBnbHlwaCwgeCwgeSwgcHJldjtcblxuICAgIGZvciAoaSA9IDAsIGxlbiA9IHRleHQubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgZ2x5cGggPSBzaW1wbGV4Rm9udFt0ZXh0W2ldXTtcbiAgICAgICAgaWYgKCFnbHlwaCkgY29udGludWU7XG4gICAgICAgIHByZXYgPSBudWxsO1xuXG4gICAgICAgIGZvciAoaiA9IDAsIGxlbjIgPSBnbHlwaFsxXS5sZW5ndGg7IGogPCBsZW4yOyBqICs9IDIpIHtcbiAgICAgICAgICAgIGlmIChnbHlwaFsxXVtqXSA9PT0gLTEgJiYgZ2x5cGhbMV1baiArIDFdID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHByZXYgPSBudWxsO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHggPSBsZWZ0ICsgZ2x5cGhbMV1bal0gKiBzY2FsZTtcbiAgICAgICAgICAgICAgICB5ID0gYmFzZWxpbmUgLSBnbHlwaFsxXVtqICsgMV0gKiBzY2FsZTtcbiAgICAgICAgICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgICAgICAgICAgICBzdHJva2VzLnB1c2gocHJldi54LCBwcmV2LnksIHgsIHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcmV2ID0ge3g6IHgsIHk6IHl9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxlZnQgKz0gZ2x5cGhbMF0gKiBzY2FsZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3Ryb2tlcztcbn1cbiIsIi8vICAgICAgXG5cbmNvbnN0IHBhdHRlcm4gPSByZXF1aXJlKCcuL3BhdHRlcm4nKTtcbmNvbnN0IENvbG9yID0gcmVxdWlyZSgnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yJyk7XG5jb25zdCBEZXB0aE1vZGUgPSByZXF1aXJlKCcuLi9nbC9kZXB0aF9tb2RlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5tb2R1bGUuZXhwb3J0cyA9IGRyYXdGaWxsO1xuXG5mdW5jdGlvbiBkcmF3RmlsbChwYWludGVyICAgICAgICAgLCBzb3VyY2VDYWNoZSAgICAgICAgICAgICAsIGxheWVyICAgICAgICAgICAgICAgICwgY29vcmRzICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgIGNvbnN0IGNvbG9yID0gbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLWNvbG9yJyk7XG4gICAgY29uc3Qgb3BhY2l0eSA9IGxheWVyLnBhaW50LmdldCgnZmlsbC1vcGFjaXR5Jyk7XG5cbiAgICBpZiAob3BhY2l0eS5jb25zdGFudE9yKDEpID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnRleHQuc2V0Q29sb3JNb2RlKHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKTtcblxuICAgIGNvbnN0IHBhc3MgPSAoIWxheWVyLnBhaW50LmdldCgnZmlsbC1wYXR0ZXJuJykgJiZcbiAgICAgICAgY29sb3IuY29uc3RhbnRPcihDb2xvci50cmFuc3BhcmVudCkuYSA9PT0gMSAmJlxuICAgICAgICBvcGFjaXR5LmNvbnN0YW50T3IoMCkgPT09IDEpID8gJ29wYXF1ZScgOiAndHJhbnNsdWNlbnQnO1xuXG4gICAgLy8gRHJhdyBmaWxsXG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gcGFzcykge1xuICAgICAgICAvLyBPbmNlIHdlIHN3aXRjaCB0byBlYXJjdXQgZHJhd2luZyB3ZSBjYW4gcHVsbCBtb3N0IG9mIHRoZSBXZWJHTCBzZXR1cFxuICAgICAgICAvLyBvdXRzaWRlIG9mIHRoaXMgY29vcmRzIGxvb3AuXG4gICAgICAgIGNvbnRleHQuc2V0RGVwdGhNb2RlKHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMSwgcGFpbnRlci5yZW5kZXJQYXNzID09PSAnb3BhcXVlJyA/IERlcHRoTW9kZS5SZWFkV3JpdGUgOiBEZXB0aE1vZGUuUmVhZE9ubHkpKTtcbiAgICAgICAgZHJhd0ZpbGxUaWxlcyhwYWludGVyLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3JkcywgZHJhd0ZpbGxUaWxlKTtcbiAgICB9XG5cbiAgICAvLyBEcmF3IHN0cm9rZVxuICAgIGlmIChwYWludGVyLnJlbmRlclBhc3MgPT09ICd0cmFuc2x1Y2VudCcgJiYgbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLWFudGlhbGlhcycpKSB7XG4gICAgICAgIGNvbnRleHQubGluZVdpZHRoLnNldCgyKTtcblxuICAgICAgICAvLyBJZiB3ZSBkZWZpbmVkIGEgZGlmZmVyZW50IGNvbG9yIGZvciB0aGUgZmlsbCBvdXRsaW5lLCB3ZSBhcmVcbiAgICAgICAgLy8gZ29pbmcgdG8gaWdub3JlIHRoZSBiaXRzIGluIDB4MDcgYW5kIGp1c3QgY2FyZSBhYm91dCB0aGUgZ2xvYmFsXG4gICAgICAgIC8vIGNsaXBwaW5nIG1hc2suXG4gICAgICAgIC8vIE90aGVyd2lzZSwgd2Ugb25seSB3YW50IHRvIGRyYXdGaWxsIHRoZSBhbnRpYWxpYXNlZCBwYXJ0cyB0aGF0IGFyZVxuICAgICAgICAvLyAqb3V0c2lkZSogdGhlIGN1cnJlbnQgc2hhcGUuIFRoaXMgaXMgaW1wb3J0YW50IGluIGNhc2UgdGhlIGZpbGxcbiAgICAgICAgLy8gb3Igc3Ryb2tlIGNvbG9yIGlzIHRyYW5zbHVjZW50LiBJZiB3ZSB3b3VsZG4ndCBjbGlwIHRvIG91dHNpZGVcbiAgICAgICAgLy8gdGhlIGN1cnJlbnQgc2hhcGUsIHNvbWUgcGl4ZWxzIGZyb20gdGhlIG91dGxpbmUgc3Ryb2tlIG92ZXJsYXBwZWRcbiAgICAgICAgLy8gdGhlIChub24tYW50aWFsaWFzZWQpIGZpbGwuXG4gICAgICAgIGNvbnRleHQuc2V0RGVwdGhNb2RlKHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoXG4gICAgICAgICAgICBsYXllci5nZXRQYWludFByb3BlcnR5KCdmaWxsLW91dGxpbmUtY29sb3InKSA/IDIgOiAwLCBEZXB0aE1vZGUuUmVhZE9ubHkpKTtcbiAgICAgICAgZHJhd0ZpbGxUaWxlcyhwYWludGVyLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3JkcywgZHJhd1N0cm9rZVRpbGUpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhd0ZpbGxUaWxlcyhwYWludGVyLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3JkcywgZHJhd0ZuKSB7XG4gICAgaWYgKHBhdHRlcm4uaXNQYXR0ZXJuTWlzc2luZyhsYXllci5wYWludC5nZXQoJ2ZpbGwtcGF0dGVybicpLCBwYWludGVyKSkgcmV0dXJuO1xuXG4gICAgbGV0IGZpcnN0VGlsZSA9IHRydWU7XG4gICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpO1xuICAgICAgICBjb25zdCBidWNrZXQgICAgICAgICAgICAgID0gKHRpbGUuZ2V0QnVja2V0KGxheWVyKSAgICAgKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIGNvbnRpbnVlO1xuXG4gICAgICAgIHBhaW50ZXIuY29udGV4dC5zZXRTdGVuY2lsTW9kZShwYWludGVyLnN0ZW5jaWxNb2RlRm9yQ2xpcHBpbmcoY29vcmQpKTtcbiAgICAgICAgZHJhd0ZuKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgdGlsZSwgY29vcmQsIGJ1Y2tldCwgZmlyc3RUaWxlKTtcbiAgICAgICAgZmlyc3RUaWxlID0gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmF3RmlsbFRpbGUocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCB0aWxlLCBjb29yZCwgYnVja2V0LCBmaXJzdFRpbGUpIHtcbiAgICBjb25zdCBnbCA9IHBhaW50ZXIuY29udGV4dC5nbDtcbiAgICBjb25zdCBwcm9ncmFtQ29uZmlndXJhdGlvbiA9IGJ1Y2tldC5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGxheWVyLmlkKTtcblxuICAgIGNvbnN0IHByb2dyYW0gPSBzZXRGaWxsUHJvZ3JhbSgnZmlsbCcsIGxheWVyLnBhaW50LmdldCgnZmlsbC1wYXR0ZXJuJyksIHBhaW50ZXIsIHByb2dyYW1Db25maWd1cmF0aW9uLCBsYXllciwgdGlsZSwgY29vcmQsIGZpcnN0VGlsZSk7XG5cbiAgICBwcm9ncmFtLmRyYXcoXG4gICAgICAgIHBhaW50ZXIuY29udGV4dCxcbiAgICAgICAgZ2wuVFJJQU5HTEVTLFxuICAgICAgICBsYXllci5pZCxcbiAgICAgICAgYnVja2V0LmxheW91dFZlcnRleEJ1ZmZlcixcbiAgICAgICAgYnVja2V0LmluZGV4QnVmZmVyLFxuICAgICAgICBidWNrZXQuc2VnbWVudHMsXG4gICAgICAgIHByb2dyYW1Db25maWd1cmF0aW9uKTtcbn1cblxuZnVuY3Rpb24gZHJhd1N0cm9rZVRpbGUocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCB0aWxlLCBjb29yZCwgYnVja2V0LCBmaXJzdFRpbGUpIHtcbiAgICBjb25zdCBnbCA9IHBhaW50ZXIuY29udGV4dC5nbDtcbiAgICBjb25zdCBwcm9ncmFtQ29uZmlndXJhdGlvbiA9IGJ1Y2tldC5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGxheWVyLmlkKTtcbiAgICBjb25zdCBwYXR0ZXJuID0gbGF5ZXIuZ2V0UGFpbnRQcm9wZXJ0eSgnZmlsbC1vdXRsaW5lLWNvbG9yJykgPyBudWxsIDogbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLXBhdHRlcm4nKTtcblxuICAgIGNvbnN0IHByb2dyYW0gPSBzZXRGaWxsUHJvZ3JhbSgnZmlsbE91dGxpbmUnLCBwYXR0ZXJuLCBwYWludGVyLCBwcm9ncmFtQ29uZmlndXJhdGlvbiwgbGF5ZXIsIHRpbGUsIGNvb3JkLCBmaXJzdFRpbGUpO1xuICAgIGdsLnVuaWZvcm0yZihwcm9ncmFtLnVuaWZvcm1zLnVfd29ybGQsIGdsLmRyYXdpbmdCdWZmZXJXaWR0aCwgZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCk7XG5cbiAgICBwcm9ncmFtLmRyYXcoXG4gICAgICAgIHBhaW50ZXIuY29udGV4dCxcbiAgICAgICAgZ2wuTElORVMsXG4gICAgICAgIGxheWVyLmlkLFxuICAgICAgICBidWNrZXQubGF5b3V0VmVydGV4QnVmZmVyLFxuICAgICAgICBidWNrZXQuaW5kZXhCdWZmZXIyLFxuICAgICAgICBidWNrZXQuc2VnbWVudHMyLFxuICAgICAgICBwcm9ncmFtQ29uZmlndXJhdGlvbik7XG59XG5cbmZ1bmN0aW9uIHNldEZpbGxQcm9ncmFtKHByb2dyYW1JZCwgcGF0ICAgICAgICAgICAgICAgICAgICAgLCBwYWludGVyLCBwcm9ncmFtQ29uZmlndXJhdGlvbiwgbGF5ZXIsIHRpbGUsIGNvb3JkLCBmaXJzdFRpbGUpIHtcbiAgICBsZXQgcHJvZ3JhbTtcbiAgICBjb25zdCBwcmV2UHJvZ3JhbSA9IHBhaW50ZXIuY29udGV4dC5wcm9ncmFtLmdldCgpO1xuICAgIGlmICghcGF0KSB7XG4gICAgICAgIHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0ocHJvZ3JhbUlkLCBwcm9ncmFtQ29uZmlndXJhdGlvbik7XG4gICAgICAgIGlmIChmaXJzdFRpbGUgfHwgcHJvZ3JhbS5wcm9ncmFtICE9PSBwcmV2UHJvZ3JhbSkge1xuICAgICAgICAgICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb24uc2V0VW5pZm9ybXMocGFpbnRlci5jb250ZXh0LCBwcm9ncmFtLCBsYXllci5wYWludCwge3pvb206IHBhaW50ZXIudHJhbnNmb3JtLnpvb219KTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0oYCR7cHJvZ3JhbUlkfVBhdHRlcm5gLCBwcm9ncmFtQ29uZmlndXJhdGlvbik7XG4gICAgICAgIGlmIChmaXJzdFRpbGUgfHwgcHJvZ3JhbS5wcm9ncmFtICE9PSBwcmV2UHJvZ3JhbSkge1xuICAgICAgICAgICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb24uc2V0VW5pZm9ybXMocGFpbnRlci5jb250ZXh0LCBwcm9ncmFtLCBsYXllci5wYWludCwge3pvb206IHBhaW50ZXIudHJhbnNmb3JtLnpvb219KTtcbiAgICAgICAgICAgIHBhdHRlcm4ucHJlcGFyZShwYXQsIHBhaW50ZXIsIHByb2dyYW0pO1xuICAgICAgICB9XG4gICAgICAgIHBhdHRlcm4uc2V0VGlsZSh0aWxlLCBwYWludGVyLCBwcm9ncmFtKTtcbiAgICB9XG4gICAgcGFpbnRlci5jb250ZXh0LmdsLnVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS51bmlmb3Jtcy51X21hdHJpeCwgZmFsc2UsIHBhaW50ZXIudHJhbnNsYXRlUG9zTWF0cml4KFxuICAgICAgICBjb29yZC5wb3NNYXRyaXgsIHRpbGUsXG4gICAgICAgIGxheWVyLnBhaW50LmdldCgnZmlsbC10cmFuc2xhdGUnKSxcbiAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLXRyYW5zbGF0ZS1hbmNob3InKVxuICAgICkpO1xuICAgIHJldHVybiBwcm9ncmFtO1xufVxuIiwiLy8gICAgICBcblxuY29uc3QgZ2xNYXRyaXggPSByZXF1aXJlKCdAbWFwYm94L2dsLW1hdHJpeCcpO1xuY29uc3QgcGF0dGVybiA9IHJlcXVpcmUoJy4vcGF0dGVybicpO1xuY29uc3QgVGV4dHVyZSA9IHJlcXVpcmUoJy4vdGV4dHVyZScpO1xuY29uc3QgQ29sb3IgPSByZXF1aXJlKCcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InKTtcbmNvbnN0IERlcHRoTW9kZSA9IHJlcXVpcmUoJy4uL2dsL2RlcHRoX21vZGUnKTtcbmNvbnN0IG1hdDMgPSBnbE1hdHJpeC5tYXQzO1xuY29uc3QgbWF0NCA9IGdsTWF0cml4Lm1hdDQ7XG5jb25zdCB2ZWMzID0gZ2xNYXRyaXgudmVjMztcbmNvbnN0IFN0ZW5jaWxNb2RlID0gcmVxdWlyZSgnLi4vZ2wvc3RlbmNpbF9tb2RlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxubW9kdWxlLmV4cG9ydHMgPSBkcmF3O1xuXG5mdW5jdGlvbiBkcmF3KHBhaW50ZXIgICAgICAgICAsIHNvdXJjZSAgICAgICAgICAgICAsIGxheWVyICAgICAgICAgICAgICAgICAgICAgICAgICwgY29vcmRzICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgIGlmIChsYXllci5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLW9wYWNpdHknKSA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ29mZnNjcmVlbicpIHtcbiAgICAgICAgZHJhd1RvRXh0cnVzaW9uRnJhbWVidWZmZXIocGFpbnRlciwgbGF5ZXIpO1xuXG4gICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gc291cmNlLmdldFRpbGUoY29vcmQpO1xuICAgICAgICAgICAgY29uc3QgYnVja2V0ICAgICAgICAgICAgICAgICAgICAgICA9ICh0aWxlLmdldEJ1Y2tldChsYXllcikgICAgICk7XG4gICAgICAgICAgICBpZiAoIWJ1Y2tldCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGRyYXdFeHRydXNpb24ocGFpbnRlciwgc291cmNlLCBsYXllciwgdGlsZSwgY29vcmQsIGJ1Y2tldCwgZmlyc3QpO1xuICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAocGFpbnRlci5yZW5kZXJQYXNzID09PSAndHJhbnNsdWNlbnQnKSB7XG4gICAgICAgIGRyYXdFeHRydXNpb25UZXh0dXJlKHBhaW50ZXIsIGxheWVyKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYXdUb0V4dHJ1c2lvbkZyYW1lYnVmZmVyKHBhaW50ZXIsIGxheWVyKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICBsZXQgcmVuZGVyVGFyZ2V0ID0gbGF5ZXIudmlld3BvcnRGcmFtZTtcblxuICAgIGlmIChwYWludGVyLmRlcHRoUmJvTmVlZHNDbGVhcikge1xuICAgICAgICBwYWludGVyLnNldHVwT2Zmc2NyZWVuRGVwdGhSZW5kZXJidWZmZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlbmRlclRhcmdldCkge1xuICAgICAgICBjb25zdCB0ZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwge3dpZHRoOiBwYWludGVyLndpZHRoLCBoZWlnaHQ6IHBhaW50ZXIuaGVpZ2h0LCBkYXRhOiBudWxsfSwgZ2wuUkdCQSk7XG4gICAgICAgIHRleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuXG4gICAgICAgIHJlbmRlclRhcmdldCA9IGxheWVyLnZpZXdwb3J0RnJhbWUgPSBjb250ZXh0LmNyZWF0ZUZyYW1lYnVmZmVyKHBhaW50ZXIud2lkdGgsIHBhaW50ZXIuaGVpZ2h0KTtcbiAgICAgICAgcmVuZGVyVGFyZ2V0LmNvbG9yQXR0YWNobWVudC5zZXQodGV4dHVyZS50ZXh0dXJlKTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQocmVuZGVyVGFyZ2V0LmZyYW1lYnVmZmVyKTtcbiAgICByZW5kZXJUYXJnZXQuZGVwdGhBdHRhY2htZW50LnNldChwYWludGVyLmRlcHRoUmJvKTtcblxuICAgIGlmIChwYWludGVyLmRlcHRoUmJvTmVlZHNDbGVhcikge1xuICAgICAgICBjb250ZXh0LmNsZWFyKHsgZGVwdGg6IDEgfSk7XG4gICAgICAgIHBhaW50ZXIuZGVwdGhSYm9OZWVkc0NsZWFyID0gZmFsc2U7XG4gICAgfVxuXG4gICAgY29udGV4dC5jbGVhcih7IGNvbG9yOiBDb2xvci50cmFuc3BhcmVudCB9KTtcblxuICAgIGNvbnRleHQuc2V0U3RlbmNpbE1vZGUoU3RlbmNpbE1vZGUuZGlzYWJsZWQpO1xuICAgIGNvbnRleHQuc2V0RGVwdGhNb2RlKG5ldyBEZXB0aE1vZGUoZ2wuTEVRVUFMLCBEZXB0aE1vZGUuUmVhZFdyaXRlLCBbMCwgMV0pKTtcbiAgICBjb250ZXh0LnNldENvbG9yTW9kZShwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSk7XG59XG5cbmZ1bmN0aW9uIGRyYXdFeHRydXNpb25UZXh0dXJlKHBhaW50ZXIsIGxheWVyKSB7XG4gICAgY29uc3QgcmVuZGVyZWRUZXh0dXJlID0gbGF5ZXIudmlld3BvcnRGcmFtZTtcbiAgICBpZiAoIXJlbmRlcmVkVGV4dHVyZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgnZXh0cnVzaW9uVGV4dHVyZScpO1xuXG4gICAgY29udGV4dC5zZXRTdGVuY2lsTW9kZShTdGVuY2lsTW9kZS5kaXNhYmxlZCk7XG4gICAgY29udGV4dC5zZXREZXB0aE1vZGUoRGVwdGhNb2RlLmRpc2FibGVkKTtcbiAgICBjb250ZXh0LnNldENvbG9yTW9kZShwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSk7XG5cbiAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCByZW5kZXJlZFRleHR1cmUuY29sb3JBdHRhY2htZW50LmdldCgpKTtcblxuICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVuaWZvcm1zLnVfb3BhY2l0eSwgbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5JykpO1xuICAgIGdsLnVuaWZvcm0xaShwcm9ncmFtLnVuaWZvcm1zLnVfaW1hZ2UsIDApO1xuXG4gICAgY29uc3QgbWF0cml4ID0gbWF0NC5jcmVhdGUoKTtcbiAgICBtYXQ0Lm9ydGhvKG1hdHJpeCwgMCwgcGFpbnRlci53aWR0aCwgcGFpbnRlci5oZWlnaHQsIDAsIDAsIDEpO1xuICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS51bmlmb3Jtcy51X21hdHJpeCwgZmFsc2UsIG1hdHJpeCk7XG5cbiAgICBnbC51bmlmb3JtMmYocHJvZ3JhbS51bmlmb3Jtcy51X3dvcmxkLCBnbC5kcmF3aW5nQnVmZmVyV2lkdGgsIGdsLmRyYXdpbmdCdWZmZXJIZWlnaHQpO1xuXG4gICAgcGFpbnRlci52aWV3cG9ydFZBTy5iaW5kKGNvbnRleHQsIHByb2dyYW0sIHBhaW50ZXIudmlld3BvcnRCdWZmZXIsIFtdKTtcbiAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFX1NUUklQLCAwLCA0KTtcbn1cblxuZnVuY3Rpb24gZHJhd0V4dHJ1c2lvbihwYWludGVyLCBzb3VyY2UsIGxheWVyLCB0aWxlLCBjb29yZCwgYnVja2V0LCBmaXJzdCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgY29uc3QgaW1hZ2UgPSBsYXllci5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLXBhdHRlcm4nKTtcblxuICAgIGNvbnN0IHByZXZQcm9ncmFtID0gcGFpbnRlci5jb250ZXh0LnByb2dyYW0uZ2V0KCk7XG4gICAgY29uc3QgcHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSBidWNrZXQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChsYXllci5pZCk7XG4gICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbShpbWFnZSA/ICdmaWxsRXh0cnVzaW9uUGF0dGVybicgOiAnZmlsbEV4dHJ1c2lvbicsIHByb2dyYW1Db25maWd1cmF0aW9uKTtcbiAgICBpZiAoZmlyc3QgfHwgcHJvZ3JhbS5wcm9ncmFtICE9PSBwcmV2UHJvZ3JhbSkge1xuICAgICAgICBwcm9ncmFtQ29uZmlndXJhdGlvbi5zZXRVbmlmb3Jtcyhjb250ZXh0LCBwcm9ncmFtLCBsYXllci5wYWludCwge3pvb206IHBhaW50ZXIudHJhbnNmb3JtLnpvb219KTtcbiAgICB9XG5cbiAgICBpZiAoaW1hZ2UpIHtcbiAgICAgICAgaWYgKHBhdHRlcm4uaXNQYXR0ZXJuTWlzc2luZyhpbWFnZSwgcGFpbnRlcikpIHJldHVybjtcbiAgICAgICAgcGF0dGVybi5wcmVwYXJlKGltYWdlLCBwYWludGVyLCBwcm9ncmFtKTtcbiAgICAgICAgcGF0dGVybi5zZXRUaWxlKHRpbGUsIHBhaW50ZXIsIHByb2dyYW0pO1xuICAgICAgICBnbC51bmlmb3JtMWYocHJvZ3JhbS51bmlmb3Jtcy51X2hlaWdodF9mYWN0b3IsIC1NYXRoLnBvdygyLCBjb29yZC5vdmVyc2NhbGVkWikgLyB0aWxlLnRpbGVTaXplIC8gOCk7XG4gICAgfVxuXG4gICAgcGFpbnRlci5jb250ZXh0LmdsLnVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS51bmlmb3Jtcy51X21hdHJpeCwgZmFsc2UsIHBhaW50ZXIudHJhbnNsYXRlUG9zTWF0cml4KFxuICAgICAgICBjb29yZC5wb3NNYXRyaXgsXG4gICAgICAgIHRpbGUsXG4gICAgICAgIGxheWVyLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24tdHJhbnNsYXRlJyksXG4gICAgICAgIGxheWVyLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24tdHJhbnNsYXRlLWFuY2hvcicpXG4gICAgKSk7XG5cbiAgICBzZXRMaWdodChwcm9ncmFtLCBwYWludGVyKTtcblxuICAgIHByb2dyYW0uZHJhdyhcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgZ2wuVFJJQU5HTEVTLFxuICAgICAgICBsYXllci5pZCxcbiAgICAgICAgYnVja2V0LmxheW91dFZlcnRleEJ1ZmZlcixcbiAgICAgICAgYnVja2V0LmluZGV4QnVmZmVyLFxuICAgICAgICBidWNrZXQuc2VnbWVudHMsXG4gICAgICAgIHByb2dyYW1Db25maWd1cmF0aW9uKTtcbn1cblxuZnVuY3Rpb24gc2V0TGlnaHQocHJvZ3JhbSwgcGFpbnRlcikge1xuICAgIGNvbnN0IGdsID0gcGFpbnRlci5jb250ZXh0LmdsO1xuICAgIGNvbnN0IGxpZ2h0ID0gcGFpbnRlci5zdHlsZS5saWdodDtcblxuICAgIGNvbnN0IF9scCA9IGxpZ2h0LnByb3BlcnRpZXMuZ2V0KCdwb3NpdGlvbicpO1xuICAgIGNvbnN0IGxpZ2h0UG9zID0gW19scC54LCBfbHAueSwgX2xwLnpdO1xuXG4gICAgY29uc3QgbGlnaHRNYXQgPSBtYXQzLmNyZWF0ZSgpO1xuICAgIGlmIChsaWdodC5wcm9wZXJ0aWVzLmdldCgnYW5jaG9yJykgPT09ICd2aWV3cG9ydCcpIHtcbiAgICAgICAgbWF0My5mcm9tUm90YXRpb24obGlnaHRNYXQsIC1wYWludGVyLnRyYW5zZm9ybS5hbmdsZSk7XG4gICAgfVxuICAgIHZlYzMudHJhbnNmb3JtTWF0MyhsaWdodFBvcywgbGlnaHRQb3MsIGxpZ2h0TWF0KTtcblxuICAgIGNvbnN0IGNvbG9yID0gbGlnaHQucHJvcGVydGllcy5nZXQoJ2NvbG9yJyk7XG5cbiAgICBnbC51bmlmb3JtM2Z2KHByb2dyYW0udW5pZm9ybXMudV9saWdodHBvcywgbGlnaHRQb3MpO1xuICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVuaWZvcm1zLnVfbGlnaHRpbnRlbnNpdHksIGxpZ2h0LnByb3BlcnRpZXMuZ2V0KCdpbnRlbnNpdHknKSk7XG4gICAgZ2wudW5pZm9ybTNmKHByb2dyYW0udW5pZm9ybXMudV9saWdodGNvbG9yLCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iKTtcbn1cbiIsIi8vICAgICAgXG5cbmNvbnN0IG1hdDQgPSByZXF1aXJlKCdAbWFwYm94L2dsLW1hdHJpeCcpLm1hdDQ7XG5jb25zdCBUZXh0dXJlID0gcmVxdWlyZSgnLi90ZXh0dXJlJyk7XG5jb25zdCBwaXhlbHNUb1RpbGVVbml0cyA9IHJlcXVpcmUoJy4uL3NvdXJjZS9waXhlbHNfdG9fdGlsZV91bml0cycpO1xuY29uc3QgQ29sb3IgPSByZXF1aXJlKCcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InKTtcbmNvbnN0IERlcHRoTW9kZSA9IHJlcXVpcmUoJy4uL2dsL2RlcHRoX21vZGUnKTtcbmNvbnN0IFN0ZW5jaWxNb2RlID0gcmVxdWlyZSgnLi4vZ2wvc3RlbmNpbF9tb2RlJyk7XG5jb25zdCBDb2xvck1vZGUgPSByZXF1aXJlKCcuLi9nbC9jb2xvcl9tb2RlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbm1vZHVsZS5leHBvcnRzID0gZHJhd0hlYXRtYXA7XG5cbmZ1bmN0aW9uIGRyYXdIZWF0bWFwKHBhaW50ZXIgICAgICAgICAsIHNvdXJjZUNhY2hlICAgICAgICAgICAgICwgbGF5ZXIgICAgICAgICAgICAgICAgICAgLCBjb29yZHMgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgaWYgKGxheWVyLnBhaW50LmdldCgnaGVhdG1hcC1vcGFjaXR5JykgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwYWludGVyLnJlbmRlclBhc3MgPT09ICdvZmZzY3JlZW4nKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgICAgICBjb250ZXh0LnNldERlcHRoTW9kZShwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKDAsIERlcHRoTW9kZS5SZWFkT25seSkpO1xuXG4gICAgICAgIC8vIEFsbG93IGtlcm5lbHMgdG8gYmUgZHJhd24gYWNyb3NzIGJvdW5kYXJpZXMsIHNvIHRoYXRcbiAgICAgICAgLy8gbGFyZ2Uga2VybmVscyBhcmUgbm90IGNsaXBwZWQgdG8gdGlsZXNcbiAgICAgICAgY29udGV4dC5zZXRTdGVuY2lsTW9kZShTdGVuY2lsTW9kZS5kaXNhYmxlZCk7XG5cbiAgICAgICAgYmluZEZyYW1lYnVmZmVyKGNvbnRleHQsIHBhaW50ZXIsIGxheWVyKTtcblxuICAgICAgICBjb250ZXh0LmNsZWFyKHsgY29sb3I6IENvbG9yLnRyYW5zcGFyZW50IH0pO1xuXG4gICAgICAgIC8vIFR1cm4gb24gYWRkaXRpdmUgYmxlbmRpbmcgZm9yIGtlcm5lbHMsIHdoaWNoIGlzIGEga2V5IGFzcGVjdCBvZiBrZXJuZWwgZGVuc2l0eSBlc3RpbWF0aW9uIGZvcm11bGFcbiAgICAgICAgY29udGV4dC5zZXRDb2xvck1vZGUobmV3IENvbG9yTW9kZShbZ2wuT05FLCBnbC5PTkVdLCBDb2xvci50cmFuc3BhcmVudCwgW3RydWUsIHRydWUsIHRydWUsIHRydWVdKSk7XG5cbiAgICAgICAgbGV0IGZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvb3JkID0gY29vcmRzW2ldO1xuXG4gICAgICAgICAgICAvLyBTa2lwIHRpbGVzIHRoYXQgaGF2ZSB1bmNvdmVyZWQgcGFyZW50cyB0byBhdm9pZCBmbGlja2VyaW5nOyB3ZSBkb24ndCBuZWVkXG4gICAgICAgICAgICAvLyB0byB1c2UgY29tcGxleCB0aWxlIG1hc2tpbmcgaGVyZSBiZWNhdXNlIHRoZSBjaGFuZ2UgYmV0d2VlbiB6b29tIGxldmVscyBpcyBzdWJ0bGUsXG4gICAgICAgICAgICAvLyBzbyBpdCdzIGZpbmUgdG8gc2ltcGx5IHJlbmRlciB0aGUgcGFyZW50IHVudGlsIGFsbCBpdHMgNCBjaGlsZHJlbiBhcmUgbG9hZGVkXG4gICAgICAgICAgICBpZiAoc291cmNlQ2FjaGUuaGFzUmVuZGVyYWJsZVBhcmVudChjb29yZCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgICAgICBjb25zdCBidWNrZXQgICAgICAgICAgICAgICAgID0gKHRpbGUuZ2V0QnVja2V0KGxheWVyKSAgICAgKTtcbiAgICAgICAgICAgIGlmICghYnVja2V0KSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgcHJldlByb2dyYW0gPSBwYWludGVyLmNvbnRleHQucHJvZ3JhbS5nZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IHByb2dyYW1Db25maWd1cmF0aW9uID0gYnVja2V0LnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQobGF5ZXIuaWQpO1xuICAgICAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgnaGVhdG1hcCcsIHByb2dyYW1Db25maWd1cmF0aW9uKTtcbiAgICAgICAgICAgIGNvbnN0IHt6b29tfSA9IHBhaW50ZXIudHJhbnNmb3JtO1xuICAgICAgICAgICAgaWYgKGZpcnN0IHx8IHByb2dyYW0ucHJvZ3JhbSAhPT0gcHJldlByb2dyYW0pIHtcbiAgICAgICAgICAgICAgICBwcm9ncmFtQ29uZmlndXJhdGlvbi5zZXRVbmlmb3JtcyhwYWludGVyLmNvbnRleHQsIHByb2dyYW0sIGxheWVyLnBhaW50LCB7em9vbX0pO1xuICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVuaWZvcm1zLnVfZXh0cnVkZV9zY2FsZSwgcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgMSwgem9vbSkpO1xuXG4gICAgICAgICAgICBnbC51bmlmb3JtMWYocHJvZ3JhbS51bmlmb3Jtcy51X2ludGVuc2l0eSwgbGF5ZXIucGFpbnQuZ2V0KCdoZWF0bWFwLWludGVuc2l0eScpKTtcbiAgICAgICAgICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS51bmlmb3Jtcy51X21hdHJpeCwgZmFsc2UsIGNvb3JkLnBvc01hdHJpeCk7XG5cbiAgICAgICAgICAgIHByb2dyYW0uZHJhdyhcbiAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgIGdsLlRSSUFOR0xFUyxcbiAgICAgICAgICAgICAgICBsYXllci5pZCxcbiAgICAgICAgICAgICAgICBidWNrZXQubGF5b3V0VmVydGV4QnVmZmVyLFxuICAgICAgICAgICAgICAgIGJ1Y2tldC5pbmRleEJ1ZmZlcixcbiAgICAgICAgICAgICAgICBidWNrZXQuc2VnbWVudHMsXG4gICAgICAgICAgICAgICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC52aWV3cG9ydC5zZXQoWzAsIDAsIHBhaW50ZXIud2lkdGgsIHBhaW50ZXIuaGVpZ2h0XSk7XG5cbiAgICB9IGVsc2UgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ3RyYW5zbHVjZW50Jykge1xuICAgICAgICBwYWludGVyLmNvbnRleHQuc2V0Q29sb3JNb2RlKHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKTtcbiAgICAgICAgcmVuZGVyVGV4dHVyZVRvTWFwKHBhaW50ZXIsIGxheWVyKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJpbmRGcmFtZWJ1ZmZlcihjb250ZXh0LCBwYWludGVyLCBsYXllcikge1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUxKTtcblxuICAgIC8vIFVzZSBhIDR4IGRvd25zY2FsZWQgc2NyZWVuIHRleHR1cmUgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgIGNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCBwYWludGVyLndpZHRoIC8gNCwgcGFpbnRlci5oZWlnaHQgLyA0XSk7XG5cbiAgICBsZXQgZmJvID0gbGF5ZXIuaGVhdG1hcEZibztcblxuICAgIGlmICghZmJvKSB7XG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcblxuICAgICAgICBmYm8gPSBsYXllci5oZWF0bWFwRmJvID0gY29udGV4dC5jcmVhdGVGcmFtZWJ1ZmZlcihwYWludGVyLndpZHRoIC8gNCwgcGFpbnRlci5oZWlnaHQgLyA0KTtcblxuICAgICAgICBiaW5kVGV4dHVyZVRvRnJhbWVidWZmZXIoY29udGV4dCwgcGFpbnRlciwgdGV4dHVyZSwgZmJvKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGZiby5jb2xvckF0dGFjaG1lbnQuZ2V0KCkpO1xuICAgICAgICBjb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQoZmJvLmZyYW1lYnVmZmVyKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJpbmRUZXh0dXJlVG9GcmFtZWJ1ZmZlcihjb250ZXh0LCBwYWludGVyLCB0ZXh0dXJlLCBmYm8pIHtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgLy8gVXNlIHRoZSBoaWdoZXIgcHJlY2lzaW9uIGhhbGYtZmxvYXQgdGV4dHVyZSB3aGVyZSBhdmFpbGFibGUgKHByb2R1Y2luZyBtdWNoIHNtb290aGVyIGxvb2tpbmcgaGVhdG1hcHMpO1xuICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgcGFpbnRlci53aWR0aCAvIDQsIHBhaW50ZXIuaGVpZ2h0IC8gNCwgMCwgZ2wuUkdCQSxcbiAgICAgICAgY29udGV4dC5leHRUZXh0dXJlSGFsZkZsb2F0ID8gY29udGV4dC5leHRUZXh0dXJlSGFsZkZsb2F0LkhBTEZfRkxPQVRfT0VTIDogZ2wuVU5TSUdORURfQllURSwgbnVsbCk7XG5cbiAgICBmYm8uY29sb3JBdHRhY2htZW50LnNldCh0ZXh0dXJlKTtcblxuICAgIC8vIElmIHVzaW5nIGhhbGYtZmxvYXQgdGV4dHVyZSBhcyBhIHJlbmRlciB0YXJnZXQgaXMgbm90IHN1cHBvcnRlZCwgZmFsbCBiYWNrIHRvIGEgbG93IHByZWNpc2lvbiB0ZXh0dXJlXG4gICAgaWYgKGNvbnRleHQuZXh0VGV4dHVyZUhhbGZGbG9hdCAmJiBnbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKGdsLkZSQU1FQlVGRkVSKSAhPT0gZ2wuRlJBTUVCVUZGRVJfQ09NUExFVEUpIHtcbiAgICAgICAgY29udGV4dC5leHRUZXh0dXJlSGFsZkZsb2F0ID0gbnVsbDtcbiAgICAgICAgZmJvLmNvbG9yQXR0YWNobWVudC5zZXREaXJ0eSgpO1xuICAgICAgICBiaW5kVGV4dHVyZVRvRnJhbWVidWZmZXIoY29udGV4dCwgcGFpbnRlciwgdGV4dHVyZSwgZmJvKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlclRleHR1cmVUb01hcChwYWludGVyLCBsYXllcikge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG5cbiAgICAvLyBIZXJlIHdlIGJpbmQgdHdvIGRpZmZlcmVudCB0ZXh0dXJlcyBmcm9tIHdoaWNoIHdlJ2xsIHNhbXBsZSBpbiBkcmF3aW5nXG4gICAgLy8gaGVhdG1hcHM6IHRoZSBrZXJuZWwgdGV4dHVyZSwgcHJlcGFyZWQgaW4gdGhlIG9mZnNjcmVlbiBwYXNzLCBhbmQgYVxuICAgIC8vIGNvbG9yIHJhbXAgdGV4dHVyZS5cbiAgICBjb25zdCBmYm8gPSBsYXllci5oZWF0bWFwRmJvO1xuICAgIGlmICghZmJvKSByZXR1cm47XG4gICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgZmJvLmNvbG9yQXR0YWNobWVudC5nZXQoKSk7XG5cbiAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUxKTtcbiAgICBsZXQgY29sb3JSYW1wVGV4dHVyZSA9IGxheWVyLmNvbG9yUmFtcFRleHR1cmU7XG4gICAgaWYgKCFjb2xvclJhbXBUZXh0dXJlKSB7XG4gICAgICAgIGNvbG9yUmFtcFRleHR1cmUgPSBsYXllci5jb2xvclJhbXBUZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgbGF5ZXIuY29sb3JSYW1wLCBnbC5SR0JBKTtcbiAgICB9XG4gICAgY29sb3JSYW1wVGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG5cbiAgICBjb250ZXh0LnNldERlcHRoTW9kZShEZXB0aE1vZGUuZGlzYWJsZWQpO1xuXG4gICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgnaGVhdG1hcFRleHR1cmUnKTtcblxuICAgIGNvbnN0IG9wYWNpdHkgPSBsYXllci5wYWludC5nZXQoJ2hlYXRtYXAtb3BhY2l0eScpO1xuICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVuaWZvcm1zLnVfb3BhY2l0eSwgb3BhY2l0eSk7XG4gICAgZ2wudW5pZm9ybTFpKHByb2dyYW0udW5pZm9ybXMudV9pbWFnZSwgMCk7XG4gICAgZ2wudW5pZm9ybTFpKHByb2dyYW0udW5pZm9ybXMudV9jb2xvcl9yYW1wLCAxKTtcblxuICAgIGNvbnN0IG1hdHJpeCA9IG1hdDQuY3JlYXRlKCk7XG4gICAgbWF0NC5vcnRobyhtYXRyaXgsIDAsIHBhaW50ZXIud2lkdGgsIHBhaW50ZXIuaGVpZ2h0LCAwLCAwLCAxKTtcbiAgICBnbC51bmlmb3JtTWF0cml4NGZ2KHByb2dyYW0udW5pZm9ybXMudV9tYXRyaXgsIGZhbHNlLCBtYXRyaXgpO1xuXG4gICAgZ2wudW5pZm9ybTJmKHByb2dyYW0udW5pZm9ybXMudV93b3JsZCwgZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0KTtcblxuICAgIHBhaW50ZXIudmlld3BvcnRWQU8uYmluZChwYWludGVyLmNvbnRleHQsIHByb2dyYW0sIHBhaW50ZXIudmlld3BvcnRCdWZmZXIsIFtdKTtcblxuICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpO1xufVxuIiwiLy8gICAgICBcbmNvbnN0IENvb3JkaW5hdGUgPSByZXF1aXJlKCcuLi9nZW8vY29vcmRpbmF0ZScpO1xuY29uc3QgVGV4dHVyZSA9IHJlcXVpcmUoJy4vdGV4dHVyZScpO1xuY29uc3QgRVhURU5UID0gcmVxdWlyZSgnLi4vZGF0YS9leHRlbnQnKTtcbmNvbnN0IG1hdDQgPSByZXF1aXJlKCdAbWFwYm94L2dsLW1hdHJpeCcpLm1hdDQ7XG5jb25zdCBTdGVuY2lsTW9kZSA9IHJlcXVpcmUoJy4uL2dsL3N0ZW5jaWxfbW9kZScpO1xuY29uc3QgRGVwdGhNb2RlID0gcmVxdWlyZSgnLi4vZ2wvZGVwdGhfbW9kZScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbm1vZHVsZS5leHBvcnRzID0gZHJhd0hpbGxzaGFkZTtcblxuZnVuY3Rpb24gZHJhd0hpbGxzaGFkZShwYWludGVyICAgICAgICAgLCBzb3VyY2VDYWNoZSAgICAgICAgICAgICAsIGxheWVyICAgICAgICAgICAgICAgICAgICAgLCB0aWxlSURzICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgIGlmIChwYWludGVyLnJlbmRlclBhc3MgIT09ICdvZmZzY3JlZW4nICYmIHBhaW50ZXIucmVuZGVyUGFzcyAhPT0gJ3RyYW5zbHVjZW50JykgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcblxuICAgIGNvbnRleHQuc2V0RGVwdGhNb2RlKHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCwgRGVwdGhNb2RlLlJlYWRPbmx5KSk7XG4gICAgY29udGV4dC5zZXRTdGVuY2lsTW9kZShTdGVuY2lsTW9kZS5kaXNhYmxlZCk7XG4gICAgY29udGV4dC5zZXRDb2xvck1vZGUocGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCkpO1xuXG4gICAgZm9yIChjb25zdCB0aWxlSUQgb2YgdGlsZUlEcykge1xuICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZSh0aWxlSUQpO1xuICAgICAgICBpZiAodGlsZS5uZWVkc0hpbGxzaGFkZVByZXBhcmUgJiYgcGFpbnRlci5yZW5kZXJQYXNzID09PSAnb2Zmc2NyZWVuJykge1xuICAgICAgICAgICAgcHJlcGFyZUhpbGxzaGFkZShwYWludGVyLCB0aWxlKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ3RyYW5zbHVjZW50Jykge1xuICAgICAgICAgICAgcmVuZGVySGlsbHNoYWRlKHBhaW50ZXIsIHRpbGUsIGxheWVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCBwYWludGVyLndpZHRoLCBwYWludGVyLmhlaWdodF0pO1xufVxuXG5mdW5jdGlvbiBzZXRMaWdodChwcm9ncmFtLCBwYWludGVyLCBsYXllcikge1xuICAgIGxldCBhemltdXRoYWwgPSBsYXllci5wYWludC5nZXQoJ2hpbGxzaGFkZS1pbGx1bWluYXRpb24tZGlyZWN0aW9uJykgKiAoTWF0aC5QSSAvIDE4MCk7XG4gICAgLy8gbW9kaWZ5IGF6aW11dGhhbCBhbmdsZSBieSBtYXAgcm90YXRpb24gaWYgbGlnaHQgaXMgYW5jaG9yZWQgYXQgdGhlIHZpZXdwb3J0XG4gICAgaWYgKGxheWVyLnBhaW50LmdldCgnaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1hbmNob3InKSA9PT0gJ3ZpZXdwb3J0JykgIGF6aW11dGhhbCAtPSBwYWludGVyLnRyYW5zZm9ybS5hbmdsZTtcbiAgICBwYWludGVyLmNvbnRleHQuZ2wudW5pZm9ybTJmKHByb2dyYW0udW5pZm9ybXMudV9saWdodCwgbGF5ZXIucGFpbnQuZ2V0KCdoaWxsc2hhZGUtZXhhZ2dlcmF0aW9uJyksIGF6aW11dGhhbCk7XG5cbn1cblxuZnVuY3Rpb24gZ2V0VGlsZUxhdFJhbmdlKHBhaW50ZXIsIHRpbGVJRCAgICAgICAgICAgICAgICAgICkge1xuICAgIGNvbnN0IGNvb3JkaW5hdGUwID0gdGlsZUlELnRvQ29vcmRpbmF0ZSgpO1xuICAgIGNvbnN0IGNvb3JkaW5hdGUxID0gbmV3IENvb3JkaW5hdGUoY29vcmRpbmF0ZTAuY29sdW1uLCBjb29yZGluYXRlMC5yb3cgKyAxLCBjb29yZGluYXRlMC56b29tKTtcbiAgICByZXR1cm4gW3BhaW50ZXIudHJhbnNmb3JtLmNvb3JkaW5hdGVMb2NhdGlvbihjb29yZGluYXRlMCkubGF0LCBwYWludGVyLnRyYW5zZm9ybS5jb29yZGluYXRlTG9jYXRpb24oY29vcmRpbmF0ZTEpLmxhdF07XG59XG5cbmZ1bmN0aW9uIHJlbmRlckhpbGxzaGFkZShwYWludGVyLCB0aWxlLCBsYXllcikge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgIGNvbnN0IGZibyA9IHRpbGUuZmJvO1xuICAgIGlmICghZmJvKSByZXR1cm47XG5cbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdoaWxsc2hhZGUnKTtcbiAgICBjb25zdCBwb3NNYXRyaXggPSBwYWludGVyLnRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgodGlsZS50aWxlSUQudG9VbndyYXBwZWQoKSk7XG4gICAgc2V0TGlnaHQocHJvZ3JhbSwgcGFpbnRlciwgbGF5ZXIpO1xuICAgIC8vIGZvciBzY2FsaW5nIHRoZSBtYWduaXR1ZGUgb2YgYSBwb2ludHMgc2xvcGUgYnkgaXRzIGxhdGl0dWRlXG4gICAgY29uc3QgbGF0UmFuZ2UgPSBnZXRUaWxlTGF0UmFuZ2UocGFpbnRlciwgdGlsZS50aWxlSUQpO1xuICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuXG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgZmJvLmNvbG9yQXR0YWNobWVudC5nZXQoKSk7XG5cbiAgICBnbC51bmlmb3JtTWF0cml4NGZ2KHByb2dyYW0udW5pZm9ybXMudV9tYXRyaXgsIGZhbHNlLCBwb3NNYXRyaXgpO1xuICAgIGdsLnVuaWZvcm0yZnYocHJvZ3JhbS51bmlmb3Jtcy51X2xhdHJhbmdlLCBsYXRSYW5nZSk7XG4gICAgZ2wudW5pZm9ybTFpKHByb2dyYW0udW5pZm9ybXMudV9pbWFnZSwgMCk7XG5cbiAgICBjb25zdCBzaGFkb3dDb2xvciA9IGxheWVyLnBhaW50LmdldChcImhpbGxzaGFkZS1zaGFkb3ctY29sb3JcIik7XG4gICAgZ2wudW5pZm9ybTRmKHByb2dyYW0udW5pZm9ybXMudV9zaGFkb3csIHNoYWRvd0NvbG9yLnIsIHNoYWRvd0NvbG9yLmcsIHNoYWRvd0NvbG9yLmIsIHNoYWRvd0NvbG9yLmEpO1xuICAgIGNvbnN0IGhpZ2hsaWdodENvbG9yID0gbGF5ZXIucGFpbnQuZ2V0KFwiaGlsbHNoYWRlLWhpZ2hsaWdodC1jb2xvclwiKTtcbiAgICBnbC51bmlmb3JtNGYocHJvZ3JhbS51bmlmb3Jtcy51X2hpZ2hsaWdodCwgaGlnaGxpZ2h0Q29sb3IuciwgaGlnaGxpZ2h0Q29sb3IuZywgaGlnaGxpZ2h0Q29sb3IuYiwgaGlnaGxpZ2h0Q29sb3IuYSk7XG4gICAgY29uc3QgYWNjZW50Q29sb3IgPSBsYXllci5wYWludC5nZXQoXCJoaWxsc2hhZGUtYWNjZW50LWNvbG9yXCIpO1xuICAgIGdsLnVuaWZvcm00Zihwcm9ncmFtLnVuaWZvcm1zLnVfYWNjZW50LCBhY2NlbnRDb2xvci5yLCBhY2NlbnRDb2xvci5nLCBhY2NlbnRDb2xvci5iLCBhY2NlbnRDb2xvci5hKTtcblxuICAgIGlmICh0aWxlLm1hc2tlZEJvdW5kc0J1ZmZlciAmJiB0aWxlLm1hc2tlZEluZGV4QnVmZmVyICYmIHRpbGUuc2VnbWVudHMpIHtcbiAgICAgICAgcHJvZ3JhbS5kcmF3KFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIGdsLlRSSUFOR0xFUyxcbiAgICAgICAgICAgIGxheWVyLmlkLFxuICAgICAgICAgICAgdGlsZS5tYXNrZWRCb3VuZHNCdWZmZXIsXG4gICAgICAgICAgICB0aWxlLm1hc2tlZEluZGV4QnVmZmVyLFxuICAgICAgICAgICAgdGlsZS5zZWdtZW50c1xuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHBhaW50ZXIucmFzdGVyQm91bmRzQnVmZmVyO1xuICAgICAgICBjb25zdCB2YW8gPSBwYWludGVyLnJhc3RlckJvdW5kc1ZBTztcbiAgICAgICAgdmFvLmJpbmQoY29udGV4dCwgcHJvZ3JhbSwgYnVmZmVyLCBbXSk7XG4gICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIGJ1ZmZlci5sZW5ndGgpO1xuICAgIH1cbn1cblxuXG4vLyBoaWxsc2hhZGUgcmVuZGVyaW5nIGlzIGRvbmUgaW4gdHdvIHN0ZXBzLiB0aGUgcHJlcGFyZSBzdGVwIGZpcnN0IGNhbGN1bGF0ZXMgdGhlIHNsb3BlIG9mIHRoZSB0ZXJyYWluIGluIHRoZSB4IGFuZCB5XG4vLyBkaXJlY3Rpb25zIGZvciBlYWNoIHBpeGVsLCBhbmQgc2F2ZXMgdGhvc2UgdmFsdWVzIHRvIGEgZnJhbWVidWZmZXIgdGV4dHVyZSBpbiB0aGUgciBhbmQgZyBjaGFubmVscy5cbmZ1bmN0aW9uIHByZXBhcmVIaWxsc2hhZGUocGFpbnRlciwgdGlsZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgIC8vIGRlY29kZSByZ2JhIGxldmVscyBieSB1c2luZyBpbnRlZ2VyIG92ZXJmbG93IHRvIGNvbnZlcnQgZWFjaCBVaW50MzJBcnJheSBlbGVtZW50IC0+IDQgVWludDhBcnJheSBlbGVtZW50cy5cbiAgICAvLyBleC5cbiAgICAvLyBVaW50MzI6XG4gICAgLy8gYmFzZSAxMCAtIDY3MzA4XG4gICAgLy8gYmFzZSAyIC0gMDAwMCAwMDAwIDAwMDAgMDAwMSAwMDAwIDAxMTAgMTExMCAxMTAwXG4gICAgLy9cbiAgICAvLyBVaW50ODpcbiAgICAvLyBiYXNlIDEwIC0gMCwgMSwgNiwgMjM2ICh0aGlzIG9yZGVyIGlzIHJldmVyc2VkIGluIHRoZSByZXN1bHRpbmcgYXJyYXkgdmlhIHRoZSBvdmVyZmxvdy5cbiAgICAvLyBmaXJzdCA4IGJpdHMgcmVwcmVzZW50IDIzNiwgc28gdGhlIHIgY29tcG9uZW50IG9mIHRoZSB0ZXh0dXJlIHBpeGVsIHdpbGwgYmUgMjM2IGV0Yy4pXG4gICAgLy8gYmFzZSAyIC0gMDAwMCAwMDAwLCAwMDAwIDAwMDEsIDAwMDAgMDExMCwgMTExMCAxMTAwXG4gICAgaWYgKHRpbGUuZGVtICYmIHRpbGUuZGVtLmxldmVsKSB7XG4gICAgICAgIGNvbnN0IHRpbGVTaXplID0gdGlsZS5kZW0ubGV2ZWwuZGltO1xuXG4gICAgICAgIGNvbnN0IHBpeGVsRGF0YSA9IHRpbGUuZGVtLmdldFBpeGVscygpO1xuICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUxKTtcblxuICAgICAgICAvLyBpZiBVTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wgaXMgc2V0IHRvIHRydWUgcHJpb3IgdG8gZHJhd0hpbGxzaGFkZSBiZWluZyBjYWxsZWRcbiAgICAgICAgLy8gdGlsZXMgd2lsbCBhcHBlYXIgYmxhbmssIGJlY2F1c2UgYXMgeW91IGNhbiBzZWUgYWJvdmUgdGhlIGFscGhhIHZhbHVlIGZvciB0aGVzZSB0ZXh0dXJlc1xuICAgICAgICAvLyBpcyBhbHdheXMgMFxuICAgICAgICBjb250ZXh0LnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLnNldChmYWxzZSk7XG4gICAgICAgIHRpbGUuZGVtVGV4dHVyZSA9IHRpbGUuZGVtVGV4dHVyZSB8fCBwYWludGVyLmdldFRpbGVUZXh0dXJlKHRpbGUudGlsZVNpemUpO1xuICAgICAgICBpZiAodGlsZS5kZW1UZXh0dXJlKSB7XG4gICAgICAgICAgICBjb25zdCBkZW1UZXh0dXJlID0gdGlsZS5kZW1UZXh0dXJlO1xuICAgICAgICAgICAgZGVtVGV4dHVyZS51cGRhdGUocGl4ZWxEYXRhLCBmYWxzZSk7XG4gICAgICAgICAgICBkZW1UZXh0dXJlLmJpbmQoZ2wuTkVBUkVTVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aWxlLmRlbVRleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCBwaXhlbERhdGEsIGdsLlJHQkEsIGZhbHNlKTtcbiAgICAgICAgICAgIHRpbGUuZGVtVGV4dHVyZS5iaW5kKGdsLk5FQVJFU1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG5cbiAgICAgICAgbGV0IGZibyA9IHRpbGUuZmJvO1xuXG4gICAgICAgIGlmICghZmJvKSB7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJUZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwge3dpZHRoOiB0aWxlU2l6ZSwgaGVpZ2h0OiB0aWxlU2l6ZSwgZGF0YTogbnVsbH0sIGdsLlJHQkEpO1xuICAgICAgICAgICAgcmVuZGVyVGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG5cbiAgICAgICAgICAgIGZibyA9IHRpbGUuZmJvID0gY29udGV4dC5jcmVhdGVGcmFtZWJ1ZmZlcih0aWxlU2l6ZSwgdGlsZVNpemUpO1xuICAgICAgICAgICAgZmJvLmNvbG9yQXR0YWNobWVudC5zZXQocmVuZGVyVGV4dHVyZS50ZXh0dXJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQuYmluZEZyYW1lYnVmZmVyLnNldChmYm8uZnJhbWVidWZmZXIpO1xuICAgICAgICBjb250ZXh0LnZpZXdwb3J0LnNldChbMCwgMCwgdGlsZVNpemUsIHRpbGVTaXplXSk7XG5cbiAgICAgICAgY29uc3QgbWF0cml4ID0gbWF0NC5jcmVhdGUoKTtcbiAgICAgICAgLy8gRmxpcCByZW5kZXJpbmcgYXQgeSBheGlzLlxuICAgICAgICBtYXQ0Lm9ydGhvKG1hdHJpeCwgMCwgRVhURU5ULCAtRVhURU5ULCAwLCAwLCAxKTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUobWF0cml4LCBtYXRyaXgsIFswLCAtRVhURU5ULCAwXSk7XG5cbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgnaGlsbHNoYWRlUHJlcGFyZScpO1xuXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS51bmlmb3Jtcy51X21hdHJpeCwgZmFsc2UsIG1hdHJpeCk7XG4gICAgICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVuaWZvcm1zLnVfem9vbSwgdGlsZS50aWxlSUQub3ZlcnNjYWxlZFopO1xuICAgICAgICBnbC51bmlmb3JtMmZ2KHByb2dyYW0udW5pZm9ybXMudV9kaW1lbnNpb24sIFt0aWxlU2l6ZSAqIDIsIHRpbGVTaXplICogMl0pO1xuICAgICAgICBnbC51bmlmb3JtMWkocHJvZ3JhbS51bmlmb3Jtcy51X2ltYWdlLCAxKTtcblxuICAgICAgICBjb25zdCBidWZmZXIgPSBwYWludGVyLnJhc3RlckJvdW5kc0J1ZmZlcjtcbiAgICAgICAgY29uc3QgdmFvID0gcGFpbnRlci5yYXN0ZXJCb3VuZHNWQU87XG5cbiAgICAgICAgdmFvLmJpbmQoY29udGV4dCwgcHJvZ3JhbSwgYnVmZmVyLCBbXSk7XG4gICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIGJ1ZmZlci5sZW5ndGgpO1xuXG4gICAgICAgIHRpbGUubmVlZHNIaWxsc2hhZGVQcmVwYXJlID0gZmFsc2U7XG4gICAgfVxufVxuIiwiLy8gICAgICBcblxuY29uc3QgYnJvd3NlciA9IHJlcXVpcmUoJy4uL3V0aWwvYnJvd3NlcicpO1xuY29uc3QgcGl4ZWxzVG9UaWxlVW5pdHMgPSByZXF1aXJlKCcuLi9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMnKTtcbmNvbnN0IERlcHRoTW9kZSA9IHJlcXVpcmUoJy4uL2dsL2RlcHRoX21vZGUnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkcmF3TGluZShwYWludGVyICAgICAgICAgLCBzb3VyY2VDYWNoZSAgICAgICAgICAgICAsIGxheWVyICAgICAgICAgICAgICAgICwgY29vcmRzICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgIGlmIChwYWludGVyLnJlbmRlclBhc3MgIT09ICd0cmFuc2x1Y2VudCcpIHJldHVybjtcblxuICAgIGNvbnN0IG9wYWNpdHkgPSBsYXllci5wYWludC5nZXQoJ2xpbmUtb3BhY2l0eScpO1xuICAgIGlmIChvcGFjaXR5LmNvbnN0YW50T3IoMSkgPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG5cbiAgICBjb250ZXh0LnNldERlcHRoTW9kZShwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKDAsIERlcHRoTW9kZS5SZWFkT25seSkpO1xuICAgIGNvbnRleHQuc2V0Q29sb3JNb2RlKHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKTtcblxuICAgIGNvbnN0IHByb2dyYW1JZCA9XG4gICAgICAgIGxheWVyLnBhaW50LmdldCgnbGluZS1kYXNoYXJyYXknKSA/ICdsaW5lU0RGJyA6XG4gICAgICAgIGxheWVyLnBhaW50LmdldCgnbGluZS1wYXR0ZXJuJykgPyAnbGluZVBhdHRlcm4nIDogJ2xpbmUnO1xuXG4gICAgbGV0IHByZXZUaWxlWm9vbTtcbiAgICBsZXQgZmlyc3RUaWxlID0gdHJ1ZTtcblxuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgY29uc3QgYnVja2V0ICAgICAgICAgICAgICA9ICh0aWxlLmdldEJ1Y2tldChsYXllcikgICAgICk7XG4gICAgICAgIGlmICghYnVja2V0KSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBwcm9ncmFtQ29uZmlndXJhdGlvbiA9IGJ1Y2tldC5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGxheWVyLmlkKTtcbiAgICAgICAgY29uc3QgcHJldlByb2dyYW0gPSBwYWludGVyLmNvbnRleHQucHJvZ3JhbS5nZXQoKTtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbShwcm9ncmFtSWQsIHByb2dyYW1Db25maWd1cmF0aW9uKTtcbiAgICAgICAgY29uc3QgcHJvZ3JhbUNoYW5nZWQgPSBmaXJzdFRpbGUgfHwgcHJvZ3JhbS5wcm9ncmFtICE9PSBwcmV2UHJvZ3JhbTtcbiAgICAgICAgY29uc3QgdGlsZVJhdGlvQ2hhbmdlZCA9IHByZXZUaWxlWm9vbSAhPT0gdGlsZS50aWxlSUQub3ZlcnNjYWxlZFo7XG5cbiAgICAgICAgaWYgKHByb2dyYW1DaGFuZ2VkKSB7XG4gICAgICAgICAgICBwcm9ncmFtQ29uZmlndXJhdGlvbi5zZXRVbmlmb3JtcyhwYWludGVyLmNvbnRleHQsIHByb2dyYW0sIGxheWVyLnBhaW50LCB7em9vbTogcGFpbnRlci50cmFuc2Zvcm0uem9vbX0pO1xuICAgICAgICB9XG4gICAgICAgIGRyYXdMaW5lVGlsZShwcm9ncmFtLCBwYWludGVyLCB0aWxlLCBidWNrZXQsIGxheWVyLCBjb29yZCwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24sIHByb2dyYW1DaGFuZ2VkLCB0aWxlUmF0aW9DaGFuZ2VkKTtcbiAgICAgICAgcHJldlRpbGVab29tID0gdGlsZS50aWxlSUQub3ZlcnNjYWxlZFo7XG4gICAgICAgIGZpcnN0VGlsZSA9IGZhbHNlO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGRyYXdMaW5lVGlsZShwcm9ncmFtLCBwYWludGVyLCB0aWxlLCBidWNrZXQsIGxheWVyLCBjb29yZCwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24sIHByb2dyYW1DaGFuZ2VkLCB0aWxlUmF0aW9DaGFuZ2VkKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgY29uc3QgZGFzaGFycmF5ID0gbGF5ZXIucGFpbnQuZ2V0KCdsaW5lLWRhc2hhcnJheScpO1xuICAgIGNvbnN0IGltYWdlID0gbGF5ZXIucGFpbnQuZ2V0KCdsaW5lLXBhdHRlcm4nKTtcblxuICAgIGxldCBwb3NBLCBwb3NCLCBpbWFnZVBvc0EsIGltYWdlUG9zQjtcblxuICAgIGlmIChwcm9ncmFtQ2hhbmdlZCB8fCB0aWxlUmF0aW9DaGFuZ2VkKSB7XG4gICAgICAgIGNvbnN0IHRpbGVSYXRpbyA9IDEgLyBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCBwYWludGVyLnRyYW5zZm9ybS50aWxlWm9vbSk7XG5cbiAgICAgICAgaWYgKGRhc2hhcnJheSkge1xuICAgICAgICAgICAgcG9zQSA9IHBhaW50ZXIubGluZUF0bGFzLmdldERhc2goZGFzaGFycmF5LmZyb20sIGxheWVyLmxheW91dC5nZXQoJ2xpbmUtY2FwJykgPT09ICdyb3VuZCcpO1xuICAgICAgICAgICAgcG9zQiA9IHBhaW50ZXIubGluZUF0bGFzLmdldERhc2goZGFzaGFycmF5LnRvLCBsYXllci5sYXlvdXQuZ2V0KCdsaW5lLWNhcCcpID09PSAncm91bmQnKTtcblxuICAgICAgICAgICAgY29uc3Qgd2lkdGhBID0gcG9zQS53aWR0aCAqIGRhc2hhcnJheS5mcm9tU2NhbGU7XG4gICAgICAgICAgICBjb25zdCB3aWR0aEIgPSBwb3NCLndpZHRoICogZGFzaGFycmF5LnRvU2NhbGU7XG5cbiAgICAgICAgICAgIGdsLnVuaWZvcm0yZihwcm9ncmFtLnVuaWZvcm1zLnVfcGF0dGVybnNjYWxlX2EsIHRpbGVSYXRpbyAvIHdpZHRoQSwgLXBvc0EuaGVpZ2h0IC8gMik7XG4gICAgICAgICAgICBnbC51bmlmb3JtMmYocHJvZ3JhbS51bmlmb3Jtcy51X3BhdHRlcm5zY2FsZV9iLCB0aWxlUmF0aW8gLyB3aWR0aEIsIC1wb3NCLmhlaWdodCAvIDIpO1xuICAgICAgICAgICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udW5pZm9ybXMudV9zZGZnYW1tYSwgcGFpbnRlci5saW5lQXRsYXMud2lkdGggLyAoTWF0aC5taW4od2lkdGhBLCB3aWR0aEIpICogMjU2ICogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKSAvIDIpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoaW1hZ2UpIHtcbiAgICAgICAgICAgIGltYWdlUG9zQSA9IHBhaW50ZXIuaW1hZ2VNYW5hZ2VyLmdldFBhdHRlcm4oaW1hZ2UuZnJvbSk7XG4gICAgICAgICAgICBpbWFnZVBvc0IgPSBwYWludGVyLmltYWdlTWFuYWdlci5nZXRQYXR0ZXJuKGltYWdlLnRvKTtcbiAgICAgICAgICAgIGlmICghaW1hZ2VQb3NBIHx8ICFpbWFnZVBvc0IpIHJldHVybjtcblxuICAgICAgICAgICAgZ2wudW5pZm9ybTJmKHByb2dyYW0udW5pZm9ybXMudV9wYXR0ZXJuX3NpemVfYSwgaW1hZ2VQb3NBLmRpc3BsYXlTaXplWzBdICogaW1hZ2UuZnJvbVNjYWxlIC8gdGlsZVJhdGlvLCBpbWFnZVBvc0IuZGlzcGxheVNpemVbMV0pO1xuICAgICAgICAgICAgZ2wudW5pZm9ybTJmKHByb2dyYW0udW5pZm9ybXMudV9wYXR0ZXJuX3NpemVfYiwgaW1hZ2VQb3NCLmRpc3BsYXlTaXplWzBdICogaW1hZ2UudG9TY2FsZSAvIHRpbGVSYXRpbywgaW1hZ2VQb3NCLmRpc3BsYXlTaXplWzFdKTtcblxuICAgICAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gcGFpbnRlci5pbWFnZU1hbmFnZXIuZ2V0UGl4ZWxTaXplKCk7XG4gICAgICAgICAgICBnbC51bmlmb3JtMmZ2KHByb2dyYW0udW5pZm9ybXMudV90ZXhzaXplLCBbd2lkdGgsIGhlaWdodF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2wudW5pZm9ybTJmKHByb2dyYW0udW5pZm9ybXMudV9nbF91bml0c190b19waXhlbHMsIDEgLyBwYWludGVyLnRyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHNbMF0sIDEgLyBwYWludGVyLnRyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHNbMV0pO1xuICAgIH1cblxuICAgIGlmIChwcm9ncmFtQ2hhbmdlZCkge1xuXG4gICAgICAgIGlmIChkYXNoYXJyYXkpIHtcbiAgICAgICAgICAgIGdsLnVuaWZvcm0xaShwcm9ncmFtLnVuaWZvcm1zLnVfaW1hZ2UsIDApO1xuICAgICAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgICAgICAgICBwYWludGVyLmxpbmVBdGxhcy5iaW5kKGNvbnRleHQpO1xuXG4gICAgICAgICAgICBnbC51bmlmb3JtMWYocHJvZ3JhbS51bmlmb3Jtcy51X3RleF95X2EsIChwb3NBICAgICApLnkpO1xuICAgICAgICAgICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udW5pZm9ybXMudV90ZXhfeV9iLCAocG9zQiAgICAgKS55KTtcbiAgICAgICAgICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVuaWZvcm1zLnVfbWl4LCBkYXNoYXJyYXkudCk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChpbWFnZSkge1xuICAgICAgICAgICAgZ2wudW5pZm9ybTFpKHByb2dyYW0udW5pZm9ybXMudV9pbWFnZSwgMCk7XG4gICAgICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICAgICAgICAgIHBhaW50ZXIuaW1hZ2VNYW5hZ2VyLmJpbmQoY29udGV4dCk7XG5cbiAgICAgICAgICAgIGdsLnVuaWZvcm0yZnYocHJvZ3JhbS51bmlmb3Jtcy51X3BhdHRlcm5fdGxfYSwgKGltYWdlUG9zQSAgICAgKS50bCk7XG4gICAgICAgICAgICBnbC51bmlmb3JtMmZ2KHByb2dyYW0udW5pZm9ybXMudV9wYXR0ZXJuX2JyX2EsIChpbWFnZVBvc0EgICAgICkuYnIpO1xuICAgICAgICAgICAgZ2wudW5pZm9ybTJmdihwcm9ncmFtLnVuaWZvcm1zLnVfcGF0dGVybl90bF9iLCAoaW1hZ2VQb3NCICAgICApLnRsKTtcbiAgICAgICAgICAgIGdsLnVuaWZvcm0yZnYocHJvZ3JhbS51bmlmb3Jtcy51X3BhdHRlcm5fYnJfYiwgKGltYWdlUG9zQiAgICAgKS5icik7XG4gICAgICAgICAgICBnbC51bmlmb3JtMWYocHJvZ3JhbS51bmlmb3Jtcy51X2ZhZGUsIGltYWdlLnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29udGV4dC5zZXRTdGVuY2lsTW9kZShwYWludGVyLnN0ZW5jaWxNb2RlRm9yQ2xpcHBpbmcoY29vcmQpKTtcblxuICAgIGNvbnN0IHBvc01hdHJpeCA9IHBhaW50ZXIudHJhbnNsYXRlUG9zTWF0cml4KGNvb3JkLnBvc01hdHJpeCwgdGlsZSwgbGF5ZXIucGFpbnQuZ2V0KCdsaW5lLXRyYW5zbGF0ZScpLCBsYXllci5wYWludC5nZXQoJ2xpbmUtdHJhbnNsYXRlLWFuY2hvcicpKTtcbiAgICBnbC51bmlmb3JtTWF0cml4NGZ2KHByb2dyYW0udW5pZm9ybXMudV9tYXRyaXgsIGZhbHNlLCBwb3NNYXRyaXgpO1xuXG4gICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udW5pZm9ybXMudV9yYXRpbywgMSAvIHBpeGVsc1RvVGlsZVVuaXRzKHRpbGUsIDEsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20pKTtcblxuICAgIHByb2dyYW0uZHJhdyhcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgZ2wuVFJJQU5HTEVTLFxuICAgICAgICBsYXllci5pZCxcbiAgICAgICAgYnVja2V0LmxheW91dFZlcnRleEJ1ZmZlcixcbiAgICAgICAgYnVja2V0LmluZGV4QnVmZmVyLFxuICAgICAgICBidWNrZXQuc2VnbWVudHMsXG4gICAgICAgIHByb2dyYW1Db25maWd1cmF0aW9uKTtcbn1cbiIsIi8vICAgICAgXG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbmNvbnN0IEltYWdlU291cmNlID0gcmVxdWlyZSgnLi4vc291cmNlL2ltYWdlX3NvdXJjZScpO1xuY29uc3QgYnJvd3NlciA9IHJlcXVpcmUoJy4uL3V0aWwvYnJvd3NlcicpO1xuY29uc3QgU3RlbmNpbE1vZGUgPSByZXF1aXJlKCcuLi9nbC9zdGVuY2lsX21vZGUnKTtcbmNvbnN0IERlcHRoTW9kZSA9IHJlcXVpcmUoJy4uL2dsL2RlcHRoX21vZGUnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5tb2R1bGUuZXhwb3J0cyA9IGRyYXdSYXN0ZXI7XG5cbmZ1bmN0aW9uIGRyYXdSYXN0ZXIocGFpbnRlciAgICAgICAgICwgc291cmNlQ2FjaGUgICAgICAgICAgICAgLCBsYXllciAgICAgICAgICAgICAgICAgICwgY29vcmRzICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgIGlmIChwYWludGVyLnJlbmRlclBhc3MgIT09ICd0cmFuc2x1Y2VudCcpIHJldHVybjtcbiAgICBpZiAobGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItb3BhY2l0eScpID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKTtcbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdyYXN0ZXInKTtcblxuICAgIGNvbnRleHQuc2V0U3RlbmNpbE1vZGUoU3RlbmNpbE1vZGUuZGlzYWJsZWQpO1xuICAgIGNvbnRleHQuc2V0Q29sb3JNb2RlKHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKTtcblxuICAgIC8vIENvbnN0YW50IHBhcmFtZXRlcnMuXG4gICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udW5pZm9ybXMudV9icmlnaHRuZXNzX2xvdywgbGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItYnJpZ2h0bmVzcy1taW4nKSk7XG4gICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udW5pZm9ybXMudV9icmlnaHRuZXNzX2hpZ2gsIGxheWVyLnBhaW50LmdldCgncmFzdGVyLWJyaWdodG5lc3MtbWF4JykpO1xuICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVuaWZvcm1zLnVfc2F0dXJhdGlvbl9mYWN0b3IsIHNhdHVyYXRpb25GYWN0b3IobGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItc2F0dXJhdGlvbicpKSk7XG4gICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udW5pZm9ybXMudV9jb250cmFzdF9mYWN0b3IsIGNvbnRyYXN0RmFjdG9yKGxheWVyLnBhaW50LmdldCgncmFzdGVyLWNvbnRyYXN0JykpKTtcbiAgICBnbC51bmlmb3JtM2Z2KHByb2dyYW0udW5pZm9ybXMudV9zcGluX3dlaWdodHMsIHNwaW5XZWlnaHRzKGxheWVyLnBhaW50LmdldCgncmFzdGVyLWh1ZS1yb3RhdGUnKSkpO1xuICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVuaWZvcm1zLnVfYnVmZmVyX3NjYWxlLCAxKTtcbiAgICBnbC51bmlmb3JtMWkocHJvZ3JhbS51bmlmb3Jtcy51X2ltYWdlMCwgMCk7XG4gICAgZ2wudW5pZm9ybTFpKHByb2dyYW0udW5pZm9ybXMudV9pbWFnZTEsIDEpO1xuXG4gICAgY29uc3QgbWluVGlsZVogPSBjb29yZHMubGVuZ3RoICYmIGNvb3Jkc1swXS5vdmVyc2NhbGVkWjtcblxuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgIC8vIFNldCB0aGUgbG93ZXIgem9vbSBsZXZlbCB0byBzdWJsYXllciAwLCBhbmQgaGlnaGVyIHpvb20gbGV2ZWxzIHRvIGhpZ2hlciBzdWJsYXllcnNcbiAgICAgICAgLy8gVXNlIGdsLkxFU1MgdG8gcHJldmVudCBkb3VibGUgZHJhd2luZyBpbiBhcmVhcyB3aGVyZSB0aWxlcyBvdmVybGFwLlxuICAgICAgICBjb250ZXh0LnNldERlcHRoTW9kZShwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKGNvb3JkLm92ZXJzY2FsZWRaIC0gbWluVGlsZVosXG4gICAgICAgICAgICBsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1vcGFjaXR5JykgPT09IDEgPyBEZXB0aE1vZGUuUmVhZFdyaXRlIDogRGVwdGhNb2RlLlJlYWRPbmx5LCBnbC5MRVNTKSk7XG5cbiAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpO1xuICAgICAgICBjb25zdCBwb3NNYXRyaXggPSBwYWludGVyLnRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgoY29vcmQudG9VbndyYXBwZWQoKSwgdHJ1ZSk7XG5cbiAgICAgICAgdGlsZS5yZWdpc3RlckZhZGVEdXJhdGlvbihsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1mYWRlLWR1cmF0aW9uJykpO1xuXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS51bmlmb3Jtcy51X21hdHJpeCwgZmFsc2UsIHBvc01hdHJpeCk7XG5cbiAgICAgICAgY29uc3QgcGFyZW50VGlsZSA9IHNvdXJjZUNhY2hlLmZpbmRMb2FkZWRQYXJlbnQoY29vcmQsIDAsIHt9KSxcbiAgICAgICAgICAgIGZhZGUgPSBnZXRGYWRlVmFsdWVzKHRpbGUsIHBhcmVudFRpbGUsIHNvdXJjZUNhY2hlLCBsYXllciwgcGFpbnRlci50cmFuc2Zvcm0pO1xuXG4gICAgICAgIGxldCBwYXJlbnRTY2FsZUJ5LCBwYXJlbnRUTDtcblxuICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICAgICAgdGlsZS50ZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFLCBnbC5MSU5FQVJfTUlQTUFQX05FQVJFU1QpO1xuXG4gICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTEpO1xuXG4gICAgICAgIGlmIChwYXJlbnRUaWxlKSB7XG4gICAgICAgICAgICBwYXJlbnRUaWxlLnRleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UsIGdsLkxJTkVBUl9NSVBNQVBfTkVBUkVTVCk7XG4gICAgICAgICAgICBwYXJlbnRTY2FsZUJ5ID0gTWF0aC5wb3coMiwgcGFyZW50VGlsZS50aWxlSUQub3ZlcnNjYWxlZFogLSB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWik7XG4gICAgICAgICAgICBwYXJlbnRUTCA9IFt0aWxlLnRpbGVJRC5jYW5vbmljYWwueCAqIHBhcmVudFNjYWxlQnkgJSAxLCB0aWxlLnRpbGVJRC5jYW5vbmljYWwueSAqIHBhcmVudFNjYWxlQnkgJSAxXTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGlsZS50ZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFLCBnbC5MSU5FQVJfTUlQTUFQX05FQVJFU1QpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY3Jvc3MtZmFkZSBwYXJhbWV0ZXJzXG4gICAgICAgIGdsLnVuaWZvcm0yZnYocHJvZ3JhbS51bmlmb3Jtcy51X3RsX3BhcmVudCwgcGFyZW50VEwgfHwgWzAsIDBdKTtcbiAgICAgICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udW5pZm9ybXMudV9zY2FsZV9wYXJlbnQsIHBhcmVudFNjYWxlQnkgfHwgMSk7XG4gICAgICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVuaWZvcm1zLnVfZmFkZV90LCBmYWRlLm1peCk7XG4gICAgICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVuaWZvcm1zLnVfb3BhY2l0eSwgZmFkZS5vcGFjaXR5ICogbGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItb3BhY2l0eScpKTtcblxuXG4gICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBJbWFnZVNvdXJjZSkge1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gc291cmNlLmJvdW5kc0J1ZmZlcjtcbiAgICAgICAgICAgIGNvbnN0IHZhbyA9IHNvdXJjZS5ib3VuZHNWQU87XG4gICAgICAgICAgICB2YW8uYmluZChjb250ZXh0LCBwcm9ncmFtLCBidWZmZXIsIFtdKTtcbiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIGJ1ZmZlci5sZW5ndGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRpbGUubWFza2VkQm91bmRzQnVmZmVyICYmIHRpbGUubWFza2VkSW5kZXhCdWZmZXIgJiYgdGlsZS5zZWdtZW50cykge1xuICAgICAgICAgICAgcHJvZ3JhbS5kcmF3KFxuICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgZ2wuVFJJQU5HTEVTLFxuICAgICAgICAgICAgICAgIGxheWVyLmlkLFxuICAgICAgICAgICAgICAgIHRpbGUubWFza2VkQm91bmRzQnVmZmVyLFxuICAgICAgICAgICAgICAgIHRpbGUubWFza2VkSW5kZXhCdWZmZXIsXG4gICAgICAgICAgICAgICAgdGlsZS5zZWdtZW50c1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHBhaW50ZXIucmFzdGVyQm91bmRzQnVmZmVyO1xuICAgICAgICAgICAgY29uc3QgdmFvID0gcGFpbnRlci5yYXN0ZXJCb3VuZHNWQU87XG4gICAgICAgICAgICB2YW8uYmluZChjb250ZXh0LCBwcm9ncmFtLCBidWZmZXIsIFtdKTtcbiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIGJ1ZmZlci5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzcGluV2VpZ2h0cyhhbmdsZSkge1xuICAgIGFuZ2xlICo9IE1hdGguUEkgLyAxODA7XG4gICAgY29uc3QgcyA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICBjb25zdCBjID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgIHJldHVybiBbXG4gICAgICAgICgyICogYyArIDEpIC8gMyxcbiAgICAgICAgKC1NYXRoLnNxcnQoMykgKiBzIC0gYyArIDEpIC8gMyxcbiAgICAgICAgKE1hdGguc3FydCgzKSAqIHMgLSBjICsgMSkgLyAzXG4gICAgXTtcbn1cblxuZnVuY3Rpb24gY29udHJhc3RGYWN0b3IoY29udHJhc3QpIHtcbiAgICByZXR1cm4gY29udHJhc3QgPiAwID9cbiAgICAgICAgMSAvICgxIC0gY29udHJhc3QpIDpcbiAgICAgICAgMSArIGNvbnRyYXN0O1xufVxuXG5mdW5jdGlvbiBzYXR1cmF0aW9uRmFjdG9yKHNhdHVyYXRpb24pIHtcbiAgICByZXR1cm4gc2F0dXJhdGlvbiA+IDAgP1xuICAgICAgICAxIC0gMSAvICgxLjAwMSAtIHNhdHVyYXRpb24pIDpcbiAgICAgICAgLXNhdHVyYXRpb247XG59XG5cbmZ1bmN0aW9uIGdldEZhZGVWYWx1ZXModGlsZSwgcGFyZW50VGlsZSwgc291cmNlQ2FjaGUsIGxheWVyLCB0cmFuc2Zvcm0pIHtcbiAgICBjb25zdCBmYWRlRHVyYXRpb24gPSBsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1mYWRlLWR1cmF0aW9uJyk7XG5cbiAgICBpZiAoZmFkZUR1cmF0aW9uID4gMCkge1xuICAgICAgICBjb25zdCBub3cgPSBicm93c2VyLm5vdygpO1xuICAgICAgICBjb25zdCBzaW5jZVRpbGUgPSAobm93IC0gdGlsZS50aW1lQWRkZWQpIC8gZmFkZUR1cmF0aW9uO1xuICAgICAgICBjb25zdCBzaW5jZVBhcmVudCA9IHBhcmVudFRpbGUgPyAobm93IC0gcGFyZW50VGlsZS50aW1lQWRkZWQpIC8gZmFkZUR1cmF0aW9uIDogLTE7XG5cbiAgICAgICAgY29uc3Qgc291cmNlID0gc291cmNlQ2FjaGUuZ2V0U291cmNlKCk7XG4gICAgICAgIGNvbnN0IGlkZWFsWiA9IHRyYW5zZm9ybS5jb3ZlcmluZ1pvb21MZXZlbCh7XG4gICAgICAgICAgICB0aWxlU2l6ZTogc291cmNlLnRpbGVTaXplLFxuICAgICAgICAgICAgcm91bmRab29tOiBzb3VyY2Uucm91bmRab29tXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGlmIG5vIHBhcmVudCBvciBwYXJlbnQgaXMgb2xkZXIsIGZhZGUgaW47IGlmIHBhcmVudCBpcyB5b3VuZ2VyLCBmYWRlIG91dFxuICAgICAgICBjb25zdCBmYWRlSW4gPSAhcGFyZW50VGlsZSB8fCBNYXRoLmFicyhwYXJlbnRUaWxlLnRpbGVJRC5vdmVyc2NhbGVkWiAtIGlkZWFsWikgPiBNYXRoLmFicyh0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWiAtIGlkZWFsWik7XG5cbiAgICAgICAgY29uc3QgY2hpbGRPcGFjaXR5ID0gKGZhZGVJbiAmJiB0aWxlLnJlZnJlc2hlZFVwb25FeHBpcmF0aW9uKSA/IDEgOiB1dGlsLmNsYW1wKGZhZGVJbiA/IHNpbmNlVGlsZSA6IDEgLSBzaW5jZVBhcmVudCwgMCwgMSk7XG5cbiAgICAgICAgLy8gd2UgZG9uJ3QgY3Jvc3NmYWRlIHRpbGVzIHRoYXQgd2VyZSBqdXN0IHJlZnJlc2hlZCB1cG9uIGV4cGlyaW5nOlxuICAgICAgICAvLyBvbmNlIHRoZXkncmUgb2xkIGVub3VnaCB0byBwYXNzIHRoZSBjcm9zc2ZhZGluZyB0aHJlc2hvbGRcbiAgICAgICAgLy8gKGZhZGVEdXJhdGlvbiksIHVuc2V0IHRoZSBgcmVmcmVzaGVkVXBvbkV4cGlyYXRpb25gIGZsYWcgc28gd2UgZG9uJ3RcbiAgICAgICAgLy8gaW5jb3JyZWN0bHkgZmFpbCB0byBjcm9zc2ZhZGUgdGhlbSB3aGVuIHpvb21pbmdcbiAgICAgICAgaWYgKHRpbGUucmVmcmVzaGVkVXBvbkV4cGlyYXRpb24gJiYgc2luY2VUaWxlID49IDEpIHRpbGUucmVmcmVzaGVkVXBvbkV4cGlyYXRpb24gPSBmYWxzZTtcblxuICAgICAgICBpZiAocGFyZW50VGlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgICAgIG1peDogMSAtIGNoaWxkT3BhY2l0eVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogY2hpbGRPcGFjaXR5LFxuICAgICAgICAgICAgICAgIG1peDogMFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgbWl4OiAwXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwiLy8gICAgICBcblxuY29uc3QgZHJhd0NvbGxpc2lvbkRlYnVnID0gcmVxdWlyZSgnLi9kcmF3X2NvbGxpc2lvbl9kZWJ1ZycpO1xuY29uc3QgcGl4ZWxzVG9UaWxlVW5pdHMgPSByZXF1aXJlKCcuLi9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMnKTtcbmNvbnN0IHN5bWJvbFByb2plY3Rpb24gPSByZXF1aXJlKCcuLi9zeW1ib2wvcHJvamVjdGlvbicpO1xuY29uc3Qgc3ltYm9sU2l6ZSA9IHJlcXVpcmUoJy4uL3N5bWJvbC9zeW1ib2xfc2l6ZScpO1xuY29uc3QgbWF0NCA9IHJlcXVpcmUoJ0BtYXBib3gvZ2wtbWF0cml4JykubWF0NDtcbmNvbnN0IGlkZW50aXR5TWF0NCA9IG1hdDQuaWRlbnRpdHkobmV3IEZsb2F0MzJBcnJheSgxNikpO1xuY29uc3Qgc3ltYm9sTGF5b3V0UHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJykubGF5b3V0O1xuY29uc3QgU3RlbmNpbE1vZGUgPSByZXF1aXJlKCcuLi9nbC9zdGVuY2lsX21vZGUnKTtcbmNvbnN0IERlcHRoTW9kZSA9IHJlcXVpcmUoJy4uL2dsL2RlcHRoX21vZGUnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5tb2R1bGUuZXhwb3J0cyA9IGRyYXdTeW1ib2xzO1xuXG5mdW5jdGlvbiBkcmF3U3ltYm9scyhwYWludGVyICAgICAgICAgLCBzb3VyY2VDYWNoZSAgICAgICAgICAgICAsIGxheWVyICAgICAgICAgICAgICAgICAgLCBjb29yZHMgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyAhPT0gJ3RyYW5zbHVjZW50JykgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcblxuICAgIC8vIERpc2FibGUgdGhlIHN0ZW5jaWwgdGVzdCBzbyB0aGF0IGxhYmVscyBhcmVuJ3QgY2xpcHBlZCB0byB0aWxlIGJvdW5kYXJpZXMuXG4gICAgY29udGV4dC5zZXRTdGVuY2lsTW9kZShTdGVuY2lsTW9kZS5kaXNhYmxlZCk7XG4gICAgY29udGV4dC5zZXRDb2xvck1vZGUocGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCkpO1xuXG4gICAgaWYgKGxheWVyLnBhaW50LmdldCgnaWNvbi1vcGFjaXR5JykuY29uc3RhbnRPcigxKSAhPT0gMCkge1xuICAgICAgICBkcmF3TGF5ZXJTeW1ib2xzKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzLCBmYWxzZSxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LmdldCgnaWNvbi10cmFuc2xhdGUnKSxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LmdldCgnaWNvbi10cmFuc2xhdGUtYW5jaG9yJyksXG4gICAgICAgICAgICBsYXllci5sYXlvdXQuZ2V0KCdpY29uLXJvdGF0aW9uLWFsaWdubWVudCcpLFxuICAgICAgICAgICAgbGF5ZXIubGF5b3V0LmdldCgnaWNvbi1waXRjaC1hbGlnbm1lbnQnKSxcbiAgICAgICAgICAgIGxheWVyLmxheW91dC5nZXQoJ2ljb24ta2VlcC11cHJpZ2h0JylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobGF5ZXIucGFpbnQuZ2V0KCd0ZXh0LW9wYWNpdHknKS5jb25zdGFudE9yKDEpICE9PSAwKSB7XG4gICAgICAgIGRyYXdMYXllclN5bWJvbHMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIHRydWUsXG4gICAgICAgICAgICBsYXllci5wYWludC5nZXQoJ3RleHQtdHJhbnNsYXRlJyksXG4gICAgICAgICAgICBsYXllci5wYWludC5nZXQoJ3RleHQtdHJhbnNsYXRlLWFuY2hvcicpLFxuICAgICAgICAgICAgbGF5ZXIubGF5b3V0LmdldCgndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnKSxcbiAgICAgICAgICAgIGxheWVyLmxheW91dC5nZXQoJ3RleHQtcGl0Y2gtYWxpZ25tZW50JyksXG4gICAgICAgICAgICBsYXllci5sYXlvdXQuZ2V0KCd0ZXh0LWtlZXAtdXByaWdodCcpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZUNhY2hlLm1hcC5zaG93Q29sbGlzaW9uQm94ZXMpIHtcbiAgICAgICAgZHJhd0NvbGxpc2lvbkRlYnVnKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYXdMYXllclN5bWJvbHMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGlzVGV4dCwgdHJhbnNsYXRlLCB0cmFuc2xhdGVBbmNob3IsXG4gICAgcm90YXRpb25BbGlnbm1lbnQsIHBpdGNoQWxpZ25tZW50LCBrZWVwVXByaWdodCkge1xuXG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgY29uc3QgdHIgPSBwYWludGVyLnRyYW5zZm9ybTtcblxuICAgIGNvbnN0IHJvdGF0ZVdpdGhNYXAgPSByb3RhdGlvbkFsaWdubWVudCA9PT0gJ21hcCc7XG4gICAgY29uc3QgcGl0Y2hXaXRoTWFwID0gcGl0Y2hBbGlnbm1lbnQgPT09ICdtYXAnO1xuICAgIGNvbnN0IGFsb25nTGluZSA9IHJvdGF0ZVdpdGhNYXAgJiYgbGF5ZXIubGF5b3V0LmdldCgnc3ltYm9sLXBsYWNlbWVudCcpID09PSAnbGluZSc7XG4gICAgLy8gTGluZSBsYWJlbCByb3RhdGlvbiBoYXBwZW5zIGluIGB1cGRhdGVMaW5lTGFiZWxzYFxuICAgIC8vIFBpdGNoZWQgcG9pbnQgbGFiZWxzIGFyZSBhdXRvbWF0aWNhbGx5IHJvdGF0ZWQgYnkgdGhlIGxhYmVsUGxhbmVNYXRyaXggcHJvamVjdGlvblxuICAgIC8vIFVucGl0Y2hlZCBwb2ludCBsYWJlbHMgbmVlZCB0byBoYXZlIHRoZWlyIHJvdGF0aW9uIGFwcGxpZWQgYWZ0ZXIgcHJvamVjdGlvblxuICAgIGNvbnN0IHJvdGF0ZUluU2hhZGVyID0gcm90YXRlV2l0aE1hcCAmJiAhcGl0Y2hXaXRoTWFwICYmICFhbG9uZ0xpbmU7XG5cbiAgICBjb25zdCBkZXB0aE9uID0gcGl0Y2hXaXRoTWFwO1xuXG4gICAgY29udGV4dC5zZXREZXB0aE1vZGUoZGVwdGhPbiA/IHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCwgRGVwdGhNb2RlLlJlYWRPbmx5KSA6IERlcHRoTW9kZS5kaXNhYmxlZCk7XG5cbiAgICBsZXQgcHJvZ3JhbTtcblxuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgY29uc3QgYnVja2V0ICAgICAgICAgICAgICAgPSAodGlsZS5nZXRCdWNrZXQobGF5ZXIpICAgICApO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IGJ1ZmZlcnMgPSBpc1RleHQgPyBidWNrZXQudGV4dCA6IGJ1Y2tldC5pY29uO1xuICAgICAgICBpZiAoIWJ1ZmZlcnMgfHwgIWJ1ZmZlcnMuc2VnbWVudHMuZ2V0KCkubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSBidWZmZXJzLnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQobGF5ZXIuaWQpO1xuXG4gICAgICAgIGNvbnN0IGlzU0RGID0gaXNUZXh0IHx8IGJ1Y2tldC5zZGZJY29ucztcblxuICAgICAgICBjb25zdCBzaXplRGF0YSA9IGlzVGV4dCA/IGJ1Y2tldC50ZXh0U2l6ZURhdGEgOiBidWNrZXQuaWNvblNpemVEYXRhO1xuXG4gICAgICAgIGlmICghcHJvZ3JhbSkge1xuICAgICAgICAgICAgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbShpc1NERiA/ICdzeW1ib2xTREYnIDogJ3N5bWJvbEljb24nLCBwcm9ncmFtQ29uZmlndXJhdGlvbik7XG4gICAgICAgICAgICBwcm9ncmFtQ29uZmlndXJhdGlvbi5zZXRVbmlmb3JtcyhwYWludGVyLmNvbnRleHQsIHByb2dyYW0sIGxheWVyLnBhaW50LCB7em9vbTogcGFpbnRlci50cmFuc2Zvcm0uem9vbX0pO1xuXG4gICAgICAgICAgICBzZXRTeW1ib2xEcmF3U3RhdGUocHJvZ3JhbSwgcGFpbnRlciwgbGF5ZXIsIGlzVGV4dCwgcm90YXRlSW5TaGFkZXIsIHBpdGNoV2l0aE1hcCwgc2l6ZURhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgICAgIGdsLnVuaWZvcm0xaShwcm9ncmFtLnVuaWZvcm1zLnVfdGV4dHVyZSwgMCk7XG5cbiAgICAgICAgaWYgKGlzVGV4dCkge1xuICAgICAgICAgICAgdGlsZS5nbHlwaEF0bGFzVGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICBnbC51bmlmb3JtMmZ2KHByb2dyYW0udW5pZm9ybXMudV90ZXhzaXplLCB0aWxlLmdseXBoQXRsYXNUZXh0dXJlLnNpemUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaWNvblNjYWxlZCA9IGxheWVyLmxheW91dC5nZXQoJ2ljb24tc2l6ZScpLmNvbnN0YW50T3IoMCkgIT09IDEgfHwgYnVja2V0Lmljb25zTmVlZExpbmVhcjtcbiAgICAgICAgICAgIGNvbnN0IGljb25UcmFuc2Zvcm1lZCA9IHBpdGNoV2l0aE1hcCB8fCB0ci5waXRjaCAhPT0gMDtcblxuICAgICAgICAgICAgdGlsZS5pY29uQXRsYXNUZXh0dXJlLmJpbmQoaXNTREYgfHwgcGFpbnRlci5vcHRpb25zLnJvdGF0aW5nIHx8IHBhaW50ZXIub3B0aW9ucy56b29taW5nIHx8IGljb25TY2FsZWQgfHwgaWNvblRyYW5zZm9ybWVkID9cbiAgICAgICAgICAgICAgICBnbC5MSU5FQVIgOiBnbC5ORUFSRVNULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIGdsLnVuaWZvcm0yZnYocHJvZ3JhbS51bmlmb3Jtcy51X3RleHNpemUsIHRpbGUuaWNvbkF0bGFzVGV4dHVyZS5zaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS51bmlmb3Jtcy51X21hdHJpeCwgZmFsc2UsIHBhaW50ZXIudHJhbnNsYXRlUG9zTWF0cml4KGNvb3JkLnBvc01hdHJpeCwgdGlsZSwgdHJhbnNsYXRlLCB0cmFuc2xhdGVBbmNob3IpKTtcblxuICAgICAgICBjb25zdCBzID0gcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgMSwgcGFpbnRlci50cmFuc2Zvcm0uem9vbSk7XG4gICAgICAgIGNvbnN0IGxhYmVsUGxhbmVNYXRyaXggPSBzeW1ib2xQcm9qZWN0aW9uLmdldExhYmVsUGxhbmVNYXRyaXgoY29vcmQucG9zTWF0cml4LCBwaXRjaFdpdGhNYXAsIHJvdGF0ZVdpdGhNYXAsIHBhaW50ZXIudHJhbnNmb3JtLCBzKTtcbiAgICAgICAgY29uc3QgZ2xDb29yZE1hdHJpeCA9IHN5bWJvbFByb2plY3Rpb24uZ2V0R2xDb29yZE1hdHJpeChjb29yZC5wb3NNYXRyaXgsIHBpdGNoV2l0aE1hcCwgcm90YXRlV2l0aE1hcCwgcGFpbnRlci50cmFuc2Zvcm0sIHMpO1xuICAgICAgICBnbC51bmlmb3JtTWF0cml4NGZ2KHByb2dyYW0udW5pZm9ybXMudV9nbF9jb29yZF9tYXRyaXgsIGZhbHNlLCBwYWludGVyLnRyYW5zbGF0ZVBvc01hdHJpeChnbENvb3JkTWF0cml4LCB0aWxlLCB0cmFuc2xhdGUsIHRyYW5zbGF0ZUFuY2hvciwgdHJ1ZSkpO1xuXG4gICAgICAgIGlmIChhbG9uZ0xpbmUpIHtcbiAgICAgICAgICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS51bmlmb3Jtcy51X2xhYmVsX3BsYW5lX21hdHJpeCwgZmFsc2UsIGlkZW50aXR5TWF0NCk7XG4gICAgICAgICAgICBzeW1ib2xQcm9qZWN0aW9uLnVwZGF0ZUxpbmVMYWJlbHMoYnVja2V0LCBjb29yZC5wb3NNYXRyaXgsIHBhaW50ZXIsIGlzVGV4dCwgbGFiZWxQbGFuZU1hdHJpeCwgZ2xDb29yZE1hdHJpeCwgcGl0Y2hXaXRoTWFwLCBrZWVwVXByaWdodCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbC51bmlmb3JtTWF0cml4NGZ2KHByb2dyYW0udW5pZm9ybXMudV9sYWJlbF9wbGFuZV9tYXRyaXgsIGZhbHNlLCBsYWJlbFBsYW5lTWF0cml4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVuaWZvcm1zLnVfZmFkZV9jaGFuZ2UsIHBhaW50ZXIub3B0aW9ucy5mYWRlRHVyYXRpb24gPyBwYWludGVyLnN5bWJvbEZhZGVDaGFuZ2UgOiAxKTtcblxuICAgICAgICBkcmF3VGlsZVN5bWJvbHMocHJvZ3JhbSwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24sIHBhaW50ZXIsIGxheWVyLCB0aWxlLCBidWZmZXJzLCBpc1RleHQsIGlzU0RGLCBwaXRjaFdpdGhNYXApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2V0U3ltYm9sRHJhd1N0YXRlKHByb2dyYW0sIHBhaW50ZXIsIGxheWVyLCBpc1RleHQsIHJvdGF0ZUluU2hhZGVyLCBwaXRjaFdpdGhNYXAsIHNpemVEYXRhKSB7XG5cbiAgICBjb25zdCBnbCA9IHBhaW50ZXIuY29udGV4dC5nbDtcbiAgICBjb25zdCB0ciA9IHBhaW50ZXIudHJhbnNmb3JtO1xuXG4gICAgZ2wudW5pZm9ybTFpKHByb2dyYW0udW5pZm9ybXMudV9waXRjaF93aXRoX21hcCwgcGl0Y2hXaXRoTWFwID8gMSA6IDApO1xuXG4gICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udW5pZm9ybXMudV9pc190ZXh0LCBpc1RleHQgPyAxIDogMCk7XG5cbiAgICBnbC51bmlmb3JtMWYocHJvZ3JhbS51bmlmb3Jtcy51X3BpdGNoLCB0ci5waXRjaCAvIDM2MCAqIDIgKiBNYXRoLlBJKTtcblxuICAgIGNvbnN0IGlzWm9vbUNvbnN0YW50ID0gc2l6ZURhdGEuZnVuY3Rpb25UeXBlID09PSAnY29uc3RhbnQnIHx8IHNpemVEYXRhLmZ1bmN0aW9uVHlwZSA9PT0gJ3NvdXJjZSc7XG4gICAgY29uc3QgaXNGZWF0dXJlQ29uc3RhbnQgPSBzaXplRGF0YS5mdW5jdGlvblR5cGUgPT09ICdjb25zdGFudCcgfHwgc2l6ZURhdGEuZnVuY3Rpb25UeXBlID09PSAnY2FtZXJhJztcbiAgICBnbC51bmlmb3JtMWkocHJvZ3JhbS51bmlmb3Jtcy51X2lzX3NpemVfem9vbV9jb25zdGFudCwgaXNab29tQ29uc3RhbnQgPyAxIDogMCk7XG4gICAgZ2wudW5pZm9ybTFpKHByb2dyYW0udW5pZm9ybXMudV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQsIGlzRmVhdHVyZUNvbnN0YW50ID8gMSA6IDApO1xuXG4gICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udW5pZm9ybXMudV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlLCB0ci5jYW1lcmFUb0NlbnRlckRpc3RhbmNlKTtcblxuICAgIGNvbnN0IHNpemUgPSBzeW1ib2xTaXplLmV2YWx1YXRlU2l6ZUZvclpvb20oc2l6ZURhdGEsIHRyLnpvb20sIHN5bWJvbExheW91dFByb3BlcnRpZXMucHJvcGVydGllc1tpc1RleHQgPyAndGV4dC1zaXplJyA6ICdpY29uLXNpemUnXSk7XG4gICAgaWYgKHNpemUudVNpemVUICE9PSB1bmRlZmluZWQpIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVuaWZvcm1zLnVfc2l6ZV90LCBzaXplLnVTaXplVCk7XG4gICAgaWYgKHNpemUudVNpemUgIT09IHVuZGVmaW5lZCkgZ2wudW5pZm9ybTFmKHByb2dyYW0udW5pZm9ybXMudV9zaXplLCBzaXplLnVTaXplKTtcblxuICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVuaWZvcm1zLnVfYXNwZWN0X3JhdGlvLCB0ci53aWR0aCAvIHRyLmhlaWdodCk7XG4gICAgZ2wudW5pZm9ybTFpKHByb2dyYW0udW5pZm9ybXMudV9yb3RhdGVfc3ltYm9sLCByb3RhdGVJblNoYWRlciA/IDEgOiAwKTtcbn1cblxuZnVuY3Rpb24gZHJhd1RpbGVTeW1ib2xzKHByb2dyYW0sIHByb2dyYW1Db25maWd1cmF0aW9uLCBwYWludGVyLCBsYXllciwgdGlsZSwgYnVmZmVycywgaXNUZXh0LCBpc1NERiwgcGl0Y2hXaXRoTWFwKSB7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCB0ciA9IHBhaW50ZXIudHJhbnNmb3JtO1xuXG4gICAgaWYgKGlzU0RGKSB7XG4gICAgICAgIGNvbnN0IGhhc0hhbG8gPSBsYXllci5wYWludC5nZXQoaXNUZXh0ID8gJ3RleHQtaGFsby13aWR0aCcgOiAnaWNvbi1oYWxvLXdpZHRoJykuY29uc3RhbnRPcigxKSAhPT0gMDtcbiAgICAgICAgY29uc3QgZ2FtbWFTY2FsZSA9IChwaXRjaFdpdGhNYXAgPyBNYXRoLmNvcyh0ci5fcGl0Y2gpICogdHIuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSA6IDEpO1xuICAgICAgICBnbC51bmlmb3JtMWYocHJvZ3JhbS51bmlmb3Jtcy51X2dhbW1hX3NjYWxlLCBnYW1tYVNjYWxlKTtcblxuICAgICAgICBpZiAoaGFzSGFsbykgeyAvLyBEcmF3IGhhbG8gdW5kZXJuZWF0aCB0aGUgdGV4dC5cbiAgICAgICAgICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVuaWZvcm1zLnVfaXNfaGFsbywgMSk7XG4gICAgICAgICAgICBkcmF3U3ltYm9sRWxlbWVudHMoYnVmZmVycywgbGF5ZXIsIGNvbnRleHQsIHByb2dyYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udW5pZm9ybXMudV9pc19oYWxvLCAwKTtcbiAgICB9XG5cbiAgICBkcmF3U3ltYm9sRWxlbWVudHMoYnVmZmVycywgbGF5ZXIsIGNvbnRleHQsIHByb2dyYW0pO1xufVxuXG5mdW5jdGlvbiBkcmF3U3ltYm9sRWxlbWVudHMoYnVmZmVycywgbGF5ZXIsIGNvbnRleHQsIHByb2dyYW0pIHtcbiAgICBwcm9ncmFtLmRyYXcoXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNvbnRleHQuZ2wuVFJJQU5HTEVTLFxuICAgICAgICBsYXllci5pZCxcbiAgICAgICAgYnVmZmVycy5sYXlvdXRWZXJ0ZXhCdWZmZXIsXG4gICAgICAgIGJ1ZmZlcnMuaW5kZXhCdWZmZXIsXG4gICAgICAgIGJ1ZmZlcnMuc2VnbWVudHMsXG4gICAgICAgIGJ1ZmZlcnMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChsYXllci5pZCksXG4gICAgICAgIGJ1ZmZlcnMuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlcixcbiAgICAgICAgYnVmZmVycy5vcGFjaXR5VmVydGV4QnVmZmVyKTtcbn1cbiIsIi8vICAgICAgXG5cbmNvbnN0IFNoZWxmUGFjayA9IHJlcXVpcmUoJ0BtYXBib3gvc2hlbGYtcGFjaycpO1xuY29uc3Qge0FscGhhSW1hZ2V9ID0gcmVxdWlyZSgnLi4vdXRpbC9pbWFnZScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNvbnN0IHBhZGRpbmcgPSAxO1xuXG4gICAgICAgICAgICAgXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgXG4gIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBcblxuZnVuY3Rpb24gbWFrZUdseXBoQXRsYXMoc3RhY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAge1xuICAgIGNvbnN0IGltYWdlID0gbmV3IEFscGhhSW1hZ2Uoe3dpZHRoOiAwLCBoZWlnaHQ6IDB9KTtcbiAgICBjb25zdCBwb3NpdGlvbnMgPSB7fTtcblxuICAgIGNvbnN0IHBhY2sgPSBuZXcgU2hlbGZQYWNrKDAsIDAsIHthdXRvUmVzaXplOiB0cnVlfSk7XG5cbiAgICBmb3IgKGNvbnN0IHN0YWNrIGluIHN0YWNrcykge1xuICAgICAgICBjb25zdCBnbHlwaHMgPSBzdGFja3Nbc3RhY2tdO1xuICAgICAgICBjb25zdCBzdGFja1Bvc2l0aW9ucyA9IHBvc2l0aW9uc1tzdGFja10gPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGdseXBocykge1xuICAgICAgICAgICAgY29uc3Qgc3JjID0gZ2x5cGhzWytpZF07XG4gICAgICAgICAgICBpZiAoc3JjICYmIHNyYy5iaXRtYXAud2lkdGggIT09IDAgJiYgc3JjLmJpdG1hcC5oZWlnaHQgIT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiaW4gPSBwYWNrLnBhY2tPbmUoXG4gICAgICAgICAgICAgICAgICAgIHNyYy5iaXRtYXAud2lkdGggKyAyICogcGFkZGluZyxcbiAgICAgICAgICAgICAgICAgICAgc3JjLmJpdG1hcC5oZWlnaHQgKyAyICogcGFkZGluZyk7XG5cbiAgICAgICAgICAgICAgICBpbWFnZS5yZXNpemUoe1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogcGFjay53LFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHBhY2suaFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgQWxwaGFJbWFnZS5jb3B5KFxuICAgICAgICAgICAgICAgICAgICBzcmMuYml0bWFwLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZSxcbiAgICAgICAgICAgICAgICAgICAgeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IGJpbi54ICsgcGFkZGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IGJpbi55ICsgcGFkZGluZ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzcmMuYml0bWFwKTtcblxuICAgICAgICAgICAgICAgIHN0YWNrUG9zaXRpb25zW2lkXSA9IHsgcmVjdDogYmluLCBtZXRyaWNzOiBzcmMubWV0cmljcyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGFjay5zaHJpbmsoKTtcbiAgICBpbWFnZS5yZXNpemUoe1xuICAgICAgICB3aWR0aDogcGFjay53LFxuICAgICAgICBoZWlnaHQ6IHBhY2suaFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtpbWFnZSwgcG9zaXRpb25zfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbWFrZUdseXBoQXRsYXNcbn07XG4iLCIvLyAgICAgIFxuXG5jb25zdCBsb2FkR2x5cGhSYW5nZSA9IHJlcXVpcmUoJy4uL3N0eWxlL2xvYWRfZ2x5cGhfcmFuZ2UnKTtcbmNvbnN0IFRpbnlTREYgPSByZXF1aXJlKCdAbWFwYm94L3Rpbnktc2RmJyk7XG5jb25zdCBpc0NoYXIgPSByZXF1aXJlKCcuLi91dGlsL2lzX2NoYXJfaW5fdW5pY29kZV9ibG9jaycpO1xuY29uc3Qge2FzeW5jQWxsfSA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuY29uc3Qge0FscGhhSW1hZ2V9ID0gcmVxdWlyZSgnLi4vdXRpbC9pbWFnZScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgXG5cbmNsYXNzIEdseXBoTWFuYWdlciB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihyZXF1ZXN0VHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAsIGxvY2FsSWRlb2dyYXBoRm9udEZhbWlseSAgICAgICAgICkge1xuICAgICAgICB0aGlzLnJlcXVlc3RUcmFuc2Zvcm0gPSByZXF1ZXN0VHJhbnNmb3JtO1xuICAgICAgICB0aGlzLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseSA9IGxvY2FsSWRlb2dyYXBoRm9udEZhbWlseTtcbiAgICAgICAgdGhpcy5lbnRyaWVzID0ge307XG4gICAgfVxuXG4gICAgc2V0VVJMKHVybCAgICAgICAgICkge1xuICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICB9XG5cbiAgICBnZXRHbHlwaHMoZ2x5cGhzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGFsbCA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3RhY2sgaW4gZ2x5cGhzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGdseXBoc1tzdGFja10pIHtcbiAgICAgICAgICAgICAgICBhbGwucHVzaCh7c3RhY2ssIGlkfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhc3luY0FsbChhbGwsICh7c3RhY2ssIGlkfSwgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5lbnRyaWVzW3N0YWNrXTtcbiAgICAgICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgICAgICBlbnRyeSA9IHRoaXMuZW50cmllc1tzdGFja10gPSB7XG4gICAgICAgICAgICAgICAgICAgIGdseXBoczoge30sXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzOiB7fVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBnbHlwaCA9IGVudHJ5LmdseXBoc1tpZF07XG4gICAgICAgICAgICBpZiAoZ2x5cGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtzdGFjaywgaWQsIGdseXBofSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnbHlwaCA9IHRoaXMuX3RpbnlTREYoZW50cnksIHN0YWNrLCBpZCk7XG4gICAgICAgICAgICBpZiAoZ2x5cGgpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7c3RhY2ssIGlkLCBnbHlwaH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBNYXRoLmZsb29yKGlkIC8gMjU2KTtcbiAgICAgICAgICAgIGlmIChyYW5nZSAqIDI1NiA+IDY1NTM1KSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKCdnbHlwaHMgPiA2NTUzNSBub3Qgc3VwcG9ydGVkJykpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHJlcXVlc3RzID0gZW50cnkucmVxdWVzdHNbcmFuZ2VdO1xuICAgICAgICAgICAgaWYgKCFyZXF1ZXN0cykge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RzID0gZW50cnkucmVxdWVzdHNbcmFuZ2VdID0gW107XG4gICAgICAgICAgICAgICAgbG9hZEdseXBoUmFuZ2Uoc3RhY2ssIHJhbmdlLCAodGhpcy51cmwgICAgICksIHRoaXMucmVxdWVzdFRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgKGVyciwgcmVzcG9uc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nbHlwaHNbK2lkXSA9IHJlc3BvbnNlWytpZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjYiBvZiByZXF1ZXN0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiKGVyciwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGVudHJ5LnJlcXVlc3RzW3JhbmdlXTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlcXVlc3RzLnB1c2goKGVyciwgcmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwge3N0YWNrLCBpZCwgZ2x5cGg6IHJlc3VsdFtpZF0gfHwgbnVsbH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCAoZXJyLCBnbHlwaHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChnbHlwaHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qge3N0YWNrLCBpZCwgZ2x5cGh9IG9mIGdseXBocykge1xuICAgICAgICAgICAgICAgICAgICAvLyBDbG9uZSB0aGUgZ2x5cGggc28gdGhhdCBvdXIgb3duIGNvcHkgb2YgaXRzIEFycmF5QnVmZmVyIGRvZXNuJ3QgZ2V0IHRyYW5zZmVycmVkLlxuICAgICAgICAgICAgICAgICAgICAocmVzdWx0W3N0YWNrXSB8fCAocmVzdWx0W3N0YWNrXSA9IHt9KSlbaWRdID0gZ2x5cGggJiYge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGdseXBoLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwOiBnbHlwaC5iaXRtYXAuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3M6IGdseXBoLm1ldHJpY3NcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfdGlueVNERihlbnRyeSAgICAgICAsIHN0YWNrICAgICAgICAsIGlkICAgICAgICApICAgICAgICAgICAgICB7XG4gICAgICAgIGNvbnN0IGZhbWlseSA9IHRoaXMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5O1xuICAgICAgICBpZiAoIWZhbWlseSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0NoYXJbJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMnXShpZCkgJiYgIWlzQ2hhclsnSGFuZ3VsIFN5bGxhYmxlcyddKGlkKSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXBcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0aW55U0RGID0gZW50cnkudGlueVNERjtcbiAgICAgICAgaWYgKCF0aW55U0RGKSB7XG4gICAgICAgICAgICBsZXQgZm9udFdlaWdodCA9ICc0MDAnO1xuICAgICAgICAgICAgaWYgKC9ib2xkL2kudGVzdChzdGFjaykpIHtcbiAgICAgICAgICAgICAgICBmb250V2VpZ2h0ID0gJzkwMCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9tZWRpdW0vaS50ZXN0KHN0YWNrKSkge1xuICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQgPSAnNTAwJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoL2xpZ2h0L2kudGVzdChzdGFjaykpIHtcbiAgICAgICAgICAgICAgICBmb250V2VpZ2h0ID0gJzIwMCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aW55U0RGID0gZW50cnkudGlueVNERiA9IG5ldyBUaW55U0RGKDI0LCAzLCA4LCAuMjUsIGZhbWlseSwgZm9udFdlaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBiaXRtYXA6IG5ldyBBbHBoYUltYWdlKHt3aWR0aDogMzAsIGhlaWdodDogMzB9LCB0aW55U0RGLmRyYXcoU3RyaW5nLmZyb21DaGFyQ29kZShpZCkpKSxcbiAgICAgICAgICAgIG1ldHJpY3M6IHtcbiAgICAgICAgICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAyNCxcbiAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgIHRvcDogLTgsXG4gICAgICAgICAgICAgICAgYWR2YW5jZTogMjRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gR2x5cGhNYW5hZ2VyO1xuIiwiLy8gICAgICBcblxuY29uc3QgU2hlbGZQYWNrID0gcmVxdWlyZSgnQG1hcGJveC9zaGVsZi1wYWNrJyk7XG5jb25zdCB7UkdCQUltYWdlfSA9IHJlcXVpcmUoJy4uL3V0aWwvaW1hZ2UnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuY29uc3QgcGFkZGluZyA9IDE7XG5cbiAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICBcbiAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIFxuXG4vLyBUaGlzIHdhbnRzIHRvIGJlIGEgY2xhc3MsIGJ1dCBpcyBzZW50IHRvIHdvcmtlcnMsIHNvIG11c3QgYmUgYSBwbGFpbiBKU09OIGJsb2IuXG5mdW5jdGlvbiBpbWFnZVBvc2l0aW9uKHJlY3QgICAgICAsIHtwaXhlbFJhdGlvfSAgICAgICAgICAgICkgICAgICAgICAgICAgICAge1xuICAgIGNvbnN0IHRleHR1cmVSZWN0ID0ge1xuICAgICAgICB4OiByZWN0LnggKyBwYWRkaW5nLFxuICAgICAgICB5OiByZWN0LnkgKyBwYWRkaW5nLFxuICAgICAgICB3OiByZWN0LncgLSBwYWRkaW5nICogMixcbiAgICAgICAgaDogcmVjdC5oIC0gcGFkZGluZyAqIDJcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIHBpeGVsUmF0aW8sXG4gICAgICAgIHRleHR1cmVSZWN0LFxuXG4gICAgICAgIC8vIFJlZHVuZGFudCBjYWxjdWxhdGVkIG1lbWJlcnMuXG4gICAgICAgIHRsOiBbXG4gICAgICAgICAgICB0ZXh0dXJlUmVjdC54LFxuICAgICAgICAgICAgdGV4dHVyZVJlY3QueVxuICAgICAgICBdLFxuICAgICAgICBicjogW1xuICAgICAgICAgICAgdGV4dHVyZVJlY3QueCArIHRleHR1cmVSZWN0LncsXG4gICAgICAgICAgICB0ZXh0dXJlUmVjdC55ICsgdGV4dHVyZVJlY3QuaFxuICAgICAgICBdLFxuICAgICAgICBkaXNwbGF5U2l6ZTogW1xuICAgICAgICAgICAgdGV4dHVyZVJlY3QudyAvIHBpeGVsUmF0aW8sXG4gICAgICAgICAgICB0ZXh0dXJlUmVjdC5oIC8gcGl4ZWxSYXRpb1xuICAgICAgICBdXG4gICAgfTtcbn1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBcblxuZnVuY3Rpb24gbWFrZUltYWdlQXRsYXMoaW1hZ2VzICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICB7XG4gICAgY29uc3QgaW1hZ2UgPSBuZXcgUkdCQUltYWdlKHt3aWR0aDogMCwgaGVpZ2h0OiAwfSk7XG4gICAgY29uc3QgcG9zaXRpb25zID0ge307XG5cbiAgICBjb25zdCBwYWNrID0gbmV3IFNoZWxmUGFjaygwLCAwLCB7YXV0b1Jlc2l6ZTogdHJ1ZX0pO1xuXG4gICAgZm9yIChjb25zdCBpZCBpbiBpbWFnZXMpIHtcbiAgICAgICAgY29uc3Qgc3JjID0gaW1hZ2VzW2lkXTtcblxuICAgICAgICBjb25zdCBiaW4gPSBwYWNrLnBhY2tPbmUoXG4gICAgICAgICAgICBzcmMuZGF0YS53aWR0aCArIDIgKiBwYWRkaW5nLFxuICAgICAgICAgICAgc3JjLmRhdGEuaGVpZ2h0ICsgMiAqIHBhZGRpbmcpO1xuXG4gICAgICAgIGltYWdlLnJlc2l6ZSh7XG4gICAgICAgICAgICB3aWR0aDogcGFjay53LFxuICAgICAgICAgICAgaGVpZ2h0OiBwYWNrLmhcbiAgICAgICAgfSk7XG5cbiAgICAgICAgUkdCQUltYWdlLmNvcHkoXG4gICAgICAgICAgICBzcmMuZGF0YSxcbiAgICAgICAgICAgIGltYWdlLFxuICAgICAgICAgICAgeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgeDogYmluLnggKyBwYWRkaW5nLFxuICAgICAgICAgICAgICAgIHk6IGJpbi55ICsgcGFkZGluZ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNyYy5kYXRhKTtcblxuICAgICAgICBwb3NpdGlvbnNbaWRdID0gaW1hZ2VQb3NpdGlvbihiaW4sIHNyYyk7XG4gICAgfVxuXG4gICAgcGFjay5zaHJpbmsoKTtcbiAgICBpbWFnZS5yZXNpemUoe1xuICAgICAgICB3aWR0aDogcGFjay53LFxuICAgICAgICBoZWlnaHQ6IHBhY2suaFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtpbWFnZSwgcG9zaXRpb25zfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgaW1hZ2VQb3NpdGlvbixcbiAgICBtYWtlSW1hZ2VBdGxhc1xufTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IFNoZWxmUGFjayA9IHJlcXVpcmUoJ0BtYXBib3gvc2hlbGYtcGFjaycpO1xuY29uc3Qge1JHQkFJbWFnZX0gPSByZXF1aXJlKCcuLi91dGlsL2ltYWdlJyk7XG5jb25zdCB7aW1hZ2VQb3NpdGlvbn0gPSByZXF1aXJlKCcuL2ltYWdlX2F0bGFzJyk7XG5jb25zdCBUZXh0dXJlID0gcmVxdWlyZSgnLi90ZXh0dXJlJyk7XG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBcblxuLy8gV2hlbiBjb3BpZWQgaW50byB0aGUgYXRsYXMgdGV4dHVyZSwgaW1hZ2UgZGF0YSBpcyBwYWRkZWQgYnkgb25lIHBpeGVsIG9uIGVhY2ggc2lkZS4gSWNvblxuLy8gaW1hZ2VzIGFyZSBwYWRkZWQgd2l0aCBmdWxseSB0cmFuc3BhcmVudCBwaXhlbHMsIHdoaWxlIHBhdHRlcm4gaW1hZ2VzIGFyZSBwYWRkZWQgd2l0aCBhXG4vLyBjb3B5IG9mIHRoZSBpbWFnZSBkYXRhIHdyYXBwZWQgZnJvbSB0aGUgb3Bwb3NpdGUgc2lkZS4gSW4gYm90aCBjYXNlcywgdGhpcyBlbnN1cmVzIHRoZVxuLy8gY29ycmVjdCBiZWhhdmlvciBvZiBHTF9MSU5FQVIgdGV4dHVyZSBzYW1wbGluZyBtb2RlLlxuY29uc3QgcGFkZGluZyA9IDE7XG5cbi8qXG4gICAgSW1hZ2VNYW5hZ2VyIGRvZXMgdHdvIHRoaW5nczpcblxuICAgICAgICAxLiBUcmFja3MgcmVxdWVzdHMgZm9yIGljb24gaW1hZ2VzIGZyb20gdGlsZSB3b3JrZXJzIGFuZCBzZW5kcyByZXNwb25zZXMgd2hlbiB0aGUgcmVxdWVzdHMgYXJlIGZ1bGZpbGxlZC5cbiAgICAgICAgMi4gQnVpbGRzIGEgdGV4dHVyZSBhdGxhcyBmb3IgcGF0dGVybiBpbWFnZXMuXG5cbiAgICBUaGVzZSBhcmUgZGlzcGFyYXRlIHJlc3BvbnNpYmlsaXRpZXMgYW5kIHNob3VsZCBldmVudHVhbGx5IGJlIGhhbmRsZWQgYnkgZGlmZmVyZW50IGNsYXNzZXMuIFdoZW4gd2UgaW1wbGVtZW50XG4gICAgZGF0YS1kcml2ZW4gc3VwcG9ydCBmb3IgYCotcGF0dGVybmAsIHdlJ2xsIGxpa2VseSB1c2UgcGVyLWJ1Y2tldCBwYXR0ZXJuIGF0bGFzZXMsIGFuZCB0aGF0IHdvdWxkIGJlIGEgZ29vZCB0aW1lXG4gICAgdG8gcmVmYWN0b3IgdGhpcy5cbiovXG5jbGFzcyBJbWFnZU1hbmFnZXIge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmltYWdlcyA9IHt9O1xuICAgICAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlcXVlc3RvcnMgPSBbXTtcblxuICAgICAgICB0aGlzLnNoZWxmUGFjayA9IG5ldyBTaGVsZlBhY2soNjQsIDY0LCB7YXV0b1Jlc2l6ZTogdHJ1ZX0pO1xuICAgICAgICB0aGlzLnBhdHRlcm5zID0ge307XG4gICAgICAgIHRoaXMuYXRsYXNJbWFnZSA9IG5ldyBSR0JBSW1hZ2Uoe3dpZHRoOiA2NCwgaGVpZ2h0OiA2NH0pO1xuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpc0xvYWRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVkO1xuICAgIH1cblxuICAgIHNldExvYWRlZChsb2FkZWQgICAgICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMubG9hZGVkID09PSBsb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZGVkID0gbG9hZGVkO1xuXG4gICAgICAgIGlmIChsb2FkZWQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qge2lkcywgY2FsbGJhY2t9IG9mIHRoaXMucmVxdWVzdG9ycykge1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmeShpZHMsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVxdWVzdG9ycyA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0SW1hZ2UoaWQgICAgICAgICkgICAgICAgICAgICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VzW2lkXTtcbiAgICB9XG5cbiAgICBhZGRJbWFnZShpZCAgICAgICAgLCBpbWFnZSAgICAgICAgICAgICkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuaW1hZ2VzW2lkXSk7XG4gICAgICAgIHRoaXMuaW1hZ2VzW2lkXSA9IGltYWdlO1xuICAgIH1cblxuICAgIHJlbW92ZUltYWdlKGlkICAgICAgICApIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuaW1hZ2VzW2lkXSk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmltYWdlc1tpZF07XG5cbiAgICAgICAgY29uc3QgcGF0dGVybiA9IHRoaXMucGF0dGVybnNbaWRdO1xuICAgICAgICBpZiAocGF0dGVybikge1xuICAgICAgICAgICAgdGhpcy5zaGVsZlBhY2sudW5yZWYocGF0dGVybi5iaW4pO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucGF0dGVybnNbaWRdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0SW1hZ2VzKGlkcyAgICAgICAgICAgICAgICwgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIC8vIElmIHRoZSBzcHJpdGUgaGFzIGJlZW4gbG9hZGVkLCBvciBpZiBhbGwgdGhlIGljb24gZGVwZW5kZW5jaWVzIGFyZSBhbHJlYWR5IHByZXNlbnRcbiAgICAgICAgLy8gKGkuZS4gaWYgdGhleSd2ZSBiZWVuIGFkZGVkZWQgdmlhIHJ1bnRpbWUgc3R5bGluZyksIHRoZW4gbm90aWZ5IHRoZSByZXF1ZXN0b3IgaW1tZWRpYXRlbHkuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgZGVsYXkgbm90aWZpY2F0aW9uIHVudGlsIHRoZSBzcHJpdGUgaXMgbG9hZGVkLiBBdCB0aGF0IHBvaW50LCBpZiBhbnkgb2YgdGhlXG4gICAgICAgIC8vIGRlcGVuZGVuY2llcyBhcmUgc3RpbGwgdW5hdmFpbGFibGUsIHdlJ2xsIGp1c3QgYXNzdW1lIHRoZXkgYXJlIHBlcm1hbmVudGx5IG1pc3NpbmcuXG4gICAgICAgIGxldCBoYXNBbGxEZXBlbmRlbmNpZXMgPSB0cnVlO1xuICAgICAgICBpZiAoIXRoaXMuaXNMb2FkZWQoKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW1hZ2VzW2lkXSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNBbGxEZXBlbmRlbmNpZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNMb2FkZWQoKSB8fCBoYXNBbGxEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeShpZHMsIGNhbGxiYWNrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdG9ycy5wdXNoKHtpZHMsIGNhbGxiYWNrfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfbm90aWZ5KGlkcyAgICAgICAgICAgICAgICwgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5pbWFnZXNbaWRdO1xuICAgICAgICAgICAgaWYgKGltYWdlKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xvbmUgdGhlIGltYWdlIHNvIHRoYXQgb3VyIG93biBjb3B5IG9mIGl0cyBBcnJheUJ1ZmZlciBkb2Vzbid0IGdldCB0cmFuc2ZlcnJlZC5cbiAgICAgICAgICAgICAgICByZXNwb25zZVtpZF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGltYWdlLmRhdGEuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgcGl4ZWxSYXRpbzogaW1hZ2UucGl4ZWxSYXRpbyxcbiAgICAgICAgICAgICAgICAgICAgc2RmOiBpbWFnZS5zZGZcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UpO1xuICAgIH1cblxuICAgIC8vIFBhdHRlcm4gc3R1ZmZcblxuICAgIGdldFBpeGVsU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLnNoZWxmUGFjay53LFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnNoZWxmUGFjay5oXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0UGF0dGVybihpZCAgICAgICAgKSAgICAgICAgICAgICAgICAge1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5wYXR0ZXJuc1tpZF07XG4gICAgICAgIGlmIChwYXR0ZXJuKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0dGVybi5wb3NpdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5nZXRJbWFnZShpZCk7XG4gICAgICAgIGlmICghaW1hZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgd2lkdGggPSBpbWFnZS5kYXRhLndpZHRoICsgcGFkZGluZyAqIDI7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IGltYWdlLmRhdGEuaGVpZ2h0ICsgcGFkZGluZyAqIDI7XG5cbiAgICAgICAgY29uc3QgYmluID0gdGhpcy5zaGVsZlBhY2sucGFja09uZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgaWYgKCFiaW4pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hdGxhc0ltYWdlLnJlc2l6ZSh0aGlzLmdldFBpeGVsU2l6ZSgpKTtcblxuICAgICAgICBjb25zdCBzcmMgPSBpbWFnZS5kYXRhO1xuICAgICAgICBjb25zdCBkc3QgPSB0aGlzLmF0bGFzSW1hZ2U7XG5cbiAgICAgICAgY29uc3QgeCA9IGJpbi54ICsgcGFkZGluZztcbiAgICAgICAgY29uc3QgeSA9IGJpbi55ICsgcGFkZGluZztcbiAgICAgICAgY29uc3QgdyA9IHNyYy53aWR0aDtcbiAgICAgICAgY29uc3QgaCA9IHNyYy5oZWlnaHQ7XG5cbiAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLCBkc3QsIHsgeDogMCwgeTogMCB9LCB7IHgsIHkgfSwgeyB3aWR0aDogdywgaGVpZ2h0OiBoIH0pO1xuXG4gICAgICAgIC8vIEFkZCAxIHBpeGVsIHdyYXBwZWQgcGFkZGluZyBvbiBlYWNoIHNpZGUgb2YgdGhlIGltYWdlLlxuICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMsIGRzdCwgeyB4OiAwLCB5OiBoIC0gMSB9LCB7IHg6IHgsIHk6IHkgLSAxIH0sIHsgd2lkdGg6IHcsIGhlaWdodDogMSB9KTsgLy8gVFxuICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMsIGRzdCwgeyB4OiAwLCB5OiAgICAgMCB9LCB7IHg6IHgsIHk6IHkgKyBoIH0sIHsgd2lkdGg6IHcsIGhlaWdodDogMSB9KTsgLy8gQlxuICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMsIGRzdCwgeyB4OiB3IC0gMSwgeTogMCB9LCB7IHg6IHggLSAxLCB5OiB5IH0sIHsgd2lkdGg6IDEsIGhlaWdodDogaCB9KTsgLy8gTFxuICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMsIGRzdCwgeyB4OiAwLCAgICAgeTogMCB9LCB7IHg6IHggKyB3LCB5OiB5IH0sIHsgd2lkdGg6IDEsIGhlaWdodDogaCB9KTsgLy8gUlxuXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gaW1hZ2VQb3NpdGlvbihiaW4sIGltYWdlKTtcbiAgICAgICAgdGhpcy5wYXR0ZXJuc1tpZF0gPSB7IGJpbiwgcG9zaXRpb24gfTtcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH1cblxuICAgIGJpbmQoY29udGV4dCAgICAgICAgICkge1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIGlmICghdGhpcy5hdGxhc1RleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuYXRsYXNUZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgdGhpcy5hdGxhc0ltYWdlLCBnbC5SR0JBKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLmF0bGFzVGV4dHVyZS51cGRhdGUodGhpcy5hdGxhc0ltYWdlKTtcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXRsYXNUZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gSW1hZ2VNYW5hZ2VyO1xuIiwiLy8gICAgICBcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4vKipcbiAqIEEgTGluZUF0bGFzIGxldHMgdXMgcmV1c2UgcmVuZGVyZWQgZGFzaGVkIGxpbmVzXG4gKiBieSB3cml0aW5nIG1hbnkgb2YgdGhlbSB0byBhIHRleHR1cmUgYW5kIHRoZW4gZmV0Y2hpbmcgdGhlaXIgcG9zaXRpb25zXG4gKiB1c2luZyAuZ2V0RGFzaC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcbiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHRcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIExpbmVBdGxhcyB7XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKHdpZHRoICAgICAgICAsIGhlaWdodCAgICAgICAgKSB7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMubmV4dFJvdyA9IDA7XG5cbiAgICAgICAgdGhpcy5ieXRlcyA9IDQ7XG4gICAgICAgIHRoaXMuZGF0YSA9IG5ldyBVaW50OEFycmF5KHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCAqIHRoaXMuYnl0ZXMpO1xuXG4gICAgICAgIHRoaXMucG9zaXRpb25zID0ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IG9yIGNyZWF0ZSBhIGRhc2ggbGluZSBwYXR0ZXJuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBkYXNoYXJyYXlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJvdW5kIHdoZXRoZXIgdG8gYWRkIGNpcmNsZSBjYXBzIGluIGJldHdlZW4gZGFzaCBzZWdtZW50c1xuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHBvc2l0aW9uIG9mIGRhc2ggdGV4dHVyZSBpbiB7IHksIGhlaWdodCwgd2lkdGggfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0RGFzaChkYXNoYXJyYXkgICAgICAgICAgICAgICAsIHJvdW5kICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGRhc2hhcnJheS5qb2luKFwiLFwiKSArIFN0cmluZyhyb3VuZCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnBvc2l0aW9uc1trZXldKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uc1trZXldID0gdGhpcy5hZGREYXNoKGRhc2hhcnJheSwgcm91bmQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uc1trZXldO1xuICAgIH1cblxuICAgIGFkZERhc2goZGFzaGFycmF5ICAgICAgICAgICAgICAgLCByb3VuZCAgICAgICAgICkge1xuXG4gICAgICAgIGNvbnN0IG4gPSByb3VuZCA/IDcgOiAwO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSAyICogbiArIDE7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IDEyODtcblxuICAgICAgICBpZiAodGhpcy5uZXh0Um93ICsgaGVpZ2h0ID4gdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgICAgIHV0aWwud2Fybk9uY2UoJ0xpbmVBdGxhcyBvdXQgb2Ygc3BhY2UnKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGFzaGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZW5ndGggKz0gZGFzaGFycmF5W2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RyZXRjaCA9IHRoaXMud2lkdGggLyBsZW5ndGg7XG4gICAgICAgIGNvbnN0IGhhbGZXaWR0aCA9IHN0cmV0Y2ggLyAyO1xuXG4gICAgICAgIC8vIElmIGRhc2hhcnJheSBoYXMgYW4gb2RkIGxlbmd0aCwgYm90aCB0aGUgZmlyc3QgYW5kIGxhc3QgcGFydHNcbiAgICAgICAgLy8gYXJlIGRhc2hlcyBhbmQgc2hvdWxkIGJlIGpvaW5lZCBzZWFtbGVzc2x5LlxuICAgICAgICBjb25zdCBvZGRMZW5ndGggPSBkYXNoYXJyYXkubGVuZ3RoICUgMiA9PT0gMTtcblxuICAgICAgICBmb3IgKGxldCB5ID0gLW47IHkgPD0gbjsgeSsrKSB7XG4gICAgICAgICAgICBjb25zdCByb3cgPSB0aGlzLm5leHRSb3cgKyBuICsgeTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy53aWR0aCAqIHJvdztcblxuICAgICAgICAgICAgbGV0IGxlZnQgPSBvZGRMZW5ndGggPyAtZGFzaGFycmF5W2Rhc2hhcnJheS5sZW5ndGggLSAxXSA6IDA7XG4gICAgICAgICAgICBsZXQgcmlnaHQgPSBkYXNoYXJyYXlbMF07XG4gICAgICAgICAgICBsZXQgcGFydEluZGV4ID0gMTtcblxuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoOyB4KyspIHtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChyaWdodCA8IHggLyBzdHJldGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSByaWdodDtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSByaWdodCArIGRhc2hhcnJheVtwYXJ0SW5kZXhdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvZGRMZW5ndGggJiYgcGFydEluZGV4ID09PSBkYXNoYXJyYXkubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgKz0gZGFzaGFycmF5WzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcGFydEluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZGlzdExlZnQgPSBNYXRoLmFicyh4IC0gbGVmdCAqIHN0cmV0Y2gpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RSaWdodCA9IE1hdGguYWJzKHggLSByaWdodCAqIHN0cmV0Y2gpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3QgPSBNYXRoLm1pbihkaXN0TGVmdCwgZGlzdFJpZ2h0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnNpZGUgPSAocGFydEluZGV4ICUgMikgPT09IDE7XG4gICAgICAgICAgICAgICAgbGV0IHNpZ25lZERpc3RhbmNlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCBjaXJjbGUgY2Fwc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXN0TWlkZGxlID0gbiA/IHkgLyBuICogKGhhbGZXaWR0aCArIDEpIDogMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2lkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzdEVkZ2UgPSBoYWxmV2lkdGggLSBNYXRoLmFicyhkaXN0TWlkZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZERpc3RhbmNlID0gTWF0aC5zcXJ0KGRpc3QgKiBkaXN0ICsgZGlzdEVkZ2UgKiBkaXN0RWRnZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduZWREaXN0YW5jZSA9IGhhbGZXaWR0aCAtIE1hdGguc3FydChkaXN0ICogZGlzdCArIGRpc3RNaWRkbGUgKiBkaXN0TWlkZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25lZERpc3RhbmNlID0gKGluc2lkZSA/IDEgOiAtMSkgKiBkaXN0O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVszICsgKGluZGV4ICsgeCkgKiA0XSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgc2lnbmVkRGlzdGFuY2UgKyBvZmZzZXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvcyA9IHtcbiAgICAgICAgICAgIHk6ICh0aGlzLm5leHRSb3cgKyBuICsgMC41KSAvIHRoaXMuaGVpZ2h0LFxuICAgICAgICAgICAgaGVpZ2h0OiAyICogbiAvIHRoaXMuaGVpZ2h0LFxuICAgICAgICAgICAgd2lkdGg6IGxlbmd0aFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMubmV4dFJvdyArPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBwb3M7XG4gICAgfVxuXG4gICAgYmluZChjb250ZXh0ICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICAgICAgaWYgKCF0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5SRVBFQVQpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuUkVQRUFUKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCB0aGlzLmRhdGEpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5kaXJ0eSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBnbC50ZXhTdWJJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIDAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCB0aGlzLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IExpbmVBdGxhcztcbiIsIi8vICAgICAgXG5cbmNvbnN0IGJyb3dzZXIgPSByZXF1aXJlKCcuLi91dGlsL2Jyb3dzZXInKTtcbmNvbnN0IG1hdDQgPSByZXF1aXJlKCdAbWFwYm94L2dsLW1hdHJpeCcpLm1hdDQ7XG5jb25zdCBTb3VyY2VDYWNoZSA9IHJlcXVpcmUoJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUnKTtcbmNvbnN0IEVYVEVOVCA9IHJlcXVpcmUoJy4uL2RhdGEvZXh0ZW50Jyk7XG5jb25zdCBwaXhlbHNUb1RpbGVVbml0cyA9IHJlcXVpcmUoJy4uL3NvdXJjZS9waXhlbHNfdG9fdGlsZV91bml0cycpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuY29uc3QgVmVydGV4QXJyYXlPYmplY3QgPSByZXF1aXJlKCcuL3ZlcnRleF9hcnJheV9vYmplY3QnKTtcbmNvbnN0IHtSYXN0ZXJCb3VuZHNBcnJheSwgUG9zQXJyYXl9ID0gcmVxdWlyZSgnLi4vZGF0YS9hcnJheV90eXBlcycpO1xuY29uc3QgcmFzdGVyQm91bmRzQXR0cmlidXRlcyA9IHJlcXVpcmUoJy4uL2RhdGEvcmFzdGVyX2JvdW5kc19hdHRyaWJ1dGVzJyk7XG5jb25zdCBwb3NBdHRyaWJ1dGVzID0gcmVxdWlyZSgnLi4vZGF0YS9wb3NfYXR0cmlidXRlcycpO1xuY29uc3Qge1Byb2dyYW1Db25maWd1cmF0aW9ufSA9IHJlcXVpcmUoJy4uL2RhdGEvcHJvZ3JhbV9jb25maWd1cmF0aW9uJyk7XG5jb25zdCBDcm9zc1RpbGVTeW1ib2xJbmRleCA9IHJlcXVpcmUoJy4uL3N5bWJvbC9jcm9zc190aWxlX3N5bWJvbF9pbmRleCcpO1xuY29uc3Qgc2hhZGVycyA9IHJlcXVpcmUoJy4uL3NoYWRlcnMnKTtcbmNvbnN0IFByb2dyYW0gPSByZXF1aXJlKCcuL3Byb2dyYW0nKTtcbmNvbnN0IENvbnRleHQgPSByZXF1aXJlKCcuLi9nbC9jb250ZXh0Jyk7XG5jb25zdCBEZXB0aE1vZGUgPSByZXF1aXJlKCcuLi9nbC9kZXB0aF9tb2RlJyk7XG5jb25zdCBTdGVuY2lsTW9kZSA9IHJlcXVpcmUoJy4uL2dsL3N0ZW5jaWxfbW9kZScpO1xuY29uc3QgQ29sb3JNb2RlID0gcmVxdWlyZSgnLi4vZ2wvY29sb3JfbW9kZScpO1xuY29uc3QgVGV4dHVyZSA9IHJlcXVpcmUoJy4vdGV4dHVyZScpO1xuY29uc3QgdXBkYXRlVGlsZU1hc2tzID0gcmVxdWlyZSgnLi90aWxlX21hc2snKTtcbmNvbnN0IENvbG9yID0gcmVxdWlyZSgnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yJyk7XG5cbmNvbnN0IGRyYXcgPSB7XG4gICAgc3ltYm9sOiByZXF1aXJlKCcuL2RyYXdfc3ltYm9sJyksXG4gICAgY2lyY2xlOiByZXF1aXJlKCcuL2RyYXdfY2lyY2xlJyksXG4gICAgaGVhdG1hcDogcmVxdWlyZSgnLi9kcmF3X2hlYXRtYXAnKSxcbiAgICBsaW5lOiByZXF1aXJlKCcuL2RyYXdfbGluZScpLFxuICAgIGZpbGw6IHJlcXVpcmUoJy4vZHJhd19maWxsJyksXG4gICAgJ2ZpbGwtZXh0cnVzaW9uJzogcmVxdWlyZSgnLi9kcmF3X2ZpbGxfZXh0cnVzaW9uJyksXG4gICAgaGlsbHNoYWRlOiByZXF1aXJlKCcuL2RyYXdfaGlsbHNoYWRlJyksXG4gICAgcmFzdGVyOiByZXF1aXJlKCcuL2RyYXdfcmFzdGVyJyksXG4gICAgYmFja2dyb3VuZDogcmVxdWlyZSgnLi9kcmF3X2JhY2tncm91bmQnKSxcbiAgICBkZWJ1ZzogcmVxdWlyZSgnLi9kcmF3X2RlYnVnJylcbn07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuIFxuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgcGFpbnRlciBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtDYW52YXN9IGdsIGFuIGV4cGVyaW1lbnRhbC13ZWJnbCBkcmF3aW5nIGNvbnRleHRcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFBhaW50ZXIge1xuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGdsICAgICAgICAgICAgICAgICAgICAgICAsIHRyYW5zZm9ybSAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IG5ldyBDb250ZXh0KGdsKTtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgICAgIHRoaXMuX3RpbGVUZXh0dXJlcyA9IHt9O1xuXG4gICAgICAgIHRoaXMuc2V0dXAoKTtcblxuICAgICAgICAvLyBXaXRoaW4gZWFjaCBsYXllciB0aGVyZSBhcmUgbXVsdGlwbGUgZGlzdGluY3Qgei1wbGFuZXMgdGhhdCBjYW4gYmUgZHJhd24gdG8uXG4gICAgICAgIC8vIFRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIFdlYkdMIGRlcHRoIGJ1ZmZlci5cbiAgICAgICAgdGhpcy5udW1TdWJsYXllcnMgPSBTb3VyY2VDYWNoZS5tYXhVbmRlcnpvb21pbmcgKyBTb3VyY2VDYWNoZS5tYXhPdmVyem9vbWluZyArIDE7XG4gICAgICAgIHRoaXMuZGVwdGhFcHNpbG9uID0gMSAvIE1hdGgucG93KDIsIDE2KTtcblxuICAgICAgICB0aGlzLmRlcHRoUmJvTmVlZHNDbGVhciA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5lbXB0eVByb2dyYW1Db25maWd1cmF0aW9uID0gbmV3IFByb2dyYW1Db25maWd1cmF0aW9uKCk7XG5cbiAgICAgICAgdGhpcy5jcm9zc1RpbGVTeW1ib2xJbmRleCA9IG5ldyBDcm9zc1RpbGVTeW1ib2xJbmRleCgpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogVXBkYXRlIHRoZSBHTCB2aWV3cG9ydCwgcHJvamVjdGlvbiBtYXRyaXgsIGFuZCB0cmFuc2Zvcm1zIHRvIGNvbXBlbnNhdGVcbiAgICAgKiBmb3IgYSBuZXcgd2lkdGggYW5kIGhlaWdodCB2YWx1ZS5cbiAgICAgKi9cbiAgICByZXNpemUod2lkdGggICAgICAgICwgaGVpZ2h0ICAgICAgICApIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG5cbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoICogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodCAqIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgdGhpcy5jb250ZXh0LnZpZXdwb3J0LnNldChbMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHRdKTtcblxuICAgICAgICBpZiAodGhpcy5zdHlsZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBsYXllcklkIG9mIHRoaXMuc3R5bGUuX29yZGVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5fbGF5ZXJzW2xheWVySWRdLnJlc2l6ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGVwdGhSYm8pIHtcbiAgICAgICAgICAgIGdsLmRlbGV0ZVJlbmRlcmJ1ZmZlcih0aGlzLmRlcHRoUmJvKTtcbiAgICAgICAgICAgIHRoaXMuZGVwdGhSYm8gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0dXAoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG5cbiAgICAgICAgY29uc3QgdGlsZUV4dGVudEFycmF5ID0gbmV3IFBvc0FycmF5KCk7XG4gICAgICAgIHRpbGVFeHRlbnRBcnJheS5lbXBsYWNlQmFjaygwLCAwKTtcbiAgICAgICAgdGlsZUV4dGVudEFycmF5LmVtcGxhY2VCYWNrKEVYVEVOVCwgMCk7XG4gICAgICAgIHRpbGVFeHRlbnRBcnJheS5lbXBsYWNlQmFjaygwLCBFWFRFTlQpO1xuICAgICAgICB0aWxlRXh0ZW50QXJyYXkuZW1wbGFjZUJhY2soRVhURU5ULCBFWFRFTlQpO1xuICAgICAgICB0aGlzLnRpbGVFeHRlbnRCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aWxlRXh0ZW50QXJyYXksIHBvc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIHRoaXMudGlsZUV4dGVudFZBTyA9IG5ldyBWZXJ0ZXhBcnJheU9iamVjdCgpO1xuICAgICAgICB0aGlzLnRpbGVFeHRlbnRQYXR0ZXJuVkFPID0gbmV3IFZlcnRleEFycmF5T2JqZWN0KCk7XG5cbiAgICAgICAgY29uc3QgZGVidWdBcnJheSA9IG5ldyBQb3NBcnJheSgpO1xuICAgICAgICBkZWJ1Z0FycmF5LmVtcGxhY2VCYWNrKDAsIDApO1xuICAgICAgICBkZWJ1Z0FycmF5LmVtcGxhY2VCYWNrKEVYVEVOVCwgMCk7XG4gICAgICAgIGRlYnVnQXJyYXkuZW1wbGFjZUJhY2soRVhURU5ULCBFWFRFTlQpO1xuICAgICAgICBkZWJ1Z0FycmF5LmVtcGxhY2VCYWNrKDAsIEVYVEVOVCk7XG4gICAgICAgIGRlYnVnQXJyYXkuZW1wbGFjZUJhY2soMCwgMCk7XG4gICAgICAgIHRoaXMuZGVidWdCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcihkZWJ1Z0FycmF5LCBwb3NBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICB0aGlzLmRlYnVnVkFPID0gbmV3IFZlcnRleEFycmF5T2JqZWN0KCk7XG5cbiAgICAgICAgY29uc3QgcmFzdGVyQm91bmRzQXJyYXkgPSBuZXcgUmFzdGVyQm91bmRzQXJyYXkoKTtcbiAgICAgICAgcmFzdGVyQm91bmRzQXJyYXkuZW1wbGFjZUJhY2soMCwgMCwgMCwgMCk7XG4gICAgICAgIHJhc3RlckJvdW5kc0FycmF5LmVtcGxhY2VCYWNrKEVYVEVOVCwgMCwgRVhURU5ULCAwKTtcbiAgICAgICAgcmFzdGVyQm91bmRzQXJyYXkuZW1wbGFjZUJhY2soMCwgRVhURU5ULCAwLCBFWFRFTlQpO1xuICAgICAgICByYXN0ZXJCb3VuZHNBcnJheS5lbXBsYWNlQmFjayhFWFRFTlQsIEVYVEVOVCwgRVhURU5ULCBFWFRFTlQpO1xuICAgICAgICB0aGlzLnJhc3RlckJvdW5kc0J1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHJhc3RlckJvdW5kc0FycmF5LCByYXN0ZXJCb3VuZHNBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICB0aGlzLnJhc3RlckJvdW5kc1ZBTyA9IG5ldyBWZXJ0ZXhBcnJheU9iamVjdCgpO1xuXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0QXJyYXkgPSBuZXcgUG9zQXJyYXkoKTtcbiAgICAgICAgdmlld3BvcnRBcnJheS5lbXBsYWNlQmFjaygwLCAwKTtcbiAgICAgICAgdmlld3BvcnRBcnJheS5lbXBsYWNlQmFjaygxLCAwKTtcbiAgICAgICAgdmlld3BvcnRBcnJheS5lbXBsYWNlQmFjaygwLCAxKTtcbiAgICAgICAgdmlld3BvcnRBcnJheS5lbXBsYWNlQmFjaygxLCAxKTtcbiAgICAgICAgdGhpcy52aWV3cG9ydEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHZpZXdwb3J0QXJyYXksIHBvc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIHRoaXMudmlld3BvcnRWQU8gPSBuZXcgVmVydGV4QXJyYXlPYmplY3QoKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFJlc2V0IHRoZSBkcmF3aW5nIGNhbnZhcyBieSBjbGVhcmluZyB0aGUgc3RlbmNpbCBidWZmZXIgc28gdGhhdCB3ZSBjYW4gZHJhd1xuICAgICAqIG5ldyB0aWxlcyBhdCB0aGUgc2FtZSBsb2NhdGlvbiwgd2hpbGUgcmV0YWluaW5nIHByZXZpb3VzbHkgZHJhd24gcGl4ZWxzLlxuICAgICAqL1xuICAgIGNsZWFyU3RlbmNpbCgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIC8vIEFzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy81NDkwLFxuICAgICAgICAvLyBwZW5kaW5nIGFuIHVwc3RyZWFtIGZpeCwgd2UgZHJhdyBhIGZ1bGxzY3JlZW4gc3RlbmNpbD0wIGNsaXBwaW5nIG1hc2sgaGVyZSxcbiAgICAgICAgLy8gZWZmZWN0aXZlbHkgY2xlYXJpbmcgdGhlIHN0ZW5jaWwgYnVmZmVyOiBvbmNlIGFuIHVwc3RyZWFtIHBhdGNoIGxhbmRzLCByZW1vdmVcbiAgICAgICAgLy8gdGhpcyBmdW5jdGlvbiBpbiBmYXZvciBvZiBjb250ZXh0LmNsZWFyKHsgc3RlbmNpbDogMHgwIH0pXG5cbiAgICAgICAgY29udGV4dC5zZXRDb2xvck1vZGUoQ29sb3JNb2RlLmRpc2FibGVkKTtcbiAgICAgICAgY29udGV4dC5zZXREZXB0aE1vZGUoRGVwdGhNb2RlLmRpc2FibGVkKTtcbiAgICAgICAgY29udGV4dC5zZXRTdGVuY2lsTW9kZShuZXcgU3RlbmNpbE1vZGUoeyBmdW5jOiBnbC5BTFdBWVMsIG1hc2s6IDAgfSwgMHgwLCAweEZGLCBnbC5aRVJPLCBnbC5aRVJPLCBnbC5aRVJPKSk7XG5cbiAgICAgICAgY29uc3QgbWF0cml4ID0gbWF0NC5jcmVhdGUoKTtcbiAgICAgICAgbWF0NC5vcnRobyhtYXRyaXgsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCAwLCAwLCAxKTtcbiAgICAgICAgbWF0NC5zY2FsZShtYXRyaXgsIG1hdHJpeCwgW2dsLmRyYXdpbmdCdWZmZXJXaWR0aCwgZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCwgMF0pO1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzLnVzZVByb2dyYW0oJ2NsaXBwaW5nTWFzaycpO1xuICAgICAgICBnbC51bmlmb3JtTWF0cml4NGZ2KHByb2dyYW0udW5pZm9ybXMudV9tYXRyaXgsIGZhbHNlLCBtYXRyaXgpO1xuXG4gICAgICAgIHRoaXMudmlld3BvcnRWQU8uYmluZChjb250ZXh0LCBwcm9ncmFtLCB0aGlzLnZpZXdwb3J0QnVmZmVyLCBbXSk7XG4gICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpO1xuICAgIH1cblxuICAgIF9yZW5kZXJUaWxlQ2xpcHBpbmdNYXNrcyh0aWxlSURzICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICAgICAgY29udGV4dC5zZXRDb2xvck1vZGUoQ29sb3JNb2RlLmRpc2FibGVkKTtcbiAgICAgICAgY29udGV4dC5zZXREZXB0aE1vZGUoRGVwdGhNb2RlLmRpc2FibGVkKTtcblxuICAgICAgICBsZXQgaWROZXh0ID0gMTtcbiAgICAgICAgdGhpcy5fdGlsZUNsaXBwaW5nTWFza0lEcyA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgdGlsZUlEIG9mIHRpbGVJRHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5fdGlsZUNsaXBwaW5nTWFza0lEc1t0aWxlSUQua2V5XSA9IGlkTmV4dCsrO1xuXG4gICAgICAgICAgICAvLyBUZXN0cyB3aWxsIGFsd2F5cyBwYXNzLCBhbmQgcmVmIHZhbHVlIHdpbGwgYmUgd3JpdHRlbiB0byBzdGVuY2lsIGJ1ZmZlci5cbiAgICAgICAgICAgIGNvbnRleHQuc2V0U3RlbmNpbE1vZGUobmV3IFN0ZW5jaWxNb2RlKHsgZnVuYzogZ2wuQUxXQVlTLCBtYXNrOiAwIH0sIGlkLCAweEZGLCBnbC5LRUVQLCBnbC5LRUVQLCBnbC5SRVBMQUNFKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzLnVzZVByb2dyYW0oJ2NsaXBwaW5nTWFzaycpO1xuICAgICAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLnVuaWZvcm1zLnVfbWF0cml4LCBmYWxzZSwgdGlsZUlELnBvc01hdHJpeCk7XG5cbiAgICAgICAgICAgIC8vIERyYXcgdGhlIGNsaXBwaW5nIG1hc2tcbiAgICAgICAgICAgIHRoaXMudGlsZUV4dGVudFZBTy5iaW5kKHRoaXMuY29udGV4dCwgcHJvZ3JhbSwgdGhpcy50aWxlRXh0ZW50QnVmZmVyLCBbXSk7XG4gICAgICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFX1NUUklQLCAwLCB0aGlzLnRpbGVFeHRlbnRCdWZmZXIubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0ZW5jaWxNb2RlRm9yQ2xpcHBpbmcodGlsZUlEICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGVuY2lsTW9kZSh7IGZ1bmM6IGdsLkVRVUFMLCBtYXNrOiAweEZGIH0sIHRoaXMuX3RpbGVDbGlwcGluZ01hc2tJRHNbdGlsZUlELmtleV0sIDB4MDAsIGdsLktFRVAsIGdsLktFRVAsIGdsLlJFUExBQ0UpO1xuICAgIH1cblxuICAgIGNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgaWYgKHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3Rvcikge1xuICAgICAgICAgICAgY29uc3QgbnVtT3ZlcmRyYXdTdGVwcyA9IDg7XG4gICAgICAgICAgICBjb25zdCBhID0gMSAvIG51bU92ZXJkcmF3U3RlcHM7XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JNb2RlKFtnbC5DT05TVEFOVF9DT0xPUiwgZ2wuT05FXSwgbmV3IENvbG9yKGEsIGEsIGEsIDApLCBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVuZGVyUGFzcyA9PT0gJ29wYXF1ZScpIHtcbiAgICAgICAgICAgIHJldHVybiBDb2xvck1vZGUudW5ibGVuZGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIENvbG9yTW9kZS5hbHBoYUJsZW5kZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXB0aE1vZGVGb3JTdWJsYXllcihuICAgICAgICAsIG1hc2sgICAgICAgICAgICAgICAsIGZ1bmMgICAgICAgICAgICAgICAgKSAgICAgICAgICAgIHtcbiAgICAgICAgY29uc3QgZmFyRGVwdGggPSAxIC0gKCgxICsgdGhpcy5jdXJyZW50TGF5ZXIpICogdGhpcy5udW1TdWJsYXllcnMgKyBuKSAqIHRoaXMuZGVwdGhFcHNpbG9uO1xuICAgICAgICBjb25zdCBuZWFyRGVwdGggPSBmYXJEZXB0aCAtIDEgKyB0aGlzLmRlcHRoUmFuZ2U7XG4gICAgICAgIHJldHVybiBuZXcgRGVwdGhNb2RlKGZ1bmMgfHwgdGhpcy5jb250ZXh0LmdsLkxFUVVBTCwgbWFzaywgW25lYXJEZXB0aCwgZmFyRGVwdGhdKTtcbiAgICB9XG5cbiAgICByZW5kZXIoc3R5bGUgICAgICAgLCBvcHRpb25zICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGU7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICAgICAgdGhpcy5saW5lQXRsYXMgPSBzdHlsZS5saW5lQXRsYXM7XG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyID0gc3R5bGUuaW1hZ2VNYW5hZ2VyO1xuICAgICAgICB0aGlzLmdseXBoTWFuYWdlciA9IHN0eWxlLmdseXBoTWFuYWdlcjtcblxuICAgICAgICB0aGlzLnN5bWJvbEZhZGVDaGFuZ2UgPSBzdHlsZS5wbGFjZW1lbnQuc3ltYm9sRmFkZUNoYW5nZShicm93c2VyLm5vdygpKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHN0eWxlLnNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLnN0eWxlLnNvdXJjZUNhY2hlc1tpZF07XG4gICAgICAgICAgICBpZiAoc291cmNlQ2FjaGUudXNlZCkge1xuICAgICAgICAgICAgICAgIHNvdXJjZUNhY2hlLnByZXBhcmUodGhpcy5jb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxheWVySWRzID0gdGhpcy5zdHlsZS5fb3JkZXI7XG5cbiAgICAgICAgY29uc3QgcmFzdGVyU291cmNlcyA9IHV0aWwuZmlsdGVyT2JqZWN0KHRoaXMuc3R5bGUuc291cmNlQ2FjaGVzLCAoc2MpID0+IHsgcmV0dXJuIHNjLmdldFNvdXJjZSgpLnR5cGUgPT09ICdyYXN0ZXInIHx8IHNjLmdldFNvdXJjZSgpLnR5cGUgPT09ICdyYXN0ZXItZGVtJzsgfSk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHJhc3RlclNvdXJjZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gcmFzdGVyU291cmNlc1trZXldO1xuICAgICAgICAgICAgY29uc3QgY29vcmRzID0gc291cmNlQ2FjaGUuZ2V0VmlzaWJsZUNvb3JkaW5hdGVzKCk7XG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlVGlsZXMgPSBjb29yZHMubWFwKChjKT0+eyByZXR1cm4gc291cmNlQ2FjaGUuZ2V0VGlsZShjKTsgfSk7XG4gICAgICAgICAgICB1cGRhdGVUaWxlTWFza3ModmlzaWJsZVRpbGVzLCB0aGlzLmNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT2Zmc2NyZWVuIHBhc3NcbiAgICAgICAgLy8gV2UgZmlyc3QgZG8gYWxsIHJlbmRlcmluZyB0aGF0IHJlcXVpcmVzIHJlbmRlcmluZyB0byBhIHNlcGFyYXRlXG4gICAgICAgIC8vIGZyYW1lYnVmZmVyLCBhbmQgdGhlbiBzYXZlIHRob3NlIGZvciByZW5kZXJpbmcgYmFjayB0byB0aGUgbWFwXG4gICAgICAgIC8vIGxhdGVyOiBpbiBkb2luZyB0aGlzIHdlIGF2b2lkIGRvaW5nIGV4cGVuc2l2ZSBmcmFtZWJ1ZmZlciByZXN0b3Jlcy5cbiAgICAgICAgdGhpcy5yZW5kZXJQYXNzID0gJ29mZnNjcmVlbic7XG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2VDYWNoZTtcbiAgICAgICAgICAgIGxldCBjb29yZHMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuZGVwdGhSYm9OZWVkc0NsZWFyID0gdHJ1ZTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXllcklkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5zdHlsZS5fbGF5ZXJzW2xheWVySWRzW2ldXTtcblxuICAgICAgICAgICAgICAgIGlmICghbGF5ZXIuaGFzT2Zmc2NyZWVuUGFzcygpIHx8IGxheWVyLmlzSGlkZGVuKHRoaXMudHJhbnNmb3JtLnpvb20pKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGlmIChsYXllci5zb3VyY2UgIT09IChzb3VyY2VDYWNoZSAmJiBzb3VyY2VDYWNoZS5pZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlQ2FjaGUgPSB0aGlzLnN0eWxlLnNvdXJjZUNhY2hlc1tsYXllci5zb3VyY2VdO1xuICAgICAgICAgICAgICAgICAgICBjb29yZHMgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkcyA9IHNvdXJjZUNhY2hlLmdldFZpc2libGVDb29yZGluYXRlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRzLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghY29vcmRzLmxlbmd0aCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckxheWVyKHRoaXMsIChzb3VyY2VDYWNoZSAgICAgKSwgbGF5ZXIsIGNvb3Jkcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlYmluZCB0aGUgbWFpbiBmcmFtZWJ1ZmZlciBub3cgdGhhdCBhbGwgb2Zmc2NyZWVuIGxheWVyc1xuICAgICAgICAgICAgLy8gaGF2ZSBiZWVuIHJlbmRlcmVkOlxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBidWZmZXJzIGluIHByZXBhcmF0aW9uIGZvciBkcmF3aW5nIHRvIHRoZSBtYWluIGZyYW1lYnVmZmVyXG4gICAgICAgIHRoaXMuY29udGV4dC5jbGVhcih7IGNvbG9yOiBvcHRpb25zLnNob3dPdmVyZHJhd0luc3BlY3RvciA/IENvbG9yLmJsYWNrIDogQ29sb3IudHJhbnNwYXJlbnQsIGRlcHRoOiAxIH0pO1xuXG4gICAgICAgIHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvciA9IG9wdGlvbnMuc2hvd092ZXJkcmF3SW5zcGVjdG9yO1xuXG4gICAgICAgIHRoaXMuZGVwdGhSYW5nZSA9IChzdHlsZS5fb3JkZXIubGVuZ3RoICsgMikgKiB0aGlzLm51bVN1YmxheWVycyAqIHRoaXMuZGVwdGhFcHNpbG9uO1xuXG4gICAgICAgIC8vIE9wYXF1ZSBwYXNzXG4gICAgICAgIC8vIERyYXcgb3BhcXVlIGxheWVycyB0b3AtdG8tYm90dG9tIGZpcnN0LlxuICAgICAgICB0aGlzLnJlbmRlclBhc3MgPSAnb3BhcXVlJztcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IHNvdXJjZUNhY2hlO1xuICAgICAgICAgICAgbGV0IGNvb3JkcyA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYXllciA9IGxheWVySWRzLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgICAgIGZvciAodGhpcy5jdXJyZW50TGF5ZXI7IHRoaXMuY3VycmVudExheWVyID49IDA7IHRoaXMuY3VycmVudExheWVyLS0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuc3R5bGUuX2xheWVyc1tsYXllcklkc1t0aGlzLmN1cnJlbnRMYXllcl1dO1xuXG4gICAgICAgICAgICAgICAgaWYgKGxheWVyLnNvdXJjZSAhPT0gKHNvdXJjZUNhY2hlICYmIHNvdXJjZUNhY2hlLmlkKSkge1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2VDYWNoZSA9IHRoaXMuc3R5bGUuc291cmNlQ2FjaGVzW2xheWVyLnNvdXJjZV07XG4gICAgICAgICAgICAgICAgICAgIGNvb3JkcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VDYWNoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhclN0ZW5jaWwoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkcyA9IHNvdXJjZUNhY2hlLmdldFZpc2libGVDb29yZGluYXRlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUNhY2hlLmdldFNvdXJjZSgpLmlzVGlsZUNsaXBwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJUaWxlQ2xpcHBpbmdNYXNrcyhjb29yZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJMYXllcih0aGlzLCAoc291cmNlQ2FjaGUgICAgICksIGxheWVyLCBjb29yZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhbnNsdWNlbnQgcGFzc1xuICAgICAgICAvLyBEcmF3IGFsbCBvdGhlciBsYXllcnMgYm90dG9tLXRvLXRvcC5cbiAgICAgICAgdGhpcy5yZW5kZXJQYXNzID0gJ3RyYW5zbHVjZW50JztcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IHNvdXJjZUNhY2hlO1xuICAgICAgICAgICAgbGV0IGNvb3JkcyA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYXllciA9IDA7XG5cbiAgICAgICAgICAgIGZvciAodGhpcy5jdXJyZW50TGF5ZXI7IHRoaXMuY3VycmVudExheWVyIDwgbGF5ZXJJZHMubGVuZ3RoOyB0aGlzLmN1cnJlbnRMYXllcisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLnN0eWxlLl9sYXllcnNbbGF5ZXJJZHNbdGhpcy5jdXJyZW50TGF5ZXJdXTtcblxuICAgICAgICAgICAgICAgIGlmIChsYXllci5zb3VyY2UgIT09IChzb3VyY2VDYWNoZSAmJiBzb3VyY2VDYWNoZS5pZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlQ2FjaGUgPSB0aGlzLnN0eWxlLnNvdXJjZUNhY2hlc1tsYXllci5zb3VyY2VdO1xuICAgICAgICAgICAgICAgICAgICBjb29yZHMgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTdGVuY2lsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZHMgPSBzb3VyY2VDYWNoZS5nZXRWaXNpYmxlQ29vcmRpbmF0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS5pc1RpbGVDbGlwcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyVGlsZUNsaXBwaW5nTWFza3MoY29vcmRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvb3Jkcy5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJMYXllcih0aGlzLCAoc291cmNlQ2FjaGUgICAgICksIGxheWVyLCBjb29yZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VGlsZUJvdW5kYXJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5zdHlsZS5zb3VyY2VDYWNoZXNbT2JqZWN0LmtleXModGhpcy5zdHlsZS5zb3VyY2VDYWNoZXMpWzBdXTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VDYWNoZSkge1xuICAgICAgICAgICAgICAgIGRyYXcuZGVidWcodGhpcywgc291cmNlQ2FjaGUsIHNvdXJjZUNhY2hlLmdldFZpc2libGVDb29yZGluYXRlcygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldHVwT2Zmc2NyZWVuRGVwdGhSZW5kZXJidWZmZXIoKSAgICAgICB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIC8vIEFsbCBvZiB0aGUgM0QgdGV4dHVyZXMgd2lsbCB1c2UgdGhlIHNhbWUgZGVwdGggcmVuZGVyYnVmZmVyLlxuICAgICAgICBpZiAoIXRoaXMuZGVwdGhSYm8pIHtcbiAgICAgICAgICAgIHRoaXMuZGVwdGhSYm8gPSBjb250ZXh0LmNyZWF0ZVJlbmRlcmJ1ZmZlcihjb250ZXh0LmdsLkRFUFRIX0NPTVBPTkVOVDE2LCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJMYXllcihwYWludGVyICAgICAgICAgLCBzb3VyY2VDYWNoZSAgICAgICAgICAgICAsIGxheWVyICAgICAgICAgICAgLCBjb29yZHMgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGlmIChsYXllci5pc0hpZGRlbih0aGlzLnRyYW5zZm9ybS56b29tKSkgcmV0dXJuO1xuICAgICAgICBpZiAobGF5ZXIudHlwZSAhPT0gJ2JhY2tncm91bmQnICYmICFjb29yZHMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHRoaXMuaWQgPSBsYXllci5pZDtcblxuICAgICAgICBkcmF3W2xheWVyLnR5cGVdKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gYSBtYXRyaXggdG8gaW5jb3Jwb3JhdGUgdGhlICotdHJhbnNsYXRlIGFuZCAqLXRyYW5zbGF0ZS1hbmNob3IgcHJvcGVydGllcyBpbnRvIGl0LlxuICAgICAqIEBwYXJhbSBpblZpZXdwb3J0UGl4ZWxVbml0c1VuaXRzIFRydWUgd2hlbiB0aGUgdW5pdHMgYWNjZXB0ZWQgYnkgdGhlIG1hdHJpeCBhcmUgaW4gdmlld3BvcnQgcGl4ZWxzIGluc3RlYWQgb2YgdGlsZSB1bml0cy5cbiAgICAgKiBAcmV0dXJucyB7RmxvYXQzMkFycmF5fSBtYXRyaXhcbiAgICAgKi9cbiAgICB0cmFuc2xhdGVQb3NNYXRyaXgobWF0cml4ICAgICAgICAgICAgICAsIHRpbGUgICAgICAsIHRyYW5zbGF0ZSAgICAgICAgICAgICAgICAgICwgdHJhbnNsYXRlQW5jaG9yICAgICAgICAgICAgICAgICAgICAsIGluVmlld3BvcnRQaXhlbFVuaXRzVW5pdHMgICAgICAgICAgKSB7XG4gICAgICAgIGlmICghdHJhbnNsYXRlWzBdICYmICF0cmFuc2xhdGVbMV0pIHJldHVybiBtYXRyaXg7XG5cbiAgICAgICAgY29uc3QgYW5nbGUgPSBpblZpZXdwb3J0UGl4ZWxVbml0c1VuaXRzID9cbiAgICAgICAgICAgICh0cmFuc2xhdGVBbmNob3IgPT09ICdtYXAnID8gdGhpcy50cmFuc2Zvcm0uYW5nbGUgOiAwKSA6XG4gICAgICAgICAgICAodHJhbnNsYXRlQW5jaG9yID09PSAndmlld3BvcnQnID8gLXRoaXMudHJhbnNmb3JtLmFuZ2xlIDogMCk7XG5cbiAgICAgICAgaWYgKGFuZ2xlKSB7XG4gICAgICAgICAgICBjb25zdCBzaW5BID0gTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgICAgICAgY29uc3QgY29zQSA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICAgICAgICAgIHRyYW5zbGF0ZSA9IFtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVbMF0gKiBjb3NBIC0gdHJhbnNsYXRlWzFdICogc2luQSxcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVbMF0gKiBzaW5BICsgdHJhbnNsYXRlWzFdICogY29zQVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gW1xuICAgICAgICAgICAgaW5WaWV3cG9ydFBpeGVsVW5pdHNVbml0cyA/IHRyYW5zbGF0ZVswXSA6IHBpeGVsc1RvVGlsZVVuaXRzKHRpbGUsIHRyYW5zbGF0ZVswXSwgdGhpcy50cmFuc2Zvcm0uem9vbSksXG4gICAgICAgICAgICBpblZpZXdwb3J0UGl4ZWxVbml0c1VuaXRzID8gdHJhbnNsYXRlWzFdIDogcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgdHJhbnNsYXRlWzFdLCB0aGlzLnRyYW5zZm9ybS56b29tKSxcbiAgICAgICAgICAgIDBcbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCB0cmFuc2xhdGVkTWF0cml4ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKHRyYW5zbGF0ZWRNYXRyaXgsIG1hdHJpeCwgdHJhbnNsYXRpb24pO1xuICAgICAgICByZXR1cm4gdHJhbnNsYXRlZE1hdHJpeDtcbiAgICB9XG5cbiAgICBzYXZlVGlsZVRleHR1cmUodGV4dHVyZSAgICAgICAgICkge1xuICAgICAgICBjb25zdCB0ZXh0dXJlcyA9IHRoaXMuX3RpbGVUZXh0dXJlc1t0ZXh0dXJlLnNpemVbMF1dO1xuICAgICAgICBpZiAoIXRleHR1cmVzKSB7XG4gICAgICAgICAgICB0aGlzLl90aWxlVGV4dHVyZXNbdGV4dHVyZS5zaXplWzBdXSA9IFt0ZXh0dXJlXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRleHR1cmVzLnB1c2godGV4dHVyZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRUaWxlVGV4dHVyZShzaXplICAgICAgICApIHtcbiAgICAgICAgY29uc3QgdGV4dHVyZXMgPSB0aGlzLl90aWxlVGV4dHVyZXNbc2l6ZV07XG4gICAgICAgIHJldHVybiB0ZXh0dXJlcyAmJiB0ZXh0dXJlcy5sZW5ndGggPiAwID8gdGV4dHVyZXMucG9wKCkgOiBudWxsO1xuICAgIH1cblxuICAgIF9jcmVhdGVQcm9ncmFtQ2FjaGVkKG5hbWUgICAgICAgICwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICB7XG4gICAgICAgIHRoaXMuY2FjaGUgPSB0aGlzLmNhY2hlIHx8IHt9O1xuICAgICAgICBjb25zdCBrZXkgPSBgJHtuYW1lfSR7cHJvZ3JhbUNvbmZpZ3VyYXRpb24uY2FjaGVLZXkgfHwgJyd9JHt0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IgPyAnL292ZXJkcmF3JyA6ICcnfWA7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVtrZXldKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlW2tleV0gPSBuZXcgUHJvZ3JhbSh0aGlzLmNvbnRleHQsIHNoYWRlcnNbbmFtZV0sIHByb2dyYW1Db25maWd1cmF0aW9uLCB0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlW2tleV07XG4gICAgfVxuXG4gICAgdXNlUHJvZ3JhbShuYW1lICAgICAgICAsIHByb2dyYW1Db25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgIHtcbiAgICAgICAgY29uc3QgbmV4dFByb2dyYW0gPSB0aGlzLl9jcmVhdGVQcm9ncmFtQ2FjaGVkKG5hbWUsIHByb2dyYW1Db25maWd1cmF0aW9uIHx8IHRoaXMuZW1wdHlQcm9ncmFtQ29uZmlndXJhdGlvbik7XG5cbiAgICAgICAgdGhpcy5jb250ZXh0LnByb2dyYW0uc2V0KG5leHRQcm9ncmFtLnByb2dyYW0pO1xuXG4gICAgICAgIHJldHVybiBuZXh0UHJvZ3JhbTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUGFpbnRlcjtcbiIsIi8vICAgICAgXG5cbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuY29uc3QgcGl4ZWxzVG9UaWxlVW5pdHMgPSByZXF1aXJlKCcuLi9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBwYXR0ZXJuIGltYWdlIGlzIG5lZWRlZCwgYW5kIGlmIGl0IGlzLCB3aGV0aGVyIGl0IGlzIG5vdCBsb2FkZWQuXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMgdHJ1ZSBpZiBhIG5lZWRlZCBpbWFnZSBpcyBtaXNzaW5nIGFuZCByZW5kZXJpbmcgbmVlZHMgdG8gYmUgc2tpcHBlZC5cbiAqL1xuZXhwb3J0cy5pc1BhdHRlcm5NaXNzaW5nID0gZnVuY3Rpb24oaW1hZ2UgICAgICAgICAgICAgICAgICAgICAsIHBhaW50ZXIgICAgICAgICApICAgICAgICAgIHtcbiAgICBpZiAoIWltYWdlKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgaW1hZ2VQb3NBID0gcGFpbnRlci5pbWFnZU1hbmFnZXIuZ2V0UGF0dGVybihpbWFnZS5mcm9tKTtcbiAgICBjb25zdCBpbWFnZVBvc0IgPSBwYWludGVyLmltYWdlTWFuYWdlci5nZXRQYXR0ZXJuKGltYWdlLnRvKTtcbiAgICByZXR1cm4gIWltYWdlUG9zQSB8fCAhaW1hZ2VQb3NCO1xufTtcblxuZXhwb3J0cy5wcmVwYXJlID0gZnVuY3Rpb24gKGltYWdlICAgICAgICAgICAgICAgICAgICAsIHBhaW50ZXIgICAgICAgICAsIHByb2dyYW0gICAgICAgICApIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgIGNvbnN0IGltYWdlUG9zQSA9IHBhaW50ZXIuaW1hZ2VNYW5hZ2VyLmdldFBhdHRlcm4oaW1hZ2UuZnJvbSk7XG4gICAgY29uc3QgaW1hZ2VQb3NCID0gcGFpbnRlci5pbWFnZU1hbmFnZXIuZ2V0UGF0dGVybihpbWFnZS50byk7XG4gICAgYXNzZXJ0KGltYWdlUG9zQSAmJiBpbWFnZVBvc0IpO1xuXG4gICAgZ2wudW5pZm9ybTFpKHByb2dyYW0udW5pZm9ybXMudV9pbWFnZSwgMCk7XG4gICAgZ2wudW5pZm9ybTJmdihwcm9ncmFtLnVuaWZvcm1zLnVfcGF0dGVybl90bF9hLCAoaW1hZ2VQb3NBICAgICApLnRsKTtcbiAgICBnbC51bmlmb3JtMmZ2KHByb2dyYW0udW5pZm9ybXMudV9wYXR0ZXJuX2JyX2EsIChpbWFnZVBvc0EgICAgICkuYnIpO1xuICAgIGdsLnVuaWZvcm0yZnYocHJvZ3JhbS51bmlmb3Jtcy51X3BhdHRlcm5fdGxfYiwgKGltYWdlUG9zQiAgICAgKS50bCk7XG4gICAgZ2wudW5pZm9ybTJmdihwcm9ncmFtLnVuaWZvcm1zLnVfcGF0dGVybl9icl9iLCAoaW1hZ2VQb3NCICAgICApLmJyKTtcbiAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBwYWludGVyLmltYWdlTWFuYWdlci5nZXRQaXhlbFNpemUoKTtcbiAgICBnbC51bmlmb3JtMmZ2KHByb2dyYW0udW5pZm9ybXMudV90ZXhzaXplLCBbd2lkdGgsIGhlaWdodF0pO1xuICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVuaWZvcm1zLnVfbWl4LCBpbWFnZS50KTtcbiAgICBnbC51bmlmb3JtMmZ2KHByb2dyYW0udW5pZm9ybXMudV9wYXR0ZXJuX3NpemVfYSwgKGltYWdlUG9zQSAgICAgKS5kaXNwbGF5U2l6ZSk7XG4gICAgZ2wudW5pZm9ybTJmdihwcm9ncmFtLnVuaWZvcm1zLnVfcGF0dGVybl9zaXplX2IsIChpbWFnZVBvc0IgICAgICkuZGlzcGxheVNpemUpO1xuICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVuaWZvcm1zLnVfc2NhbGVfYSwgaW1hZ2UuZnJvbVNjYWxlKTtcbiAgICBnbC51bmlmb3JtMWYocHJvZ3JhbS51bmlmb3Jtcy51X3NjYWxlX2IsIGltYWdlLnRvU2NhbGUpO1xuXG4gICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgcGFpbnRlci5pbWFnZU1hbmFnZXIuYmluZChwYWludGVyLmNvbnRleHQpO1xufTtcblxuZXhwb3J0cy5zZXRUaWxlID0gZnVuY3Rpb24gKHRpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBwYWludGVyICAgICAgICAgLCBwcm9ncmFtICAgICAgICAgKSB7XG4gICAgY29uc3QgZ2wgPSBwYWludGVyLmNvbnRleHQuZ2w7XG5cbiAgICBnbC51bmlmb3JtMWYocHJvZ3JhbS51bmlmb3Jtcy51X3RpbGVfdW5pdHNfdG9fcGl4ZWxzLCAxIC8gcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgMSwgcGFpbnRlci50cmFuc2Zvcm0udGlsZVpvb20pKTtcblxuICAgIGNvbnN0IG51bVRpbGVzID0gTWF0aC5wb3coMiwgdGlsZS50aWxlSUQub3ZlcnNjYWxlZFopO1xuICAgIGNvbnN0IHRpbGVTaXplQXROZWFyZXN0Wm9vbSA9IHRpbGUudGlsZVNpemUgKiBNYXRoLnBvdygyLCBwYWludGVyLnRyYW5zZm9ybS50aWxlWm9vbSkgLyBudW1UaWxlcztcblxuICAgIGNvbnN0IHBpeGVsWCA9IHRpbGVTaXplQXROZWFyZXN0Wm9vbSAqICh0aWxlLnRpbGVJRC5jYW5vbmljYWwueCArIHRpbGUudGlsZUlELndyYXAgKiBudW1UaWxlcyk7XG4gICAgY29uc3QgcGl4ZWxZID0gdGlsZVNpemVBdE5lYXJlc3Rab29tICogdGlsZS50aWxlSUQuY2Fub25pY2FsLnk7XG5cbiAgICAvLyBzcGxpdCB0aGUgcGl4ZWwgY29vcmQgaW50byB0d28gcGFpcnMgb2YgMTYgYml0IG51bWJlcnMuIFRoZSBnbHNsIHNwZWMgb25seSBndWFyYW50ZWVzIDE2IGJpdHMgb2YgcHJlY2lzaW9uLlxuICAgIGdsLnVuaWZvcm0yZihwcm9ncmFtLnVuaWZvcm1zLnVfcGl4ZWxfY29vcmRfdXBwZXIsIHBpeGVsWCA+PiAxNiwgcGl4ZWxZID4+IDE2KTtcbiAgICBnbC51bmlmb3JtMmYocHJvZ3JhbS51bmlmb3Jtcy51X3BpeGVsX2Nvb3JkX2xvd2VyLCBwaXhlbFggJiAweEZGRkYsIHBpeGVsWSAmIDB4RkZGRik7XG59O1xuIiwiLy8gICAgICBcblxuY29uc3QgYnJvd3NlciA9IHJlcXVpcmUoJy4uL3V0aWwvYnJvd3NlcicpO1xuY29uc3Qgc2hhZGVycyA9IHJlcXVpcmUoJy4uL3NoYWRlcnMnKTtcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuY29uc3Qge1Byb2dyYW1Db25maWd1cmF0aW9ufSA9IHJlcXVpcmUoJy4uL2RhdGEvcHJvZ3JhbV9jb25maWd1cmF0aW9uJyk7XG5jb25zdCBWZXJ0ZXhBcnJheU9iamVjdCA9IHJlcXVpcmUoJy4vdmVydGV4X2FycmF5X29iamVjdCcpO1xuY29uc3QgQ29udGV4dCA9IHJlcXVpcmUoJy4uL2dsL2NvbnRleHQnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNsYXNzIFByb2dyYW0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQgICAgICAgICAsXG4gICAgICAgICAgICAgICAgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgIHNob3dPdmVyZHJhd0luc3BlY3RvciAgICAgICAgICkge1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTtcblxuICAgICAgICBjb25zdCBkZWZpbmVzID0gY29uZmlndXJhdGlvbi5kZWZpbmVzKCkuY29uY2F0KFxuICAgICAgICAgICAgYCNkZWZpbmUgREVWSUNFX1BJWEVMX1JBVElPICR7YnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvLnRvRml4ZWQoMSl9YCk7XG4gICAgICAgIGlmIChzaG93T3ZlcmRyYXdJbnNwZWN0b3IpIHtcbiAgICAgICAgICAgIGRlZmluZXMucHVzaCgnI2RlZmluZSBPVkVSRFJBV19JTlNQRUNUT1I7Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmcmFnbWVudFNvdXJjZSA9IGRlZmluZXMuY29uY2F0KHNoYWRlcnMucHJlbHVkZS5mcmFnbWVudFNvdXJjZSwgc291cmNlLmZyYWdtZW50U291cmNlKS5qb2luKCdcXG4nKTtcbiAgICAgICAgY29uc3QgdmVydGV4U291cmNlID0gZGVmaW5lcy5jb25jYXQoc2hhZGVycy5wcmVsdWRlLnZlcnRleFNvdXJjZSwgc291cmNlLnZlcnRleFNvdXJjZSkuam9pbignXFxuJyk7XG5cbiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoZ2wuRlJBR01FTlRfU0hBREVSKTtcbiAgICAgICAgZ2wuc2hhZGVyU291cmNlKGZyYWdtZW50U2hhZGVyLCBmcmFnbWVudFNvdXJjZSk7XG4gICAgICAgIGdsLmNvbXBpbGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpO1xuICAgICAgICBhc3NlcnQoZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKGZyYWdtZW50U2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUyksIChnbC5nZXRTaGFkZXJJbmZvTG9nKGZyYWdtZW50U2hhZGVyKSAgICAgKSk7XG4gICAgICAgIGdsLmF0dGFjaFNoYWRlcih0aGlzLnByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTtcblxuICAgICAgICBjb25zdCB2ZXJ0ZXhTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoZ2wuVkVSVEVYX1NIQURFUik7XG4gICAgICAgIGdsLnNoYWRlclNvdXJjZSh2ZXJ0ZXhTaGFkZXIsIHZlcnRleFNvdXJjZSk7XG4gICAgICAgIGdsLmNvbXBpbGVTaGFkZXIodmVydGV4U2hhZGVyKTtcbiAgICAgICAgYXNzZXJ0KGdsLmdldFNoYWRlclBhcmFtZXRlcih2ZXJ0ZXhTaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSwgKGdsLmdldFNoYWRlckluZm9Mb2codmVydGV4U2hhZGVyKSAgICAgKSk7XG4gICAgICAgIGdsLmF0dGFjaFNoYWRlcih0aGlzLnByb2dyYW0sIHZlcnRleFNoYWRlcik7XG5cbiAgICAgICAgLy8gTWFudWFsbHkgYmluZCBsYXlvdXQgYXR0cmlidXRlcyBpbiB0aGUgb3JkZXIgZGVmaW5lZCBieSB0aGVpclxuICAgICAgICAvLyBQcm9ncmFtSW50ZXJmYWNlIHNvIHRoYXQgd2UgZG9uJ3QgZHluYW1pY2FsbHkgbGluayBhbiB1bnVzZWRcbiAgICAgICAgLy8gYXR0cmlidXRlIGF0IHBvc2l0aW9uIDAsIHdoaWNoIGNhbiBjYXVzZSByZW5kZXJpbmcgdG8gZmFpbCBmb3IgYW5cbiAgICAgICAgLy8gZW50aXJlIGxheWVyIChzZWUgIzQ2MDcsICM0NzI4KVxuICAgICAgICBjb25zdCBsYXlvdXRBdHRyaWJ1dGVzID0gY29uZmlndXJhdGlvbi5sYXlvdXRBdHRyaWJ1dGVzIHx8IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxheW91dEF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGdsLmJpbmRBdHRyaWJMb2NhdGlvbih0aGlzLnByb2dyYW0sIGksIGxheW91dEF0dHJpYnV0ZXNbaV0ubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBnbC5saW5rUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xuICAgICAgICBhc3NlcnQoZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcih0aGlzLnByb2dyYW0sIGdsLkxJTktfU1RBVFVTKSwgKGdsLmdldFByb2dyYW1JbmZvTG9nKHRoaXMucHJvZ3JhbSkgICAgICkpO1xuXG4gICAgICAgIHRoaXMubnVtQXR0cmlidXRlcyA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIodGhpcy5wcm9ncmFtLCBnbC5BQ1RJVkVfQVRUUklCVVRFUyk7XG5cbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0ge307XG4gICAgICAgIHRoaXMudW5pZm9ybXMgPSB7fTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtQXR0cmlidXRlczsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBnbC5nZXRBY3RpdmVBdHRyaWIodGhpcy5wcm9ncmFtLCBpKTtcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXNbYXR0cmlidXRlLm5hbWVdID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24odGhpcy5wcm9ncmFtLCBhdHRyaWJ1dGUubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBudW1Vbmlmb3JtcyA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIodGhpcy5wcm9ncmFtLCBnbC5BQ1RJVkVfVU5JRk9STVMpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVVuaWZvcm1zOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaWZvcm0gPSBnbC5nZXRBY3RpdmVVbmlmb3JtKHRoaXMucHJvZ3JhbSwgaSk7XG4gICAgICAgICAgICBpZiAodW5pZm9ybSkge1xuICAgICAgICAgICAgICAgIHRoaXMudW5pZm9ybXNbdW5pZm9ybS5uYW1lXSA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sIHVuaWZvcm0ubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkcmF3KGNvbnRleHQgICAgICAgICAsXG4gICAgICAgICBkcmF3TW9kZSAgICAgICAgICAsXG4gICAgICAgICBsYXllcklEICAgICAgICAsXG4gICAgICAgICBsYXlvdXRWZXJ0ZXhCdWZmZXIgICAgICAgICAgICAgICxcbiAgICAgICAgIGluZGV4QnVmZmVyICAgICAgICAgICAgICxcbiAgICAgICAgIHNlZ21lbnRzICAgICAgICAgICAgICAgLFxuICAgICAgICAgY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgZHluYW1pY0xheW91dEJ1ZmZlciAgICAgICAgICAgICAgICxcbiAgICAgICAgIGR5bmFtaWNMYXlvdXRCdWZmZXIyICAgICAgICAgICAgICAgKSB7XG5cbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIGNvbnN0IHByaW1pdGl2ZVNpemUgPSB7XG4gICAgICAgICAgICBbZ2wuTElORVNdOiAyLFxuICAgICAgICAgICAgW2dsLlRSSUFOR0xFU106IDNcbiAgICAgICAgfVtkcmF3TW9kZV07XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNlZ21lbnRzLmdldCgpKSB7XG4gICAgICAgICAgICBjb25zdCB2YW9zID0gc2VnbWVudC52YW9zIHx8IChzZWdtZW50LnZhb3MgPSB7fSk7XG4gICAgICAgICAgICBjb25zdCB2YW8gICAgICAgICAgICAgICAgICAgID0gdmFvc1tsYXllcklEXSB8fCAodmFvc1tsYXllcklEXSA9IG5ldyBWZXJ0ZXhBcnJheU9iamVjdCgpKTtcblxuICAgICAgICAgICAgdmFvLmJpbmQoXG4gICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgIGxheW91dFZlcnRleEJ1ZmZlcixcbiAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uID8gY29uZmlndXJhdGlvbi5nZXRQYWludFZlcnRleEJ1ZmZlcnMoKSA6IFtdLFxuICAgICAgICAgICAgICAgIGluZGV4QnVmZmVyLFxuICAgICAgICAgICAgICAgIHNlZ21lbnQudmVydGV4T2Zmc2V0LFxuICAgICAgICAgICAgICAgIGR5bmFtaWNMYXlvdXRCdWZmZXIsXG4gICAgICAgICAgICAgICAgZHluYW1pY0xheW91dEJ1ZmZlcjJcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGdsLmRyYXdFbGVtZW50cyhcbiAgICAgICAgICAgICAgICBkcmF3TW9kZSxcbiAgICAgICAgICAgICAgICBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCAqIHByaW1pdGl2ZVNpemUsXG4gICAgICAgICAgICAgICAgZ2wuVU5TSUdORURfU0hPUlQsXG4gICAgICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVPZmZzZXQgKiBwcmltaXRpdmVTaXplICogMik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUHJvZ3JhbTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IHtIVE1MSW1hZ2VFbGVtZW50LCBIVE1MQ2FudmFzRWxlbWVudCwgSFRNTFZpZGVvRWxlbWVudCwgSW1hZ2VEYXRhfSA9IHJlcXVpcmUoJy4uL3V0aWwvd2luZG93Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgXG4gXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG5cbmNsYXNzIFRleHR1cmUge1xuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoY29udGV4dCAgICAgICAgICwgaW1hZ2UgICAgICAgICAgICAgICwgZm9ybWF0ICAgICAgICAgICAgICAgLCBwcmVtdWx0aXBseSAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcblxuICAgICAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBpbWFnZTtcbiAgICAgICAgdGhpcy5zaXplID0gW3dpZHRoLCBoZWlnaHRdO1xuICAgICAgICB0aGlzLmZvcm1hdCA9IGZvcm1hdDtcblxuICAgICAgICB0aGlzLnRleHR1cmUgPSBjb250ZXh0LmdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgdGhpcy51cGRhdGUoaW1hZ2UsIHByZW11bHRpcGx5KTtcbiAgICB9XG5cbiAgICB1cGRhdGUoaW1hZ2UgICAgICAgICAgICAgICwgcHJlbXVsdGlwbHkgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGltYWdlO1xuICAgICAgICB0aGlzLnNpemUgPSBbd2lkdGgsIGhlaWdodF07XG5cbiAgICAgICAgY29uc3Qge2NvbnRleHR9ID0gdGhpcztcbiAgICAgICAgY29uc3Qge2dsfSA9IGNvbnRleHQ7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG4gICAgICAgIGNvbnRleHQucGl4ZWxTdG9yZVVucGFjay5zZXQoMSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZm9ybWF0ID09PSBnbC5SR0JBICYmIHByZW11bHRpcGx5ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgY29udGV4dC5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYS5zZXQodHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHwgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSW1hZ2VEYXRhKSB7XG4gICAgICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIHRoaXMuZm9ybWF0LCB0aGlzLmZvcm1hdCwgZ2wuVU5TSUdORURfQllURSwgaW1hZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCB0aGlzLmZvcm1hdCwgd2lkdGgsIGhlaWdodCwgMCwgdGhpcy5mb3JtYXQsIGdsLlVOU0lHTkVEX0JZVEUsIGltYWdlLmRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZChmaWx0ZXIgICAgICAgICAgICAgICAsIHdyYXAgICAgICAgICAgICAgLCBtaW5GaWx0ZXIgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHtjb250ZXh0fSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHtnbH0gPSBjb250ZXh0O1xuICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpO1xuXG4gICAgICAgIGlmIChmaWx0ZXIgIT09IHRoaXMuZmlsdGVyKSB7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZmlsdGVyKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBtaW5GaWx0ZXIgfHwgZmlsdGVyKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHdyYXAgIT09IHRoaXMud3JhcCkge1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgd3JhcCk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCB3cmFwKTtcbiAgICAgICAgICAgIHRoaXMud3JhcCA9IHdyYXA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBjb25zdCB7Z2x9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBnbC5kZWxldGVUZXh0dXJlKHRoaXMudGV4dHVyZSk7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IChudWxsICAgICApO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUZXh0dXJlO1xuIiwiLy8gICAgICBcblxuY29uc3Qge092ZXJzY2FsZWRUaWxlSUQsIENhbm9uaWNhbFRpbGVJRH0gPSByZXF1aXJlKCcuLi9zb3VyY2UvdGlsZV9pZCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIFxuXG4vLyBVcGRhdGVzIHRoZSBUaWxlTWFza3MgZm9yIGFsbCByZW5kZXJhYmxlIHRpbGVzLiBBIFRpbGVNYXNrIGRlc2NyaWJlcyBhbGwgcmVnaW9uc1xuLy8gd2l0aGluIHRoYXQgdGlsZSB0aGF0IGFyZSAqbm90KiBjb3ZlcmVkIGJ5IG90aGVyIHJlbmRlcmFibGUgdGlsZXMuXG4vLyBFeGFtcGxlOiByZW5kZXJhYmxlVGlsZXMgaW4gb3VyIGxpc3QgYXJlIDIvMS8zLCAzLzMvNiwgYW5kIDQvNS8xMy4gVGhlIHNjaGVtYXRpYyBmb3IgY3JlYXRpbmcgdGhlXG4vLyBUaWxlTWFzayBmb3IgMi8xLzMgbG9va3MgbGlrZSB0aGlzOlxuLy9cbi8vICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuLy8gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUgiMjIyMjIyMjIyMjIyMjIyMj4pSCXG4vLyAgICDilIIgNC80LzEyIOKUgiA0LzUvMTIg4pSCIyMjIyMjIyMjIyMjIyMjIyPilIJcbi8vICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIIjIyMjIyMjIyMjIyMjIyMjI+KUglxuLy8gICAg4pSc4pSA4pSA4pSA4pSA4pSA4pSAMy8yLzbilIDilIDilIDilIDilIDilIDilKQjIyMjIzMvMy82IyMjIyMjI+KUglxuLy8gICAg4pSCICAgICAgICDilIIjIyMjIyMjI+KUgiMjIyMjIyMjIyMjIyMjIyMj4pSCXG4vLyAgICDilIIgNC80LzEzIOKUgiM0LzUvMTMj4pSCIyMjIyMjIyMjIyMjIyMjIyPilIJcbi8vICAgIOKUgiAgICAgICAg4pSCIyMjIyMjIyPilIIjIyMjIyMjIyMjIyMjIyMjI+KUglxuLy8gICAg4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSA4pSA4pSAMi8xLzPilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKRcbi8vICAgIOKUgiAgICAgICAgICAgICAgICAg4pSCICAgICAgICAgICAgICAgICDilIJcbi8vICAgIOKUgiAgICAgICAgICAgICAgICAg4pSCICAgICAgICAgICAgICAgICDilIJcbi8vICAgIOKUgiAgICAgICAgICAgICAgICAg4pSCICAgICAgICAgICAgICAgICDilIJcbi8vICAgIOKUgiAgICAgIDMvMi83ICAgICAg4pSCICAgICAgMy8zLzcgICAgICDilIJcbi8vICAgIOKUgiAgICAgICAgICAgICAgICAg4pSCICAgICAgICAgICAgICAgICDilIJcbi8vICAgIOKUgiAgICAgICAgICAgICAgICAg4pSCICAgICAgICAgICAgICAgICDilIJcbi8vICAgIOKUgiAgICAgICAgICAgICAgICAg4pSCICAgICAgICAgICAgICAgICDilIJcbi8vICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuLy9cbi8vIFRoZSBUaWxlTWFzayBmb3IgMi8xLzMgdGh1cyBjb25zaXN0cyBvZiB0aGUgdGlsZXMgNC80LzEyLCA0LzUvMTIsIDQvNC8xMywgMy8yLzcsIGFuZCAzLzMvNyxcbi8vIGJ1dCBpdCBkb2VzICpub3QqIGluY2x1ZGUgNC81LzEzLCBhbmQgMy8zLzYsIHNpbmNlIHRoZXNlIGFyZSBvdGhlciByZW5kZXJhYmxlVGlsZXMuXG4vLyBBIFRpbGVNYXNrIGFsd2F5cyBjb250YWlucyBUaWxlSURzICpyZWxhdGl2ZSogdG8gdGhlIHRpbGUgaXQgaXMgZ2VuZXJhdGVkIGZvciwgc28gMi8xLzMgaXNcbi8vIFwic3VidHJhY3RlZFwiIGZyb20gdGhlc2UgVGlsZUlEcy4gVGhlIGZpbmFsIFRpbGVNYXNrIGZvciAyLzEvMyB3aWxsIHRodXMgYmU6XG4vL1xuLy8gICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4vLyAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCIyMjIyMjIyMjIyMjIyMjIyPilIJcbi8vICAgIOKUgiAyLzAvMCAg4pSCIDIvMS8wICDilIIjIyMjIyMjIyMjIyMjIyMjI+KUglxuLy8gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUgiMjIyMjIyMjIyMjIyMjIyMj4pSCXG4vLyAgICDilJzilIDilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilIDilKQjIyMjIyMjIyMjIyMjIyMjI+KUglxuLy8gICAg4pSCICAgICAgICDilIIjIyMjIyMjI+KUgiMjIyMjIyMjIyMjIyMjIyMj4pSCXG4vLyAgICDilIIgMi8wLzEgIOKUgiMjIyMjIyMj4pSCIyMjIyMjIyMjIyMjIyMjIyPilIJcbi8vICAgIOKUgiAgICAgICAg4pSCIyMjIyMjIyPilIIjIyMjIyMjIyMjIyMjIyMjI+KUglxuLy8gICAg4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSkXG4vLyAgICDilIIgICAgICAgICAgICAgICAgIOKUgiAgICAgICAgICAgICAgICAg4pSCXG4vLyAgICDilIIgICAgICAgICAgICAgICAgIOKUgiAgICAgICAgICAgICAgICAg4pSCXG4vLyAgICDilIIgICAgICAgICAgICAgICAgIOKUgiAgICAgICAgICAgICAgICAg4pSCXG4vLyAgICDilIIgICAgICAxLzAvMSAgICAgIOKUgiAgICAgIDEvMS8xICAgICAg4pSCXG4vLyAgICDilIIgICAgICAgICAgICAgICAgIOKUgiAgICAgICAgICAgICAgICAg4pSCXG4vLyAgICDilIIgICAgICAgICAgICAgICAgIOKUgiAgICAgICAgICAgICAgICAg4pSCXG4vLyAgICDilIIgICAgICAgICAgICAgICAgIOKUgiAgICAgICAgICAgICAgICAg4pSCXG4vLyAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbi8vXG4vLyBPbmx5IG90aGVyIHJlbmRlcmFibGUgdGlsZXMgdGhhdCBhcmUgKmNoaWxkcmVuKiBvZiB0aGUgdGlsZSB3ZSBhcmUgZ2VuZXJhdGluZyB0aGUgbWFzayBmb3Igd2lsbFxuLy8gYmUgY29uc2lkZXJlZC4gRm9yIGV4YW1wbGUsIGFkZGluZyBUaWxlSUQgNC84LzEzIHRvIHJlbmRlcmFibGVUaWxlcyB3b24ndCBhZmZlY3QgdGhlIFRpbGVNYXNrIGZvclxuLy8gMi8xLzMsIHNpbmNlIGl0IGlzIG5vdCBhIGRlc2NlbmRhbnQgb2YgaXQuXG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihyZW5kZXJhYmxlVGlsZXMgICAgICAgICAgICAgLCBjb250ZXh0ICAgICAgICAgKSB7XG4gICAgY29uc3Qgc29ydGVkUmVuZGVyYWJsZXMgPSByZW5kZXJhYmxlVGlsZXMuc29ydCgoYSwgYikgPT4geyByZXR1cm4gYS50aWxlSUQuaXNMZXNzVGhhbihiLnRpbGVJRCkgPyAtMSA6IGIudGlsZUlELmlzTGVzc1RoYW4oYS50aWxlSUQpID8gMSA6IDA7IH0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWRSZW5kZXJhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBtYXNrID0ge307XG4gICAgICAgIGNvbnN0IHRpbGUgPSAgc29ydGVkUmVuZGVyYWJsZXNbaV07XG4gICAgICAgIGNvbnN0IGNoaWxkQXJyYXkgPSBzb3J0ZWRSZW5kZXJhYmxlcy5zbGljZShpICsgMSk7XG4gICAgICAgIC8vIFRyeSB0byBhZGQgYWxsIHJlbWFpbmluZyBpZHMgYXMgY2hpbGRyZW4uIFdlIHNvcnRlZCB0aGUgdGlsZSBsaXN0XG4gICAgICAgIC8vIGJ5IHogZWFybGllciwgc28gYWxsIHByZWNlZGluZyBpdGVtcyBjYW5ub3QgYmUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnRcbiAgICAgICAgLy8gdGlsZS4gV2UgYWxzbyBjb21wdXRlIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgbmV4dCB3cmFwLCBiZWNhdXNlIGl0ZW1zIG9mIHRoZSBuZXh0IHdyYXBcbiAgICAgICAgLy8gY2FuIG5ldmVyIGJlIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IHdyYXAuXG5cbiAgICAgICAgY29tcHV0ZVRpbGVNYXNrcyh0aWxlLnRpbGVJRC53cmFwcGVkKCksIHRpbGUudGlsZUlELCBjaGlsZEFycmF5LCBuZXcgT3ZlcnNjYWxlZFRpbGVJRCgwLCB0aWxlLnRpbGVJRC53cmFwICsgMSwgMCwgMCwgMCksIG1hc2spO1xuICAgICAgICB0aWxlLnNldE1hc2sobWFzaywgY29udGV4dCk7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gY29tcHV0ZVRpbGVNYXNrcyhyb290VGlsZSAgICAgICAgICAgICAgICAgICwgcmVmICAgICAgICAgICAgICAgICAgLCBjaGlsZEFycmF5ICAgICAgICAgICAgICwgbG93ZXJCb3VuZCAgICAgICAgICAgICAgICAgICwgbWFzayAgICAgICkge1xuICAgIC8vIElmIHRoZSByZWZlcmVuY2Ugb3IgYW55IG9mIGl0cyBjaGlsZHJlbiBpcyBmb3VuZCBpbiB0aGUgbGlzdCwgd2UgbmVlZCB0byByZWN1cnNlLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZFRpbGUgPSBjaGlsZEFycmF5W2ldO1xuICAgICAgICAvLyBjaGlsZFRpbGUgaXMgZnJvbSBhIGxhcmdlciB3cmFwIHRoYW4gdGhlIHJvb3RUaWxlIHNvIGl0IGNhbm5vdCBiZSBhIGNoaWxkIHRpbGVcbiAgICAgICAgaWYgKGxvd2VyQm91bmQuaXNMZXNzVGhhbihjaGlsZFRpbGUudGlsZUlEKSkgYnJlYWs7XG4gICAgICAgIC8vIFRoZSBjdXJyZW50IHRpbGUgaXMgbWFza2VkIG91dCwgc28gd2UgZG9uJ3QgbmVlZCB0byBhZGQgdGhlbSB0byB0aGUgbWFzayBzZXQuXG4gICAgICAgIGlmIChyZWYua2V5ID09PSBjaGlsZFRpbGUudGlsZUlELmtleSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkVGlsZS50aWxlSUQuaXNDaGlsZE9mKHJlZikpIHtcbiAgICAgICAgICAgIC8vIFRoZXJlJ3MgYXQgbGVhc3Qgb25lIGNoaWxkIHRpbGUgdGhhdCBpcyBtYXNrZWQgb3V0LCBzbyByZWN1cnNpdmVseSBkZXNjZW5kXG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHJlZi5jaGlsZHJlbihJbmZpbml0eSk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltqXTtcbiAgICAgICAgICAgICAgICBjb21wdXRlVGlsZU1hc2tzKHJvb3RUaWxlLCBjaGlsZCwgY2hpbGRBcnJheS5zbGljZShpKSwgbG93ZXJCb3VuZCwgbWFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gV2UgY291bGRuJ3QgZmluZCBhIGNoaWxkLCBzbyBpdCdzIGRlZmluaXRlbHkgYSBtYXNrZWQgcGFydC5cbiAgICAvLyBDb21wdXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJvb3QgdGlsZSBJRCBhbmQgdGhlIHJlZmVyZW5jZSB0aWxlIElELCBzaW5jZSBUaWxlTWFza1xuICAgIC8vIGVsZW1lbnRzIGFyZSBhbHdheXMgcmVsYXRpdmUgKHNlZSBiZWxvdyBmb3IgZXhwbGFuYXRpb24pLlxuICAgIGNvbnN0IGRpZmZaID0gcmVmLm92ZXJzY2FsZWRaIC0gcm9vdFRpbGUub3ZlcnNjYWxlZFo7XG4gICAgY29uc3QgbWFza1RpbGVJZCA9IG5ldyBDYW5vbmljYWxUaWxlSUQoZGlmZlosIHJlZi5jYW5vbmljYWwueCAtIChyb290VGlsZS5jYW5vbmljYWwueCA8PCBkaWZmWiksIHJlZi5jYW5vbmljYWwueSAtIChyb290VGlsZS5jYW5vbmljYWwueSA8PCBkaWZmWikpO1xuICAgIG1hc2tbbWFza1RpbGVJZC5rZXldID0gbWFza1ttYXNrVGlsZUlkLmtleV0gfHwgbWFza1RpbGVJZDtcbn1cbiIsIi8vICAgICAgXG5cbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuY2xhc3MgVmVydGV4QXJyYXlPYmplY3Qge1xuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5ib3VuZFByb2dyYW0gPSBudWxsO1xuICAgICAgICB0aGlzLmJvdW5kTGF5b3V0VmVydGV4QnVmZmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5ib3VuZFBhaW50VmVydGV4QnVmZmVycyA9IFtdO1xuICAgICAgICB0aGlzLmJvdW5kSW5kZXhCdWZmZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmJvdW5kVmVydGV4T2Zmc2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5ib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnZhbyA9IG51bGw7XG4gICAgfVxuXG4gICAgYmluZChjb250ZXh0ICAgICAgICAgLFxuICAgICAgICAgcHJvZ3JhbSAgICAgICAgICxcbiAgICAgICAgIGxheW91dFZlcnRleEJ1ZmZlciAgICAgICAgICAgICAgLFxuICAgICAgICAgcGFpbnRWZXJ0ZXhCdWZmZXJzICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgaW5kZXhCdWZmZXIgICAgICAgICAgICAgICxcbiAgICAgICAgIHZlcnRleE9mZnNldCAgICAgICAgICxcbiAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIgICAgICAgICAgICAgICAsXG4gICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyMiAgICAgICAgICAgICAgICkge1xuXG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG5cbiAgICAgICAgbGV0IHBhaW50QnVmZmVyc0RpZmZlciA9IHRoaXMuYm91bmRQYWludFZlcnRleEJ1ZmZlcnMubGVuZ3RoICE9PSBwYWludFZlcnRleEJ1ZmZlcnMubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhaW50QnVmZmVyc0RpZmZlciAmJiBpIDwgcGFpbnRWZXJ0ZXhCdWZmZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ib3VuZFBhaW50VmVydGV4QnVmZmVyc1tpXSAhPT0gcGFpbnRWZXJ0ZXhCdWZmZXJzW2ldKSB7XG4gICAgICAgICAgICAgICAgcGFpbnRCdWZmZXJzRGlmZmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzRnJlc2hCaW5kUmVxdWlyZWQgPSAoXG4gICAgICAgICAgICAhdGhpcy52YW8gfHxcbiAgICAgICAgICAgIHRoaXMuYm91bmRQcm9ncmFtICE9PSBwcm9ncmFtIHx8XG4gICAgICAgICAgICB0aGlzLmJvdW5kTGF5b3V0VmVydGV4QnVmZmVyICE9PSBsYXlvdXRWZXJ0ZXhCdWZmZXIgfHxcbiAgICAgICAgICAgIHBhaW50QnVmZmVyc0RpZmZlciB8fFxuICAgICAgICAgICAgdGhpcy5ib3VuZEluZGV4QnVmZmVyICE9PSBpbmRleEJ1ZmZlciB8fFxuICAgICAgICAgICAgdGhpcy5ib3VuZFZlcnRleE9mZnNldCAhPT0gdmVydGV4T2Zmc2V0IHx8XG4gICAgICAgICAgICB0aGlzLmJvdW5kRHluYW1pY1ZlcnRleEJ1ZmZlciAhPT0gZHluYW1pY1ZlcnRleEJ1ZmZlciB8fFxuICAgICAgICAgICAgdGhpcy5ib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIyICE9PSBkeW5hbWljVmVydGV4QnVmZmVyMlxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghY29udGV4dC5leHRWZXJ0ZXhBcnJheU9iamVjdCB8fCBpc0ZyZXNoQmluZFJlcXVpcmVkKSB7XG4gICAgICAgICAgICB0aGlzLmZyZXNoQmluZChwcm9ncmFtLCBsYXlvdXRWZXJ0ZXhCdWZmZXIsIHBhaW50VmVydGV4QnVmZmVycywgaW5kZXhCdWZmZXIsIHZlcnRleE9mZnNldCwgZHluYW1pY1ZlcnRleEJ1ZmZlciwgZHluYW1pY1ZlcnRleEJ1ZmZlcjIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGV4dC5iaW5kVmVydGV4QXJyYXlPRVMuc2V0KHRoaXMudmFvKTtcblxuICAgICAgICAgICAgaWYgKGR5bmFtaWNWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgYnVmZmVyIG1heSBoYXZlIGJlZW4gdXBkYXRlZC4gUmViaW5kIHRvIHVwbG9hZCBkYXRhLlxuICAgICAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIuYmluZCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaW5kZXhCdWZmZXIgJiYgaW5kZXhCdWZmZXIuZHluYW1pY0RyYXcpIHtcbiAgICAgICAgICAgICAgICBpbmRleEJ1ZmZlci5iaW5kKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkeW5hbWljVmVydGV4QnVmZmVyMikge1xuICAgICAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIyLmJpbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZyZXNoQmluZChwcm9ncmFtICAgICAgICAgLFxuICAgICAgICAgICAgICBsYXlvdXRWZXJ0ZXhCdWZmZXIgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgcGFpbnRWZXJ0ZXhCdWZmZXJzICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICBpbmRleEJ1ZmZlciAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICB2ZXJ0ZXhPZmZzZXQgICAgICAgICAsXG4gICAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIyICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGxldCBudW1QcmV2QXR0cmlidXRlcztcbiAgICAgICAgY29uc3QgbnVtTmV4dEF0dHJpYnV0ZXMgPSBwcm9ncmFtLm51bUF0dHJpYnV0ZXM7XG5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIGlmIChjb250ZXh0LmV4dFZlcnRleEFycmF5T2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy52YW8pIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy52YW8gPSBjb250ZXh0LmV4dFZlcnRleEFycmF5T2JqZWN0LmNyZWF0ZVZlcnRleEFycmF5T0VTKCk7XG4gICAgICAgICAgICBjb250ZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUy5zZXQodGhpcy52YW8pO1xuICAgICAgICAgICAgbnVtUHJldkF0dHJpYnV0ZXMgPSAwO1xuXG4gICAgICAgICAgICAvLyBzdG9yZSB0aGUgYXJndW1lbnRzIHNvIHRoYXQgd2UgY2FuIHZlcmlmeSB0aGVtIHdoZW4gdGhlIHZhbyBpcyBib3VuZCBhZ2FpblxuICAgICAgICAgICAgdGhpcy5ib3VuZFByb2dyYW0gPSBwcm9ncmFtO1xuICAgICAgICAgICAgdGhpcy5ib3VuZExheW91dFZlcnRleEJ1ZmZlciA9IGxheW91dFZlcnRleEJ1ZmZlcjtcbiAgICAgICAgICAgIHRoaXMuYm91bmRQYWludFZlcnRleEJ1ZmZlcnMgPSBwYWludFZlcnRleEJ1ZmZlcnM7XG4gICAgICAgICAgICB0aGlzLmJvdW5kSW5kZXhCdWZmZXIgPSBpbmRleEJ1ZmZlcjtcbiAgICAgICAgICAgIHRoaXMuYm91bmRWZXJ0ZXhPZmZzZXQgPSB2ZXJ0ZXhPZmZzZXQ7XG4gICAgICAgICAgICB0aGlzLmJvdW5kRHluYW1pY1ZlcnRleEJ1ZmZlciA9IGR5bmFtaWNWZXJ0ZXhCdWZmZXI7XG4gICAgICAgICAgICB0aGlzLmJvdW5kRHluYW1pY1ZlcnRleEJ1ZmZlcjIgPSBkeW5hbWljVmVydGV4QnVmZmVyMjtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbnVtUHJldkF0dHJpYnV0ZXMgPSBjb250ZXh0LmN1cnJlbnROdW1BdHRyaWJ1dGVzIHx8IDA7XG5cbiAgICAgICAgICAgIC8vIERpc2FibGUgYWxsIGF0dHJpYnV0ZXMgZnJvbSB0aGUgcHJldmlvdXMgcHJvZ3JhbSB0aGF0IGFyZW4ndCB1c2VkIGluXG4gICAgICAgICAgICAvLyB0aGUgbmV3IHByb2dyYW0uIE5vdGU6IGF0dHJpYnV0ZSBpbmRpY2VzIGFyZSAqbm90KiBwcm9ncmFtIHNwZWNpZmljIVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG51bU5leHRBdHRyaWJ1dGVzOyBpIDwgbnVtUHJldkF0dHJpYnV0ZXM7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIFdlYkdMIGJyZWFrcyBpZiB5b3UgZGlzYWJsZSBhdHRyaWJ1dGUgMC5cbiAgICAgICAgICAgICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzIwMzA1MjMxXG4gICAgICAgICAgICAgICAgYXNzZXJ0KGkgIT09IDApO1xuICAgICAgICAgICAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxheW91dFZlcnRleEJ1ZmZlci5lbmFibGVBdHRyaWJ1dGVzKGdsLCBwcm9ncmFtKTtcbiAgICAgICAgZm9yIChjb25zdCB2ZXJ0ZXhCdWZmZXIgb2YgcGFpbnRWZXJ0ZXhCdWZmZXJzKSB7XG4gICAgICAgICAgICB2ZXJ0ZXhCdWZmZXIuZW5hYmxlQXR0cmlidXRlcyhnbCwgcHJvZ3JhbSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZHluYW1pY1ZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlci5lbmFibGVBdHRyaWJ1dGVzKGdsLCBwcm9ncmFtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZHluYW1pY1ZlcnRleEJ1ZmZlcjIpIHtcbiAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIyLmVuYWJsZUF0dHJpYnV0ZXMoZ2wsIHByb2dyYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGF5b3V0VmVydGV4QnVmZmVyLmJpbmQoKTtcbiAgICAgICAgbGF5b3V0VmVydGV4QnVmZmVyLnNldFZlcnRleEF0dHJpYlBvaW50ZXJzKGdsLCBwcm9ncmFtLCB2ZXJ0ZXhPZmZzZXQpO1xuICAgICAgICBmb3IgKGNvbnN0IHZlcnRleEJ1ZmZlciBvZiBwYWludFZlcnRleEJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIHZlcnRleEJ1ZmZlci5iaW5kKCk7XG4gICAgICAgICAgICB2ZXJ0ZXhCdWZmZXIuc2V0VmVydGV4QXR0cmliUG9pbnRlcnMoZ2wsIHByb2dyYW0sIHZlcnRleE9mZnNldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZHluYW1pY1ZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlci5iaW5kKCk7XG4gICAgICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyLnNldFZlcnRleEF0dHJpYlBvaW50ZXJzKGdsLCBwcm9ncmFtLCB2ZXJ0ZXhPZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleEJ1ZmZlcikge1xuICAgICAgICAgICAgaW5kZXhCdWZmZXIuYmluZCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkeW5hbWljVmVydGV4QnVmZmVyMikge1xuICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjIuYmluZCgpO1xuICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjIuc2V0VmVydGV4QXR0cmliUG9pbnRlcnMoZ2wsIHByb2dyYW0sIHZlcnRleE9mZnNldCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LmN1cnJlbnROdW1BdHRyaWJ1dGVzID0gbnVtTmV4dEF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMudmFvKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZXh0VmVydGV4QXJyYXlPYmplY3QuZGVsZXRlVmVydGV4QXJyYXlPRVModGhpcy52YW8pO1xuICAgICAgICAgICAgdGhpcy52YW8gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFZlcnRleEFycmF5T2JqZWN0O1xuIiwiLy8gICAgICBcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuXG4vKipcbiAqIFBhY2tzIHR3byBudW1iZXJzLCBpbnRlcnByZXRlZCBhcyA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VycywgaW50byBhIHNpbmdsZVxuICogZmxvYXQuICBVbnBhY2sgdGhlbSBpbiB0aGUgc2hhZGVyIHVzaW5nIHRoZSBgdW5wYWNrX2Zsb2F0KClgIGZ1bmN0aW9uLFxuICogZGVmaW5lZCBpbiBfcHJlbHVkZS52ZXJ0ZXguZ2xzbFxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMucGFja1VpbnQ4VG9GbG9hdCA9IGZ1bmN0aW9uIHBhY2soYSAgICAgICAgLCBiICAgICAgICApIHtcbiAgICAvLyBjb2VyY2UgYSBhbmQgYiB0byA4LWJpdCBpbnRzXG4gICAgYSA9IHV0aWwuY2xhbXAoTWF0aC5mbG9vcihhKSwgMCwgMjU1KTtcbiAgICBiID0gdXRpbC5jbGFtcChNYXRoLmZsb29yKGIpLCAwLCAyNTUpO1xuICAgIHJldHVybiAyNTYgKiBhICsgYjtcbn07XG5cbiIsIi8vICAgICAgXG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcblxuLy8gcmVhZEZpbGVTeW5jIGNhbGxzIG11c3QgYmUgd3JpdHRlbiBvdXQgbG9uZy1mb3JtIGZvciBicmZzLlxuLyogZXNsaW50LWRpc2FibGUgcHJlZmVyLXRlbXBsYXRlLCBuby1wYXRoLWNvbmNhdCAqL1xuXG5jb25zdCBzaGFkZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0ge1xuICAgIHByZWx1ZGU6IHtcbiAgICAgICAgZnJhZ21lbnRTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL3NoYWRlcnMvX3ByZWx1ZGUuZnJhZ21lbnQuZ2xzbCcsICd1dGY4JyksXG4gICAgICAgIHZlcnRleFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vc2hhZGVycy9fcHJlbHVkZS52ZXJ0ZXguZ2xzbCcsICd1dGY4JylcbiAgICB9LFxuICAgIGJhY2tncm91bmQ6IHtcbiAgICAgICAgZnJhZ21lbnRTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL3NoYWRlcnMvYmFja2dyb3VuZC5mcmFnbWVudC5nbHNsJywgJ3V0ZjgnKSxcbiAgICAgICAgdmVydGV4U291cmNlOiBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9zaGFkZXJzL2JhY2tncm91bmQudmVydGV4Lmdsc2wnLCAndXRmOCcpXG4gICAgfSxcbiAgICBiYWNrZ3JvdW5kUGF0dGVybjoge1xuICAgICAgICBmcmFnbWVudFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vc2hhZGVycy9iYWNrZ3JvdW5kX3BhdHRlcm4uZnJhZ21lbnQuZ2xzbCcsICd1dGY4JyksXG4gICAgICAgIHZlcnRleFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vc2hhZGVycy9iYWNrZ3JvdW5kX3BhdHRlcm4udmVydGV4Lmdsc2wnLCAndXRmOCcpXG4gICAgfSxcbiAgICBjaXJjbGU6IHtcbiAgICAgICAgZnJhZ21lbnRTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL3NoYWRlcnMvY2lyY2xlLmZyYWdtZW50Lmdsc2wnLCAndXRmOCcpLFxuICAgICAgICB2ZXJ0ZXhTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL3NoYWRlcnMvY2lyY2xlLnZlcnRleC5nbHNsJywgJ3V0ZjgnKVxuICAgIH0sXG4gICAgY2xpcHBpbmdNYXNrOiB7XG4gICAgICAgIGZyYWdtZW50U291cmNlOiBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9zaGFkZXJzL2NsaXBwaW5nX21hc2suZnJhZ21lbnQuZ2xzbCcsICd1dGY4JyksXG4gICAgICAgIHZlcnRleFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vc2hhZGVycy9jbGlwcGluZ19tYXNrLnZlcnRleC5nbHNsJywgJ3V0ZjgnKVxuICAgIH0sXG4gICAgaGVhdG1hcDoge1xuICAgICAgICBmcmFnbWVudFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vc2hhZGVycy9oZWF0bWFwLmZyYWdtZW50Lmdsc2wnLCAndXRmOCcpLFxuICAgICAgICB2ZXJ0ZXhTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL3NoYWRlcnMvaGVhdG1hcC52ZXJ0ZXguZ2xzbCcsICd1dGY4JylcbiAgICB9LFxuICAgIGhlYXRtYXBUZXh0dXJlOiB7XG4gICAgICAgIGZyYWdtZW50U291cmNlOiBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9zaGFkZXJzL2hlYXRtYXBfdGV4dHVyZS5mcmFnbWVudC5nbHNsJywgJ3V0ZjgnKSxcbiAgICAgICAgdmVydGV4U291cmNlOiBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9zaGFkZXJzL2hlYXRtYXBfdGV4dHVyZS52ZXJ0ZXguZ2xzbCcsICd1dGY4JylcbiAgICB9LFxuICAgIGNvbGxpc2lvbkJveDoge1xuICAgICAgICBmcmFnbWVudFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vc2hhZGVycy9jb2xsaXNpb25fYm94LmZyYWdtZW50Lmdsc2wnLCAndXRmOCcpLFxuICAgICAgICB2ZXJ0ZXhTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL3NoYWRlcnMvY29sbGlzaW9uX2JveC52ZXJ0ZXguZ2xzbCcsICd1dGY4JylcbiAgICB9LFxuICAgIGNvbGxpc2lvbkNpcmNsZToge1xuICAgICAgICBmcmFnbWVudFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vc2hhZGVycy9jb2xsaXNpb25fY2lyY2xlLmZyYWdtZW50Lmdsc2wnLCAndXRmOCcpLFxuICAgICAgICB2ZXJ0ZXhTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL3NoYWRlcnMvY29sbGlzaW9uX2NpcmNsZS52ZXJ0ZXguZ2xzbCcsICd1dGY4JylcbiAgICB9LFxuICAgIGRlYnVnOiB7XG4gICAgICAgIGZyYWdtZW50U291cmNlOiBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9zaGFkZXJzL2RlYnVnLmZyYWdtZW50Lmdsc2wnLCAndXRmOCcpLFxuICAgICAgICB2ZXJ0ZXhTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL3NoYWRlcnMvZGVidWcudmVydGV4Lmdsc2wnLCAndXRmOCcpXG4gICAgfSxcbiAgICBmaWxsOiB7XG4gICAgICAgIGZyYWdtZW50U291cmNlOiBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9zaGFkZXJzL2ZpbGwuZnJhZ21lbnQuZ2xzbCcsICd1dGY4JyksXG4gICAgICAgIHZlcnRleFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vc2hhZGVycy9maWxsLnZlcnRleC5nbHNsJywgJ3V0ZjgnKVxuICAgIH0sXG4gICAgZmlsbE91dGxpbmU6IHtcbiAgICAgICAgZnJhZ21lbnRTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL3NoYWRlcnMvZmlsbF9vdXRsaW5lLmZyYWdtZW50Lmdsc2wnLCAndXRmOCcpLFxuICAgICAgICB2ZXJ0ZXhTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL3NoYWRlcnMvZmlsbF9vdXRsaW5lLnZlcnRleC5nbHNsJywgJ3V0ZjgnKVxuICAgIH0sXG4gICAgZmlsbE91dGxpbmVQYXR0ZXJuOiB7XG4gICAgICAgIGZyYWdtZW50U291cmNlOiBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9zaGFkZXJzL2ZpbGxfb3V0bGluZV9wYXR0ZXJuLmZyYWdtZW50Lmdsc2wnLCAndXRmOCcpLFxuICAgICAgICB2ZXJ0ZXhTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL3NoYWRlcnMvZmlsbF9vdXRsaW5lX3BhdHRlcm4udmVydGV4Lmdsc2wnLCAndXRmOCcpXG4gICAgfSxcbiAgICBmaWxsUGF0dGVybjoge1xuICAgICAgICBmcmFnbWVudFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vc2hhZGVycy9maWxsX3BhdHRlcm4uZnJhZ21lbnQuZ2xzbCcsICd1dGY4JyksXG4gICAgICAgIHZlcnRleFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vc2hhZGVycy9maWxsX3BhdHRlcm4udmVydGV4Lmdsc2wnLCAndXRmOCcpXG4gICAgfSxcbiAgICBmaWxsRXh0cnVzaW9uOiB7XG4gICAgICAgIGZyYWdtZW50U291cmNlOiBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9zaGFkZXJzL2ZpbGxfZXh0cnVzaW9uLmZyYWdtZW50Lmdsc2wnLCAndXRmOCcpLFxuICAgICAgICB2ZXJ0ZXhTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL3NoYWRlcnMvZmlsbF9leHRydXNpb24udmVydGV4Lmdsc2wnLCAndXRmOCcpXG4gICAgfSxcbiAgICBmaWxsRXh0cnVzaW9uUGF0dGVybjoge1xuICAgICAgICBmcmFnbWVudFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vc2hhZGVycy9maWxsX2V4dHJ1c2lvbl9wYXR0ZXJuLmZyYWdtZW50Lmdsc2wnLCAndXRmOCcpLFxuICAgICAgICB2ZXJ0ZXhTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL3NoYWRlcnMvZmlsbF9leHRydXNpb25fcGF0dGVybi52ZXJ0ZXguZ2xzbCcsICd1dGY4JylcbiAgICB9LFxuICAgIGV4dHJ1c2lvblRleHR1cmU6IHtcbiAgICAgICAgZnJhZ21lbnRTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL3NoYWRlcnMvZXh0cnVzaW9uX3RleHR1cmUuZnJhZ21lbnQuZ2xzbCcsICd1dGY4JyksXG4gICAgICAgIHZlcnRleFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vc2hhZGVycy9leHRydXNpb25fdGV4dHVyZS52ZXJ0ZXguZ2xzbCcsICd1dGY4JylcbiAgICB9LFxuICAgIGhpbGxzaGFkZVByZXBhcmU6IHtcbiAgICAgICAgZnJhZ21lbnRTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL3NoYWRlcnMvaGlsbHNoYWRlX3ByZXBhcmUuZnJhZ21lbnQuZ2xzbCcsICd1dGY4JyksXG4gICAgICAgIHZlcnRleFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vc2hhZGVycy9oaWxsc2hhZGVfcHJlcGFyZS52ZXJ0ZXguZ2xzbCcsICd1dGY4JylcbiAgICB9LFxuICAgIGhpbGxzaGFkZToge1xuICAgICAgICBmcmFnbWVudFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vc2hhZGVycy9oaWxsc2hhZGUuZnJhZ21lbnQuZ2xzbCcsICd1dGY4JyksXG4gICAgICAgIHZlcnRleFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vc2hhZGVycy9oaWxsc2hhZGUudmVydGV4Lmdsc2wnLCAndXRmOCcpXG4gICAgfSxcbiAgICBsaW5lOiB7XG4gICAgICAgIGZyYWdtZW50U291cmNlOiBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9zaGFkZXJzL2xpbmUuZnJhZ21lbnQuZ2xzbCcsICd1dGY4JyksXG4gICAgICAgIHZlcnRleFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vc2hhZGVycy9saW5lLnZlcnRleC5nbHNsJywgJ3V0ZjgnKVxuICAgIH0sXG4gICAgbGluZVBhdHRlcm46IHtcbiAgICAgICAgZnJhZ21lbnRTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL3NoYWRlcnMvbGluZV9wYXR0ZXJuLmZyYWdtZW50Lmdsc2wnLCAndXRmOCcpLFxuICAgICAgICB2ZXJ0ZXhTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL3NoYWRlcnMvbGluZV9wYXR0ZXJuLnZlcnRleC5nbHNsJywgJ3V0ZjgnKVxuICAgIH0sXG4gICAgbGluZVNERjoge1xuICAgICAgICBmcmFnbWVudFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vc2hhZGVycy9saW5lX3NkZi5mcmFnbWVudC5nbHNsJywgJ3V0ZjgnKSxcbiAgICAgICAgdmVydGV4U291cmNlOiBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9zaGFkZXJzL2xpbmVfc2RmLnZlcnRleC5nbHNsJywgJ3V0ZjgnKVxuICAgIH0sXG4gICAgcmFzdGVyOiB7XG4gICAgICAgIGZyYWdtZW50U291cmNlOiBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9zaGFkZXJzL3Jhc3Rlci5mcmFnbWVudC5nbHNsJywgJ3V0ZjgnKSxcbiAgICAgICAgdmVydGV4U291cmNlOiBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9zaGFkZXJzL3Jhc3Rlci52ZXJ0ZXguZ2xzbCcsICd1dGY4JylcbiAgICB9LFxuICAgIHN5bWJvbEljb246IHtcbiAgICAgICAgZnJhZ21lbnRTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL3NoYWRlcnMvc3ltYm9sX2ljb24uZnJhZ21lbnQuZ2xzbCcsICd1dGY4JyksXG4gICAgICAgIHZlcnRleFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vc2hhZGVycy9zeW1ib2xfaWNvbi52ZXJ0ZXguZ2xzbCcsICd1dGY4JylcbiAgICB9LFxuICAgIHN5bWJvbFNERjoge1xuICAgICAgICBmcmFnbWVudFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vc2hhZGVycy9zeW1ib2xfc2RmLmZyYWdtZW50Lmdsc2wnLCAndXRmOCcpLFxuICAgICAgICB2ZXJ0ZXhTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL3NoYWRlcnMvc3ltYm9sX3NkZi52ZXJ0ZXguZ2xzbCcsICd1dGY4JylcbiAgICB9XG59O1xuXG4vLyBFeHBhbmQgI3ByYWdtYXMgdG8gI2lmZGVmcy5cblxuY29uc3QgcmUgPSAvI3ByYWdtYSBtYXBib3g6IChbXFx3XSspIChbXFx3XSspIChbXFx3XSspIChbXFx3XSspL2c7XG5cbmZvciAoY29uc3QgcHJvZ3JhbU5hbWUgaW4gc2hhZGVycykge1xuICAgIGNvbnN0IHByb2dyYW0gPSBzaGFkZXJzW3Byb2dyYW1OYW1lXTtcbiAgICBjb25zdCBmcmFnbWVudFByYWdtYXMgICAgICAgICAgICAgICAgICAgICAgPSB7fTtcblxuICAgIHByb2dyYW0uZnJhZ21lbnRTb3VyY2UgPSBwcm9ncmFtLmZyYWdtZW50U291cmNlLnJlcGxhY2UocmUsIChtYXRjaCAgICAgICAgLCBvcGVyYXRpb24gICAgICAgICwgcHJlY2lzaW9uICAgICAgICAsIHR5cGUgICAgICAgICwgbmFtZSAgICAgICAgKSA9PiB7XG4gICAgICAgIGZyYWdtZW50UHJhZ21hc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIGlmIChvcGVyYXRpb24gPT09ICdkZWZpbmUnKSB7XG4gICAgICAgICAgICByZXR1cm4gYFxuI2lmbmRlZiBIQVNfVU5JRk9STV91XyR7bmFtZX1cbnZhcnlpbmcgJHtwcmVjaXNpb259ICR7dHlwZX0gJHtuYW1lfTtcbiNlbHNlXG51bmlmb3JtICR7cHJlY2lzaW9ufSAke3R5cGV9IHVfJHtuYW1lfTtcbiNlbmRpZlxuYDtcbiAgICAgICAgfSBlbHNlIC8qIGlmIChvcGVyYXRpb24gPT09ICdpbml0aWFsaXplJykgKi8ge1xuICAgICAgICAgICAgcmV0dXJuIGBcbiNpZmRlZiBIQVNfVU5JRk9STV91XyR7bmFtZX1cbiAgICAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9ID0gdV8ke25hbWV9O1xuI2VuZGlmXG5gO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBwcm9ncmFtLnZlcnRleFNvdXJjZSA9IHByb2dyYW0udmVydGV4U291cmNlLnJlcGxhY2UocmUsIChtYXRjaCAgICAgICAgLCBvcGVyYXRpb24gICAgICAgICwgcHJlY2lzaW9uICAgICAgICAsIHR5cGUgICAgICAgICwgbmFtZSAgICAgICAgKSA9PiB7XG4gICAgICAgIGNvbnN0IGF0dHJUeXBlID0gdHlwZSA9PT0gJ2Zsb2F0JyA/ICd2ZWMyJyA6ICd2ZWM0JztcbiAgICAgICAgaWYgKGZyYWdtZW50UHJhZ21hc1tuYW1lXSkge1xuICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJ2RlZmluZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFxuI2lmbmRlZiBIQVNfVU5JRk9STV91XyR7bmFtZX1cbnVuaWZvcm0gbG93cCBmbG9hdCBhXyR7bmFtZX1fdDtcbmF0dHJpYnV0ZSAke3ByZWNpc2lvbn0gJHthdHRyVHlwZX0gYV8ke25hbWV9O1xudmFyeWluZyAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9O1xuI2Vsc2VcbnVuaWZvcm0gJHtwcmVjaXNpb259ICR7dHlwZX0gdV8ke25hbWV9O1xuI2VuZGlmXG5gO1xuICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChvcGVyYXRpb24gPT09ICdpbml0aWFsaXplJykgKi8ge1xuICAgICAgICAgICAgICAgIHJldHVybiBgXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfJHtuYW1lfVxuICAgICR7bmFtZX0gPSB1bnBhY2tfbWl4XyR7YXR0clR5cGV9KGFfJHtuYW1lfSwgYV8ke25hbWV9X3QpO1xuI2Vsc2VcbiAgICAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9ID0gdV8ke25hbWV9O1xuI2VuZGlmXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJ2RlZmluZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFxuI2lmbmRlZiBIQVNfVU5JRk9STV91XyR7bmFtZX1cbnVuaWZvcm0gbG93cCBmbG9hdCBhXyR7bmFtZX1fdDtcbmF0dHJpYnV0ZSAke3ByZWNpc2lvbn0gJHthdHRyVHlwZX0gYV8ke25hbWV9O1xuI2Vsc2VcbnVuaWZvcm0gJHtwcmVjaXNpb259ICR7dHlwZX0gdV8ke25hbWV9O1xuI2VuZGlmXG5gO1xuICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChvcGVyYXRpb24gPT09ICdpbml0aWFsaXplJykgKi8ge1xuICAgICAgICAgICAgICAgIHJldHVybiBgXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfJHtuYW1lfVxuICAgICR7cHJlY2lzaW9ufSAke3R5cGV9ICR7bmFtZX0gPSB1bnBhY2tfbWl4XyR7YXR0clR5cGV9KGFfJHtuYW1lfSwgYV8ke25hbWV9X3QpO1xuI2Vsc2VcbiAgICAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9ID0gdV8ke25hbWV9O1xuI2VuZGlmXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hhZGVycztcbiIsIi8vICAgICAgXG5cbmNvbnN0IEltYWdlU291cmNlID0gcmVxdWlyZSgnLi9pbWFnZV9zb3VyY2UnKTtcbmNvbnN0IHdpbmRvdyA9IHJlcXVpcmUoJy4uL3V0aWwvd2luZG93Jyk7XG5jb25zdCByYXN0ZXJCb3VuZHNBdHRyaWJ1dGVzID0gcmVxdWlyZSgnLi4vZGF0YS9yYXN0ZXJfYm91bmRzX2F0dHJpYnV0ZXMnKTtcbmNvbnN0IFZlcnRleEFycmF5T2JqZWN0ID0gcmVxdWlyZSgnLi4vcmVuZGVyL3ZlcnRleF9hcnJheV9vYmplY3QnKTtcbmNvbnN0IFRleHR1cmUgPSByZXF1aXJlKCcuLi9yZW5kZXIvdGV4dHVyZScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuLyoqXG4gKiBBIGRhdGEgc291cmNlIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIGFuIEhUTUwgY2FudmFzLlxuICogKFNlZSB0aGUgW1N0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI3NvdXJjZXMtY2FudmFzKSBmb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBvcHRpb25zLilcbiAqIEBpbnRlcmZhY2UgQ2FudmFzU291cmNlXG4gKiBAZXhhbXBsZVxuICogLy8gYWRkIHRvIG1hcFxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgIHR5cGU6ICdjYW52YXMnLFxuICogICAgY2FudmFzOiAnaWRPZk15SFRNTENhbnZhcycsXG4gKiAgICBhbmltYXRlOiB0cnVlLFxuICogICAgY29vcmRpbmF0ZXM6IFtcbiAqICAgICAgICBbLTc2LjU0LCAzOS4xOF0sXG4gKiAgICAgICAgWy03Ni41MiwgMzkuMThdLFxuICogICAgICAgIFstNzYuNTIsIDM5LjE3XSxcbiAqICAgICAgICBbLTc2LjU0LCAzOS4xN11cbiAqICAgIF1cbiAqIH0pO1xuICpcbiAqIC8vIHVwZGF0ZVxuICogdmFyIG15U291cmNlID0gbWFwLmdldFNvdXJjZSgnc29tZSBpZCcpO1xuICogbXlTb3VyY2Uuc2V0Q29vcmRpbmF0ZXMoW1xuICogICAgIFstNzYuNTQzMzU3MzcyMjgzOTQsIDM5LjE4NTc5OTA3MjI5NzQ4XSxcbiAqICAgICBbLTc2LjUyODAzNjU5NDM5MDg3LCAzOS4xODM4MzY0ODQ3NTg3XSxcbiAqICAgICBbLTc2LjUyOTUzODYzMTQzOTIsIDM5LjE3NjgzMzkyNTA3NjA2XSxcbiAqICAgICBbLTc2LjU0NTIwMjczMjA4NjE4LCAzOS4xNzg3NjM0NDEwNjY0Ml1cbiAqIF0pO1xuICpcbiAqIG1hcC5yZW1vdmVTb3VyY2UoJ3NvbWUgaWQnKTsgIC8vIHJlbW92ZVxuICovXG5jbGFzcyBDYW52YXNTb3VyY2UgZXh0ZW5kcyBJbWFnZVNvdXJjZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoaWQgICAgICAgICwgb3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICwgZGlzcGF0Y2hlciAgICAgICAgICAgICwgZXZlbnRlZFBhcmVudCAgICAgICAgICkge1xuICAgICAgICBzdXBlcihpZCwgb3B0aW9ucywgZGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuYW5pbWF0ZSA9IG9wdGlvbnMuYW5pbWF0ZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5hbmltYXRlIDogdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIGFuaW1hdGlvbi4gVGhlIGltYWdlIHdpbGwgYmUgY29waWVkIGZyb20gdGhlIGNhbnZhcyB0byB0aGUgbWFwIG9uIGVhY2ggZnJhbWUuXG4gICAgICogQG1ldGhvZCBwbGF5XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIENhbnZhc1NvdXJjZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgYW5pbWF0aW9uLiBUaGUgbWFwIHdpbGwgZGlzcGxheSBhIHN0YXRpYyBjb3B5IG9mIHRoZSBjYW52YXMgaW1hZ2UuXG4gICAgICogQG1ldGhvZCBwYXVzZVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBDYW52YXNTb3VyY2VcbiAgICAgKi9cblxuICAgIGxvYWQoKSB7XG4gICAgICAgIHRoaXMuY2FudmFzID0gdGhpcy5jYW52YXMgfHwgd2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMub3B0aW9ucy5jYW52YXMpO1xuICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5jYW52YXMud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5jYW52YXMuaGVpZ2h0O1xuXG4gICAgICAgIGlmICh0aGlzLl9oYXNJbnZhbGlkRGltZW5zaW9ucygpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywgbmV3IEVycm9yKCdDYW52YXMgZGltZW5zaW9ucyBjYW5ub3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8uJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wbGF5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLl9wbGF5aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMubWFwLl9yZXJlbmRlcigpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuX3BsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9maW5pc2hMb2FkaW5nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgSFRNTCBgY2FudmFzYCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMge0hUTUxDYW52YXNFbGVtZW50fSBUaGUgSFRNTCBgY2FudmFzYCBlbGVtZW50LlxuICAgICAqL1xuICAgIGdldENhbnZhcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FudmFzO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcCAgICAgKSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgICAgaWYgKHRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hbmltYXRlKSB0aGlzLnBsYXkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uUmVtb3ZlKCkge1xuICAgICAgICB0aGlzLnBhdXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY2FudmFzJ3MgY29vcmRpbmF0ZXMgYW5kIHJlLXJlbmRlcnMgdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBtZXRob2Qgc2V0Q29vcmRpbmF0ZXNcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgQ2FudmFzU291cmNlXG4gICAgICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gY29vcmRpbmF0ZXMgRm91ciBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMsXG4gICAgICogICByZXByZXNlbnRlZCBhcyBhcnJheXMgb2YgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBudW1iZXJzLCB3aGljaCBkZWZpbmUgdGhlIGNvcm5lcnMgb2YgdGhlIGNhbnZhcy5cbiAgICAgKiAgIFRoZSBjb29yZGluYXRlcyBzdGFydCBhdCB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBjYW52YXMgYW5kIHByb2NlZWQgaW4gY2xvY2t3aXNlIG9yZGVyLlxuICAgICAqICAgVGhleSBkbyBub3QgaGF2ZSB0byByZXByZXNlbnQgYSByZWN0YW5nbGUuXG4gICAgICogQHJldHVybnMge0NhbnZhc1NvdXJjZX0gdGhpc1xuICAgICAqL1xuICAgIC8vIHNldENvb3JkaW5hdGVzIGluaGVyaXRlZCBmcm9tIEltYWdlU291cmNlXG5cbiAgICBwcmVwYXJlKCkge1xuICAgICAgICBsZXQgcmVzaXplID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmNhbnZhcy53aWR0aCAhPT0gdGhpcy53aWR0aCkge1xuICAgICAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMuY2FudmFzLndpZHRoO1xuICAgICAgICAgICAgcmVzaXplID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jYW52YXMuaGVpZ2h0ICE9PSB0aGlzLmhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmNhbnZhcy5oZWlnaHQ7XG4gICAgICAgICAgICByZXNpemUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2hhc0ludmFsaWREaW1lbnNpb25zKCkpIHJldHVybjtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy50aWxlcykubGVuZ3RoID09PSAwKSByZXR1cm47IC8vIG5vdCBlbm91Z2ggZGF0YSBmb3IgY3VycmVudCBwb3NpdGlvblxuXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLm1hcC5wYWludGVyLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgICAgICBpZiAoIXRoaXMuYm91bmRzQnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLmJvdW5kc0J1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuX2JvdW5kc0FycmF5LCByYXN0ZXJCb3VuZHNBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmJvdW5kc1ZBTykge1xuICAgICAgICAgICAgdGhpcy5ib3VuZHNWQU8gPSBuZXcgVmVydGV4QXJyYXlPYmplY3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCB0aGlzLmNhbnZhcywgZ2wuUkdCQSk7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc2l6ZSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlLnVwZGF0ZSh0aGlzLmNhbnZhcyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fcGxheWluZykge1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgdGhpcy5jYW52YXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB3IGluIHRoaXMudGlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLnRpbGVzW3ddO1xuICAgICAgICAgICAgaWYgKHRpbGUuc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdsb2FkZWQnO1xuICAgICAgICAgICAgICAgIHRpbGUudGV4dHVyZSA9IHRoaXMudGV4dHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpICAgICAgICAge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ2NhbnZhcycsXG4gICAgICAgICAgICBjYW52YXM6IHRoaXMuY2FudmFzLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IHRoaXMuY29vcmRpbmF0ZXNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGxheWluZztcbiAgICB9XG5cbiAgICBfaGFzSW52YWxpZERpbWVuc2lvbnMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgeCBvZiBbdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodF0pIHtcbiAgICAgICAgICAgIGlmIChpc05hTih4KSB8fCB4IDw9IDApIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ2FudmFzU291cmNlO1xuIiwiLy8gICAgICBcblxuY29uc3QgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuY29uc3Qgd2luZG93ID0gcmVxdWlyZSgnLi4vdXRpbC93aW5kb3cnKTtcbmNvbnN0IEVYVEVOVCA9IHJlcXVpcmUoJy4uL2RhdGEvZXh0ZW50Jyk7XG5jb25zdCBSZXNvdXJjZVR5cGUgPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKS5SZXNvdXJjZVR5cGU7XG5jb25zdCBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuLyoqXG4gKiBBIHNvdXJjZSBjb250YWluaW5nIEdlb0pTT04uXG4gKiAoU2VlIHRoZSBbU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jc291cmNlcy1nZW9qc29uKSBmb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBvcHRpb25zLilcbiAqXG4gKiBAaW50ZXJmYWNlIEdlb0pTT05Tb3VyY2VcbiAqIEBleGFtcGxlXG4gKlxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgICB0eXBlOiAnZ2VvanNvbicsXG4gKiAgICAgZGF0YTogJ2h0dHBzOi8vZDJhZDZiNHVyN3l2cHEuY2xvdWRmcm9udC5uZXQvbmF0dXJhbGVhcnRoLTMuMy4wL25lXzEwbV9wb3J0cy5nZW9qc29uJ1xuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIG1hcC5hZGRTb3VyY2UoJ3NvbWUgaWQnLCB7XG4gKiAgICB0eXBlOiAnZ2VvanNvbicsXG4gKiAgICBkYXRhOiB7XG4gKiAgICAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcbiAqICAgICAgICBcImZlYXR1cmVzXCI6IFt7XG4gKiAgICAgICAgICAgIFwidHlwZVwiOiBcIkZlYXR1cmVcIixcbiAqICAgICAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHt9LFxuICogICAgICAgICAgICBcImdlb21ldHJ5XCI6IHtcbiAqICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlBvaW50XCIsXG4gKiAgICAgICAgICAgICAgICBcImNvb3JkaW5hdGVzXCI6IFtcbiAqICAgICAgICAgICAgICAgICAgICAtNzYuNTMwNjMyOTcyNzE3MjksXG4gKiAgICAgICAgICAgICAgICAgICAgMzkuMTgxNzQwNzc5OTQxMDhcbiAqICAgICAgICAgICAgICAgIF1cbiAqICAgICAgICAgICAgfVxuICogICAgICAgIH1dXG4gKiAgICB9XG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogbWFwLmdldFNvdXJjZSgnc29tZSBpZCcpLnNldERhdGEoe1xuICogICBcInR5cGVcIjogXCJGZWF0dXJlQ29sbGVjdGlvblwiLFxuICogICBcImZlYXR1cmVzXCI6IFt7XG4gKiAgICAgICBcInR5cGVcIjogXCJGZWF0dXJlXCIsXG4gKiAgICAgICBcInByb3BlcnRpZXNcIjogeyBcIm5hbWVcIjogXCJOdWxsIElzbGFuZFwiIH0sXG4gKiAgICAgICBcImdlb21ldHJ5XCI6IHtcbiAqICAgICAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxuICogICAgICAgICAgIFwiY29vcmRpbmF0ZXNcIjogWyAwLCAwIF1cbiAqICAgICAgIH1cbiAqICAgfV1cbiAqIH0pO1xuICogQHNlZSBbRHJhdyBHZW9KU09OIHBvaW50c10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nZW9qc29uLW1hcmtlcnMvKVxuICogQHNlZSBbQWRkIGEgR2VvSlNPTiBsaW5lXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2dlb2pzb24tbGluZS8pXG4gKiBAc2VlIFtDcmVhdGUgYSBoZWF0bWFwIGZyb20gcG9pbnRzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2hlYXRtYXAvKVxuICovXG5jbGFzcyBHZW9KU09OU291cmNlIGV4dGVuZHMgRXZlbnRlZCAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihpZCAgICAgICAgLCBvcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBkaXNwYXRjaGVyICAgICAgICAgICAgLCBldmVudGVkUGFyZW50ICAgICAgICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuXG4gICAgICAgIC8vIGB0eXBlYCBpcyBhIHByb3BlcnR5IHJhdGhlciB0aGFuIGEgY29uc3RhbnQgdG8gbWFrZSBpdCBlYXN5IGZvciAzcmRcbiAgICAgICAgLy8gcGFydGllcyB0byB1c2UgR2VvSlNPTlNvdXJjZSB0byBidWlsZCB0aGVpciBvd24gc291cmNlIHR5cGVzLlxuICAgICAgICB0aGlzLnR5cGUgPSAnZ2VvanNvbic7XG5cbiAgICAgICAgdGhpcy5taW56b29tID0gMDtcbiAgICAgICAgdGhpcy5tYXh6b29tID0gMTg7XG4gICAgICAgIHRoaXMudGlsZVNpemUgPSA1MTI7XG4gICAgICAgIHRoaXMuaXNUaWxlQ2xpcHBlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucmVwYXJzZU92ZXJzY2FsZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7XG4gICAgICAgIHRoaXMuc2V0RXZlbnRlZFBhcmVudChldmVudGVkUGFyZW50KTtcblxuICAgICAgICB0aGlzLl9kYXRhID0gKG9wdGlvbnMuZGF0YSAgICAgKTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHt9LCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcgPSBvcHRpb25zLmNvbGxlY3RSZXNvdXJjZVRpbWluZztcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VUaW1pbmcgPSBbXTtcblxuICAgICAgICBpZiAob3B0aW9ucy5tYXh6b29tICE9PSB1bmRlZmluZWQpIHRoaXMubWF4em9vbSA9IG9wdGlvbnMubWF4em9vbTtcbiAgICAgICAgaWYgKG9wdGlvbnMudHlwZSkgdGhpcy50eXBlID0gb3B0aW9ucy50eXBlO1xuXG4gICAgICAgIGNvbnN0IHNjYWxlID0gRVhURU5UIC8gdGhpcy50aWxlU2l6ZTtcblxuICAgICAgICAvLyBzZW50IHRvIHRoZSB3b3JrZXIsIGFsb25nIHdpdGggYHVybDogLi4uYCBvciBgZGF0YTogbGl0ZXJhbCBnZW9qc29uYCxcbiAgICAgICAgLy8gc28gdGhhdCBpdCBjYW4gbG9hZC9wYXJzZS9pbmRleCB0aGUgZ2VvanNvbiBkYXRhXG4gICAgICAgIC8vIGV4dGVuZGluZyB3aXRoIGBvcHRpb25zLndvcmtlck9wdGlvbnNgIGhlbHBzIHRvIG1ha2UgaXQgZWFzeSBmb3JcbiAgICAgICAgLy8gdGhpcmQtcGFydHkgc291cmNlcyB0byBoYWNrL3JldXNlIEdlb0pTT05Tb3VyY2UuXG4gICAgICAgIHRoaXMud29ya2VyT3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5pZCxcbiAgICAgICAgICAgIGNsdXN0ZXI6IG9wdGlvbnMuY2x1c3RlciB8fCBmYWxzZSxcbiAgICAgICAgICAgIGdlb2pzb25WdE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBidWZmZXI6IChvcHRpb25zLmJ1ZmZlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5idWZmZXIgOiAxMjgpICogc2NhbGUsXG4gICAgICAgICAgICAgICAgdG9sZXJhbmNlOiAob3B0aW9ucy50b2xlcmFuY2UgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMudG9sZXJhbmNlIDogMC4zNzUpICogc2NhbGUsXG4gICAgICAgICAgICAgICAgZXh0ZW50OiBFWFRFTlQsXG4gICAgICAgICAgICAgICAgbWF4Wm9vbTogdGhpcy5tYXh6b29tXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3VwZXJjbHVzdGVyT3B0aW9uczoge1xuICAgICAgICAgICAgICAgIG1heFpvb206IG9wdGlvbnMuY2x1c3Rlck1heFpvb20gIT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICAgICAgICAgIE1hdGgubWluKG9wdGlvbnMuY2x1c3Rlck1heFpvb20sIHRoaXMubWF4em9vbSAtIDEpIDpcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubWF4em9vbSAtIDEpLFxuICAgICAgICAgICAgICAgIGV4dGVudDogRVhURU5ULFxuICAgICAgICAgICAgICAgIHJhZGl1czogKG9wdGlvbnMuY2x1c3RlclJhZGl1cyB8fCA1MCkgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICBsb2c6IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIG9wdGlvbnMud29ya2VyT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgdGhpcy5maXJlKCdkYXRhbG9hZGluZycsIHtkYXRhVHlwZTogJ3NvdXJjZSd9KTtcbiAgICAgICAgdGhpcy5fdXBkYXRlV29ya2VyRGF0YSgoZXJyKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKCdlcnJvcicsIHtlcnJvcjogZXJyfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkYXRhICAgICAgICAgPSB7IGRhdGFUeXBlOiAnc291cmNlJywgc291cmNlRGF0YVR5cGU6ICdtZXRhZGF0YScgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcgJiYgdGhpcy5fcmVzb3VyY2VUaW1pbmcgJiYgKHRoaXMuX3Jlc291cmNlVGltaW5nLmxlbmd0aCA+IDApKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5yZXNvdXJjZVRpbWluZyA9IHRoaXMuX3Jlc291cmNlVGltaW5nO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc291cmNlVGltaW5nID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFsdGhvdWdoIEdlb0pTT04gc291cmNlcyBjb250YWluIG5vIG1ldGFkYXRhLCB3ZSBmaXJlIHRoaXMgZXZlbnQgdG8gbGV0IHRoZSBTb3VyY2VDYWNoZVxuICAgICAgICAgICAgLy8ga25vdyBpdHMgb2sgdG8gc3RhcnQgcmVxdWVzdGluZyB0aWxlcy5cbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZGF0YScsIGRhdGEpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXAgICAgICkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgR2VvSlNPTiBkYXRhIGFuZCByZS1yZW5kZXJzIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdHxzdHJpbmd9IGRhdGEgQSBHZW9KU09OIGRhdGEgb2JqZWN0IG9yIGEgVVJMIHRvIG9uZS4gVGhlIGxhdHRlciBpcyBwcmVmZXJhYmxlIGluIHRoZSBjYXNlIG9mIGxhcmdlIEdlb0pTT04gZmlsZXMuXG4gICAgICogQHJldHVybnMge0dlb0pTT05Tb3VyY2V9IHRoaXNcbiAgICAgKi9cbiAgICBzZXREYXRhKGRhdGEgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMuZmlyZSgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnfSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVdvcmtlckRhdGEoKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcmUoJ2Vycm9yJywgeyBlcnJvcjogZXJyIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkYXRhICAgICAgICAgPSB7IGRhdGFUeXBlOiAnc291cmNlJywgc291cmNlRGF0YVR5cGU6ICdjb250ZW50JyB9O1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZyAmJiB0aGlzLl9yZXNvdXJjZVRpbWluZyAmJiAodGhpcy5fcmVzb3VyY2VUaW1pbmcubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgICAgICBkYXRhLnJlc291cmNlVGltaW5nID0gdGhpcy5fcmVzb3VyY2VUaW1pbmc7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzb3VyY2VUaW1pbmcgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZGF0YScsIGRhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFJlc3BvbnNpYmxlIGZvciBpbnZva2luZyBXb3JrZXJTb3VyY2UncyBnZW9qc29uLmxvYWREYXRhIHRhcmdldCwgd2hpY2hcbiAgICAgKiBoYW5kbGVzIGxvYWRpbmcgdGhlIGdlb2pzb24gZGF0YSBhbmQgcHJlcGFyaW5nIHRvIHNlcnZlIGl0IHVwIGFzIHRpbGVzLFxuICAgICAqIHVzaW5nIGdlb2pzb24tdnQgb3Igc3VwZXJjbHVzdGVyIGFzIGFwcHJvcHJpYXRlLlxuICAgICAqL1xuICAgIF91cGRhdGVXb3JrZXJEYXRhKGNhbGxiYWNrICAgICAgICAgICkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdXRpbC5leHRlbmQoe30sIHRoaXMud29ya2VyT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9kYXRhO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBvcHRpb25zLnJlcXVlc3QgPSB0aGlzLm1hcC5fdHJhbnNmb3JtUmVxdWVzdChyZXNvbHZlVVJMKGRhdGEpLCBSZXNvdXJjZVR5cGUuU291cmNlKTtcbiAgICAgICAgICAgIG9wdGlvbnMucmVxdWVzdC5jb2xsZWN0UmVzb3VyY2VUaW1pbmcgPSB0aGlzLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zLmRhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRhcmdldCB7dGhpcy50eXBlfS5sb2FkRGF0YSByYXRoZXIgdGhhbiBsaXRlcmFsbHkgZ2VvanNvbi5sb2FkRGF0YSxcbiAgICAgICAgLy8gc28gdGhhdCBvdGhlciBnZW9qc29uLWxpa2Ugc291cmNlIHR5cGVzIGNhbiBlYXNpbHkgcmV1c2UgdGhpc1xuICAgICAgICAvLyBpbXBsZW1lbnRhdGlvblxuICAgICAgICB0aGlzLndvcmtlcklEID0gdGhpcy5kaXNwYXRjaGVyLnNlbmQoYCR7dGhpcy50eXBlfS5sb2FkRGF0YWAsIG9wdGlvbnMsIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQucmVzb3VyY2VUaW1pbmcgJiYgcmVzdWx0LnJlc291cmNlVGltaW5nW3RoaXMuaWRdKVxuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc291cmNlVGltaW5nID0gcmVzdWx0LnJlc291cmNlVGltaW5nW3RoaXMuaWRdLnNsaWNlKDApO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9LCB0aGlzLndvcmtlcklEKTtcbiAgICB9XG5cbiAgICBsb2FkVGlsZSh0aWxlICAgICAgLCBjYWxsYmFjayAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRpbGUud29ya2VySUQgPT09IHVuZGVmaW5lZCB8fCB0aWxlLnN0YXRlID09PSAnZXhwaXJlZCcgPyAnbG9hZFRpbGUnIDogJ3JlbG9hZFRpbGUnO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICB1aWQ6IHRpbGUudWlkLFxuICAgICAgICAgICAgdGlsZUlEOiB0aWxlLnRpbGVJRCxcbiAgICAgICAgICAgIHpvb206IHRpbGUudGlsZUlELm92ZXJzY2FsZWRaLFxuICAgICAgICAgICAgbWF4Wm9vbTogdGhpcy5tYXh6b29tLFxuICAgICAgICAgICAgdGlsZVNpemU6IHRoaXMudGlsZVNpemUsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgICAgICBwaXhlbFJhdGlvOiBicm93c2VyLmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgICBvdmVyc2NhbGluZzogdGlsZS50aWxlSUQub3ZlcnNjYWxlRmFjdG9yKCksXG4gICAgICAgICAgICBzaG93Q29sbGlzaW9uQm94ZXM6IHRoaXMubWFwLnNob3dDb2xsaXNpb25Cb3hlc1xuICAgICAgICB9O1xuXG4gICAgICAgIHRpbGUud29ya2VySUQgPSB0aGlzLmRpc3BhdGNoZXIuc2VuZChtZXNzYWdlLCBwYXJhbXMsIChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRpbGUudW5sb2FkVmVjdG9yRGF0YSgpO1xuXG4gICAgICAgICAgICBpZiAodGlsZS5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRpbGUubG9hZFZlY3RvckRhdGEoZGF0YSwgdGhpcy5tYXAucGFpbnRlciwgbWVzc2FnZSA9PT0gJ3JlbG9hZFRpbGUnKTtcblxuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9LCB0aGlzLndvcmtlcklEKTtcbiAgICB9XG5cbiAgICBhYm9ydFRpbGUodGlsZSAgICAgICkge1xuICAgICAgICB0aWxlLmFib3J0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHVubG9hZFRpbGUodGlsZSAgICAgICkge1xuICAgICAgICB0aWxlLnVubG9hZFZlY3RvckRhdGEoKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ3JlbW92ZVRpbGUnLCB7IHVpZDogdGlsZS51aWQsIHR5cGU6IHRoaXMudHlwZSwgc291cmNlOiB0aGlzLmlkIH0sIG51bGwsIHRpbGUud29ya2VySUQpO1xuICAgIH1cblxuICAgIG9uUmVtb3ZlKCkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KCdyZW1vdmVTb3VyY2UnLCB7IHR5cGU6IHRoaXMudHlwZSwgc291cmNlOiB0aGlzLmlkIH0pO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHV0aWwuZXh0ZW5kKHt9LCB0aGlzLl9vcHRpb25zLCB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBkYXRhOiB0aGlzLl9kYXRhXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVVUkwodXJsKSB7XG4gICAgY29uc3QgYSA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYS5ocmVmID0gdXJsO1xuICAgIHJldHVybiBhLmhyZWY7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gR2VvSlNPTlNvdXJjZTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcbmNvbnN0IHBlcmYgPSByZXF1aXJlKCcuLi91dGlsL3BlcmZvcm1hbmNlJyk7XG5jb25zdCByZXdpbmQgPSByZXF1aXJlKCdnZW9qc29uLXJld2luZCcpO1xuY29uc3QgR2VvSlNPTldyYXBwZXIgPSByZXF1aXJlKCcuL2dlb2pzb25fd3JhcHBlcicpO1xuY29uc3QgdnRwYmYgPSByZXF1aXJlKCd2dC1wYmYnKTtcbmNvbnN0IHN1cGVyY2x1c3RlciA9IHJlcXVpcmUoJ3N1cGVyY2x1c3RlcicpO1xuY29uc3QgZ2VvanNvbnZ0ID0gcmVxdWlyZSgnZ2VvanNvbi12dCcpO1xuXG5jb25zdCBWZWN0b3JUaWxlV29ya2VyU291cmNlID0gcmVxdWlyZSgnLi92ZWN0b3JfdGlsZV93b3JrZXJfc291cmNlJyk7XG5cbiAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gXG5cbmZ1bmN0aW9uIGxvYWRHZW9KU09OVGlsZShwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgLCBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgIGNvbnN0IHNvdXJjZSA9IHBhcmFtcy5zb3VyY2UsXG4gICAgICAgIGNhbm9uaWNhbCA9IHBhcmFtcy50aWxlSUQuY2Fub25pY2FsO1xuXG4gICAgaWYgKCF0aGlzLl9nZW9KU09OSW5kZXhlc1tzb3VyY2VdKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBudWxsKTsgIC8vIHdlIGNvdWxkbid0IGxvYWQgdGhlIGZpbGVcbiAgICB9XG5cbiAgICBjb25zdCBnZW9KU09OVGlsZSA9IHRoaXMuX2dlb0pTT05JbmRleGVzW3NvdXJjZV0uZ2V0VGlsZShjYW5vbmljYWwueiwgY2Fub25pY2FsLngsIGNhbm9uaWNhbC55KTtcbiAgICBpZiAoIWdlb0pTT05UaWxlKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBudWxsKTsgLy8gbm90aGluZyBpbiB0aGUgZ2l2ZW4gdGlsZVxuICAgIH1cblxuICAgIGNvbnN0IGdlb2pzb25XcmFwcGVyID0gbmV3IEdlb0pTT05XcmFwcGVyKGdlb0pTT05UaWxlLmZlYXR1cmVzKTtcblxuICAgIC8vIEVuY29kZSB0aGUgZ2VvanNvbi12dCB0aWxlIGludG8gYmluYXJ5IHZlY3RvciB0aWxlIGZvcm0gZm9ybS4gIFRoaXNcbiAgICAvLyBpcyBhIGNvbnZlbmllbmNlIHRoYXQgYWxsb3dzIGBGZWF0dXJlSW5kZXhgIHRvIG9wZXJhdGUgdGhlIHNhbWUgd2F5XG4gICAgLy8gYWNyb3NzIGBWZWN0b3JUaWxlU291cmNlYCBhbmQgYEdlb0pTT05Tb3VyY2VgIGRhdGEuXG4gICAgbGV0IHBiZiA9IHZ0cGJmKGdlb2pzb25XcmFwcGVyKTtcbiAgICBpZiAocGJmLmJ5dGVPZmZzZXQgIT09IDAgfHwgcGJmLmJ5dGVMZW5ndGggIT09IHBiZi5idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAvLyBDb21wYXRpYmlsaXR5IHdpdGggbm9kZSBCdWZmZXIgKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvcGJmL2lzc3Vlcy8zNSlcbiAgICAgICAgcGJmID0gbmV3IFVpbnQ4QXJyYXkocGJmKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICAgIHZlY3RvclRpbGU6IGdlb2pzb25XcmFwcGVyLFxuICAgICAgICByYXdEYXRhOiBwYmYuYnVmZmVyXG4gICAgfSk7XG59XG5cbi8qKlxuICogVGhlIHtAbGluayBXb3JrZXJTb3VyY2V9IGltcGxlbWVudGF0aW9uIHRoYXQgc3VwcG9ydHMge0BsaW5rIEdlb0pTT05Tb3VyY2V9LlxuICogVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBiZSBlYXNpbHkgcmV1c2VkIHRvIHN1cHBvcnQgY3VzdG9tIHNvdXJjZSB0eXBlc1xuICogZm9yIGRhdGEgZm9ybWF0cyB0aGF0IGNhbiBiZSBwYXJzZWQvY29udmVydGVkIGludG8gYW4gaW4tbWVtb3J5IEdlb0pTT05cbiAqIHJlcHJlc2VudGF0aW9uLiAgVG8gZG8gc28sIGNyZWF0ZSBpdCB3aXRoXG4gKiBgbmV3IEdlb0pTT05Xb3JrZXJTb3VyY2UoYWN0b3IsIGxheWVySW5kZXgsIGN1c3RvbUxvYWRHZW9KU09ORnVuY3Rpb24pYC5cbiAqIEZvciBhIGZ1bGwgZXhhbXBsZSwgc2VlIFttYXBib3gtZ2wtdG9wb2pzb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9kZXZlbG9wbWVudHNlZWQvbWFwYm94LWdsLXRvcG9qc29uKS5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBHZW9KU09OV29ya2VyU291cmNlIGV4dGVuZHMgVmVjdG9yVGlsZVdvcmtlclNvdXJjZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gW2xvYWRHZW9KU09OXSBPcHRpb25hbCBtZXRob2QgZm9yIGN1c3RvbSBsb2FkaW5nL3BhcnNpbmcgb2ZcbiAgICAgKiBHZW9KU09OIGJhc2VkIG9uIHBhcmFtZXRlcnMgcGFzc2VkIGZyb20gdGhlIG1haW4tdGhyZWFkIFNvdXJjZS5cbiAgICAgKiBTZWUge0BsaW5rIEdlb0pTT05Xb3JrZXJTb3VyY2UjbG9hZEdlb0pTT059LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGFjdG9yICAgICAgICwgbGF5ZXJJbmRleCAgICAgICAgICAgICAgICAgLCBsb2FkR2VvSlNPTiAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHN1cGVyKGFjdG9yLCBsYXllckluZGV4LCBsb2FkR2VvSlNPTlRpbGUpO1xuICAgICAgICBpZiAobG9hZEdlb0pTT04pIHtcbiAgICAgICAgICAgIHRoaXMubG9hZEdlb0pTT04gPSBsb2FkR2VvSlNPTjtcbiAgICAgICAgfVxuICAgICAgICAvLyBvYmplY3QgbWFwcGluZyBzb3VyY2UgaWRzIHRvIGdlb2pzb24tdnQtbGlrZSB0aWxlIGluZGV4ZXNcbiAgICAgICAgdGhpcy5fZ2VvSlNPTkluZGV4ZXMgPSB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaGVzIChpZiBhcHByb3ByaWF0ZSksIHBhcnNlcywgYW5kIGluZGV4IGdlb2pzb24gZGF0YSBpbnRvIHRpbGVzLiBUaGlzXG4gICAgICogcHJlcGFyYXRvcnkgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB7QGxpbmsgR2VvSlNPTldvcmtlclNvdXJjZSNsb2FkVGlsZX1cbiAgICAgKiBjYW4gY29ycmVjdGx5IHNlcnZlIHVwIHRpbGVzLlxuICAgICAqXG4gICAgICogRGVmZXJzIHRvIHtAbGluayBHZW9KU09OV29ya2VyU291cmNlI2xvYWRHZW9KU09OfSBmb3IgdGhlIGZldGNoaW5nL3BhcnNpbmcsXG4gICAgICogZXhwZWN0aW5nIGBjYWxsYmFjayhlcnJvciwgZGF0YSlgIHRvIGJlIGNhbGxlZCB3aXRoIGVpdGhlciBhbiBlcnJvciBvciBhXG4gICAgICogcGFyc2VkIEdlb0pTT04gb2JqZWN0LlxuICAgICAqIEBwYXJhbSBwYXJhbXNcbiAgICAgKiBAcGFyYW0gcGFyYW1zLnNvdXJjZSBUaGUgaWQgb2YgdGhlIHNvdXJjZS5cbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBsb2FkRGF0YShwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICwgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLmxvYWRHZW9KU09OKHBhcmFtcywgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVyciB8fCAhZGF0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiSW5wdXQgZGF0YSBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC5cIikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXdpbmQoZGF0YSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZW9KU09OSW5kZXhlc1twYXJhbXMuc291cmNlXSA9IHBhcmFtcy5jbHVzdGVyID9cbiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyY2x1c3RlcihwYXJhbXMuc3VwZXJjbHVzdGVyT3B0aW9ucykubG9hZChkYXRhLmZlYXR1cmVzKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9qc29udnQoZGF0YSwgcGFyYW1zLmdlb2pzb25WdE9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZFtwYXJhbXMuc291cmNlXSA9IHt9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5yZXF1ZXN0ICYmIHBhcmFtcy5yZXF1ZXN0LmNvbGxlY3RSZXNvdXJjZVRpbWluZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvdXJjZVRpbWluZ0RhdGEgPSBwZXJmLmdldEVudHJpZXNCeU5hbWUocGFyYW1zLnJlcXVlc3QudXJsKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBuZWNlc3NhcnkgdG8gZXZhbCB0aGUgcmVzdWx0IG9mIGdldEVudHJpZXNCeU5hbWUoKSBoZXJlIHZpYSBwYXJzZS9zdHJpbmdpZnlcbiAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZSBldmFsdWF0aW9uIGluIHRoZSBtYWluIHRocmVhZCBjYXVzZXMgVHlwZUVycm9yOiBpbGxlZ2FsIGludm9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlVGltaW5nRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlc291cmNlVGltaW5nID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVzb3VyY2VUaW1pbmdbcGFyYW1zLnNvdXJjZV0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc291cmNlVGltaW5nRGF0YSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogSW1wbGVtZW50cyB7QGxpbmsgV29ya2VyU291cmNlI3JlbG9hZFRpbGV9LlxuICAgICpcbiAgICAqIElmIHRoZSB0aWxlIGlzIGxvYWRlZCwgdXNlcyB0aGUgaW1wbGVtZW50YXRpb24gaW4gVmVjdG9yVGlsZVdvcmtlclNvdXJjZS5cbiAgICAqIE90aGVyd2lzZSwgc3VjaCBhcyBhZnRlciBhIHNldERhdGEoKSBjYWxsLCB3ZSBsb2FkIHRoZSB0aWxlIGZyZXNoLlxuICAgICpcbiAgICAqIEBwYXJhbSBwYXJhbXNcbiAgICAqIEBwYXJhbSBwYXJhbXMuc291cmNlIFRoZSBpZCBvZiB0aGUgc291cmNlIGZvciB3aGljaCB3ZSdyZSBsb2FkaW5nIHRoaXMgdGlsZS5cbiAgICAqIEBwYXJhbSBwYXJhbXMudWlkIFRoZSBVSUQgZm9yIHRoaXMgdGlsZS5cbiAgICAqL1xuICAgIHJlbG9hZFRpbGUocGFyYW1zICAgICAgICAgICAgICAgICAgICAgICwgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCBsb2FkZWQgPSB0aGlzLmxvYWRlZFtwYXJhbXMuc291cmNlXSxcbiAgICAgICAgICAgIHVpZCA9IHBhcmFtcy51aWQ7XG5cbiAgICAgICAgaWYgKGxvYWRlZCAmJiBsb2FkZWRbdWlkXSkge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlbG9hZFRpbGUocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkVGlsZShwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGFuZCBwYXJzZSBHZW9KU09OIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gcGFyYW1zLiAgQ2FsbHMgYGNhbGxiYWNrYFxuICAgICAqIHdpdGggYChlcnIsIGRhdGEpYCwgd2hlcmUgYGRhdGFgIGlzIGEgcGFyc2VkIEdlb0pTT04gb2JqZWN0LlxuICAgICAqXG4gICAgICogR2VvSlNPTiBpcyBsb2FkZWQgYW5kIHBhcnNlZCBmcm9tIGBwYXJhbXMudXJsYCBpZiBpdCBleGlzdHMsIG9yIGVsc2VcbiAgICAgKiBleHBlY3RlZCBhcyBhIGxpdGVyYWwgKHN0cmluZyBvciBvYmplY3QpIGBwYXJhbXMuZGF0YWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW1zXG4gICAgICogQHBhcmFtIFtwYXJhbXMudXJsXSBBIFVSTCB0byB0aGUgcmVtb3RlIEdlb0pTT04gZGF0YS5cbiAgICAgKiBAcGFyYW0gW3BhcmFtcy5kYXRhXSBMaXRlcmFsIEdlb0pTT04gZGF0YS4gTXVzdCBiZSBwcm92aWRlZCBpZiBgcGFyYW1zLnVybGAgaXMgbm90LlxuICAgICAqL1xuICAgIGxvYWRHZW9KU09OKHBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgLCBjYWxsYmFjayAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIC8vIEJlY2F1c2Ugb2Ygc2FtZSBvcmlnaW4gaXNzdWVzLCB1cmxzIG11c3QgZWl0aGVyIGluY2x1ZGUgYW4gZXhwbGljaXRcbiAgICAgICAgLy8gb3JpZ2luIG9yIGFic29sdXRlIHBhdGguXG4gICAgICAgIC8vIGllOiAvZm9vL2Jhci5qc29uIG9yIGh0dHA6Ly9leGFtcGxlLmNvbS9iYXIuanNvblxuICAgICAgICAvLyBidXQgbm90IC4uL2Zvby9iYXIuanNvblxuICAgICAgICBpZiAocGFyYW1zLnJlcXVlc3QpIHtcbiAgICAgICAgICAgIGFqYXguZ2V0SlNPTihwYXJhbXMucmVxdWVzdCwgY2FsbGJhY2spO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbXMuZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIEpTT04ucGFyc2UocGFyYW1zLmRhdGEpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiSW5wdXQgZGF0YSBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC5cIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihcIklucHV0IGRhdGEgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuXCIpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZVNvdXJjZShwYXJhbXMgICAgICAgICAgICAgICAgICAsIGNhbGxiYWNrICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMuX2dlb0pTT05JbmRleGVzW3BhcmFtcy5zb3VyY2VdKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fZ2VvSlNPTkluZGV4ZXNbcGFyYW1zLnNvdXJjZV07XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gR2VvSlNPTldvcmtlclNvdXJjZTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IFBvaW50ID0gcmVxdWlyZSgnQG1hcGJveC9wb2ludC1nZW9tZXRyeScpO1xuY29uc3QgdG9HZW9KU09OID0gcmVxdWlyZSgnQG1hcGJveC92ZWN0b3ItdGlsZScpLlZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS50b0dlb0pTT047XG5jb25zdCBFWFRFTlQgPSByZXF1aXJlKCcuLi9kYXRhL2V4dGVudCcpO1xuXG4vLyBUaGUgZmVhdHVyZSB0eXBlIHVzZWQgYnkgZ2VvanNvbi12dCBhbmQgc3VwZXJjbHVzdGVyLiBTaG91bGQgYmUgZXh0cmFjdGVkIHRvXG4vLyBnbG9iYWwgdHlwZSBhbmQgdXNlZCBpbiBtb2R1bGUgZGVmaW5pdGlvbnMgZm9yIHRob3NlIHR3byBtb2R1bGVzLlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIFxuXG5jbGFzcyBGZWF0dXJlV3JhcHBlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihmZWF0dXJlICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuX2ZlYXR1cmUgPSBmZWF0dXJlO1xuXG4gICAgICAgIHRoaXMuZXh0ZW50ID0gRVhURU5UO1xuICAgICAgICB0aGlzLnR5cGUgPSBmZWF0dXJlLnR5cGU7XG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IGZlYXR1cmUudGFncztcblxuICAgICAgICAvLyBJZiB0aGUgZmVhdHVyZSBoYXMgYSB0b3AtbGV2ZWwgYGlkYCBwcm9wZXJ0eSwgY29weSBpdCBvdmVyLCBidXQgb25seVxuICAgICAgICAvLyBpZiBpdCBjYW4gYmUgY29lcmNlZCB0byBhbiBpbnRlZ2VyLCBiZWNhdXNlIHRoaXMgd3JhcHBlciBpcyB1c2VkIGZvclxuICAgICAgICAvLyBzZXJpYWxpemluZyBnZW9qc29uIGZlYXR1cmUgZGF0YSBpbnRvIHZlY3RvciB0aWxlIFBCRiBkYXRhLCBhbmQgdGhlXG4gICAgICAgIC8vIHZlY3RvciB0aWxlIHNwZWMgb25seSBzdXBwb3J0cyBpbnRlZ2VyIHZhbHVlcyBmb3IgZmVhdHVyZSBpZHMgLS1cbiAgICAgICAgLy8gYWxsb3dpbmcgbm9uLWludGVnZXIgdmFsdWVzIGhlcmUgcmVzdWx0cyBpbiBhIG5vbi1jb21wbGlhbnQgUEJGXG4gICAgICAgIC8vIHRoYXQgY2F1c2VzIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IGlzIHBhcnNlZCB3aXRoIHZlY3Rvci10aWxlLWpzXG4gICAgICAgIGlmICgnaWQnIGluIGZlYXR1cmUgJiYgIWlzTmFOKGZlYXR1cmUuaWQpKSB7XG4gICAgICAgICAgICB0aGlzLmlkID0gcGFyc2VJbnQoZmVhdHVyZS5pZCwgMTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZEdlb21ldHJ5KCkge1xuICAgICAgICBpZiAodGhpcy5fZmVhdHVyZS50eXBlID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBnZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiB0aGlzLl9mZWF0dXJlLmdlb21ldHJ5KSB7XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnkucHVzaChbbmV3IFBvaW50KHBvaW50WzBdLCBwb2ludFsxXSldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGdlb21ldHJ5ID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJpbmcgb2YgdGhpcy5fZmVhdHVyZS5nZW9tZXRyeSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1JpbmcgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3UmluZy5wdXNoKG5ldyBQb2ludChwb2ludFswXSwgcG9pbnRbMV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnkucHVzaChuZXdSaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvR2VvSlNPTih4ICAgICAgICAsIHkgICAgICAgICwgeiAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0b0dlb0pTT04uY2FsbCh0aGlzLCB4LCB5LCB6KTtcbiAgICB9XG59XG5cbmNsYXNzIEdlb0pTT05XcmFwcGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGZlYXR1cmVzICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLmxheWVycyA9IHsgJ19nZW9qc29uVGlsZUxheWVyJzogdGhpcyB9O1xuICAgICAgICB0aGlzLm5hbWUgPSAnX2dlb2pzb25UaWxlTGF5ZXInO1xuICAgICAgICB0aGlzLmV4dGVudCA9IEVYVEVOVDtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBmZWF0dXJlcy5sZW5ndGg7XG4gICAgICAgIHRoaXMuX2ZlYXR1cmVzID0gZmVhdHVyZXM7XG4gICAgfVxuXG4gICAgZmVhdHVyZShpICAgICAgICApICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgIHJldHVybiBuZXcgRmVhdHVyZVdyYXBwZXIodGhpcy5fZmVhdHVyZXNbaV0pO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBHZW9KU09OV3JhcHBlcjtcbiIsIi8vICAgICAgXG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbmNvbnN0IHtDYW5vbmljYWxUaWxlSUR9ID0gcmVxdWlyZSgnLi90aWxlX2lkJyk7XG5jb25zdCBMbmdMYXQgPSByZXF1aXJlKCcuLi9nZW8vbG5nX2xhdCcpO1xuY29uc3QgUG9pbnQgPSByZXF1aXJlKCdAbWFwYm94L3BvaW50LWdlb21ldHJ5Jyk7XG5jb25zdCBFdmVudGVkID0gcmVxdWlyZSgnLi4vdXRpbC9ldmVudGVkJyk7XG5jb25zdCBhamF4ID0gcmVxdWlyZSgnLi4vdXRpbC9hamF4Jyk7XG5jb25zdCBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG5jb25zdCBFWFRFTlQgPSByZXF1aXJlKCcuLi9kYXRhL2V4dGVudCcpO1xuY29uc3Qge1Jhc3RlckJvdW5kc0FycmF5fSA9IHJlcXVpcmUoJy4uL2RhdGEvYXJyYXlfdHlwZXMnKTtcbmNvbnN0IHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMgPSByZXF1aXJlKCcuLi9kYXRhL3Jhc3Rlcl9ib3VuZHNfYXR0cmlidXRlcycpO1xuY29uc3QgVmVydGV4QXJyYXlPYmplY3QgPSByZXF1aXJlKCcuLi9yZW5kZXIvdmVydGV4X2FycmF5X29iamVjdCcpO1xuY29uc3QgVGV4dHVyZSA9IHJlcXVpcmUoJy4uL3JlbmRlci90ZXh0dXJlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuLyoqXG4gKiBBIGRhdGEgc291cmNlIGNvbnRhaW5pbmcgYW4gaW1hZ2UuXG4gKiAoU2VlIHRoZSBbU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jc291cmNlcy1pbWFnZSkgZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb2Ygb3B0aW9ucy4pXG4gKlxuICogQGludGVyZmFjZSBJbWFnZVNvdXJjZVxuICogQGV4YW1wbGVcbiAqIC8vIGFkZCB0byBtYXBcbiAqIG1hcC5hZGRTb3VyY2UoJ3NvbWUgaWQnLCB7XG4gKiAgICB0eXBlOiAnaW1hZ2UnLFxuICogICAgdXJsOiAnaHR0cHM6Ly93d3cubWFwYm94LmNvbS9pbWFnZXMvZm9vLnBuZycsXG4gKiAgICBjb29yZGluYXRlczogW1xuICogICAgICAgIFstNzYuNTQsIDM5LjE4XSxcbiAqICAgICAgICBbLTc2LjUyLCAzOS4xOF0sXG4gKiAgICAgICAgWy03Ni41MiwgMzkuMTddLFxuICogICAgICAgIFstNzYuNTQsIDM5LjE3XVxuICogICAgXVxuICogfSk7XG4gKlxuICogLy8gdXBkYXRlXG4gKiB2YXIgbXlTb3VyY2UgPSBtYXAuZ2V0U291cmNlKCdzb21lIGlkJyk7XG4gKiBteVNvdXJjZS5zZXRDb29yZGluYXRlcyhbXG4gKiAgICAgWy03Ni41NDMzNTczNzIyODM5NCwgMzkuMTg1Nzk5MDcyMjk3NDhdLFxuICogICAgIFstNzYuNTI4MDM2NTk0MzkwODcsIDM5LjE4MzgzNjQ4NDc1ODddLFxuICogICAgIFstNzYuNTI5NTM4NjMxNDM5MiwgMzkuMTc2ODMzOTI1MDc2MDZdLFxuICogICAgIFstNzYuNTQ1MjAyNzMyMDg2MTgsIDM5LjE3ODc2MzQ0MTA2NjQyXVxuICogXSk7XG4gKlxuICogbWFwLnJlbW92ZVNvdXJjZSgnc29tZSBpZCcpOyAgLy8gcmVtb3ZlXG4gKiBAc2VlIFtBZGQgYW4gaW1hZ2VdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvaW1hZ2Utb24tYS1tYXAvKVxuICovXG5jbGFzcyBJbWFnZVNvdXJjZSBleHRlbmRzIEV2ZW50ZWQgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGlkICAgICAgICAsIG9wdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGRpc3BhdGNoZXIgICAgICAgICAgICAsIGV2ZW50ZWRQYXJlbnQgICAgICAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyO1xuICAgICAgICB0aGlzLmNvb3JkaW5hdGVzID0gb3B0aW9ucy5jb29yZGluYXRlcztcblxuICAgICAgICB0aGlzLnR5cGUgPSAnaW1hZ2UnO1xuICAgICAgICB0aGlzLm1pbnpvb20gPSAwO1xuICAgICAgICB0aGlzLm1heHpvb20gPSAyMjtcbiAgICAgICAgdGhpcy50aWxlU2l6ZSA9IDUxMjtcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuXG4gICAgICAgIHRoaXMuc2V0RXZlbnRlZFBhcmVudChldmVudGVkUGFyZW50KTtcblxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cblxuICAgIGxvYWQoKSB7XG4gICAgICAgIHRoaXMuZmlyZSgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnfSk7XG5cbiAgICAgICAgdGhpcy51cmwgPSB0aGlzLm9wdGlvbnMudXJsO1xuXG4gICAgICAgIGFqYXguZ2V0SW1hZ2UodGhpcy5tYXAuX3RyYW5zZm9ybVJlcXVlc3QodGhpcy51cmwsIGFqYXguUmVzb3VyY2VUeXBlLkltYWdlKSwgKGVyciwgaW1hZ2UpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywge2Vycm9yOiBlcnJ9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmltYWdlID0gYnJvd3Nlci5nZXRJbWFnZURhdGEoaW1hZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmlzaExvYWRpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2ZpbmlzaExvYWRpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLm1hcCkge1xuICAgICAgICAgICAgdGhpcy5zZXRDb29yZGluYXRlcyh0aGlzLmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZGF0YScsIHtkYXRhVHlwZTogJ3NvdXJjZScsIHNvdXJjZURhdGFUeXBlOiAnbWV0YWRhdGEnfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkFkZChtYXAgICAgICkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaW1hZ2UncyBjb29yZGluYXRlcyBhbmQgcmUtcmVuZGVycyB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gY29vcmRpbmF0ZXMgRm91ciBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMsXG4gICAgICogICByZXByZXNlbnRlZCBhcyBhcnJheXMgb2YgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBudW1iZXJzLCB3aGljaCBkZWZpbmUgdGhlIGNvcm5lcnMgb2YgdGhlIGltYWdlLlxuICAgICAqICAgVGhlIGNvb3JkaW5hdGVzIHN0YXJ0IGF0IHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGltYWdlIGFuZCBwcm9jZWVkIGluIGNsb2Nrd2lzZSBvcmRlci5cbiAgICAgKiAgIFRoZXkgZG8gbm90IGhhdmUgdG8gcmVwcmVzZW50IGEgcmVjdGFuZ2xlLlxuICAgICAqIEByZXR1cm5zIHtJbWFnZVNvdXJjZX0gdGhpc1xuICAgICAqL1xuICAgIHNldENvb3JkaW5hdGVzKGNvb3JkaW5hdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5jb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB3aGljaCBtZXJjYXRvciB0aWxlIGlzIHN1aXRhYmxlIGZvciByZW5kZXJpbmcgdGhlIHZpZGVvIGluXG4gICAgICAgIC8vIGFuZCBjcmVhdGUgYSBidWZmZXIgd2l0aCB0aGUgY29ybmVyIGNvb3JkaW5hdGVzLiBUaGVzZSBjb29yZGluYXRlc1xuICAgICAgICAvLyBtYXkgYmUgb3V0c2lkZSB0aGUgdGlsZSwgYmVjYXVzZSByYXN0ZXIgdGlsZXMgYXJlbid0IGNsaXBwZWQgd2hlbiByZW5kZXJpbmcuXG5cbiAgICAgICAgY29uc3QgbWFwID0gdGhpcy5tYXA7XG5cbiAgICAgICAgLy8gdHJhbnNmb3JtIHRoZSBnZW8gY29vcmRpbmF0ZXMgaW50byAoem9vbSAwKSB0aWxlIHNwYWNlIGNvb3JkaW5hdGVzXG4gICAgICAgIGNvbnN0IGNvcm5lclowQ29vcmRzID0gY29vcmRpbmF0ZXMubWFwKChjb29yZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1hcC50cmFuc2Zvcm0ubG9jYXRpb25Db29yZGluYXRlKExuZ0xhdC5jb252ZXJ0KGNvb3JkKSkuem9vbVRvKDApO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDb21wdXRlIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgdGlsZSB3ZSdsbCB1c2UgdG8gaG9sZCB0aGlzIGltYWdlJ3NcbiAgICAgICAgLy8gcmVuZGVyIGRhdGFcbiAgICAgICAgY29uc3QgY2VudGVyQ29vcmQgPSB0aGlzLmNlbnRlckNvb3JkID0gdXRpbC5nZXRDb29yZGluYXRlc0NlbnRlcihjb3JuZXJaMENvb3Jkcyk7XG4gICAgICAgIC8vIGBjb2x1bW5gIGFuZCBgcm93YCBtYXkgYmUgZnJhY3Rpb25hbDsgcm91bmQgdGhlbSBkb3duIHNvIHRoYXQgdGhleVxuICAgICAgICAvLyByZXByZXNlbnQgaW50ZWdlciB0aWxlIGNvb3JkaW5hdGVzXG4gICAgICAgIGNlbnRlckNvb3JkLmNvbHVtbiA9IE1hdGguZmxvb3IoY2VudGVyQ29vcmQuY29sdW1uKTtcbiAgICAgICAgY2VudGVyQ29vcmQucm93ID0gTWF0aC5mbG9vcihjZW50ZXJDb29yZC5yb3cpO1xuICAgICAgICB0aGlzLnRpbGVJRCA9IG5ldyBDYW5vbmljYWxUaWxlSUQoY2VudGVyQ29vcmQuem9vbSwgY2VudGVyQ29vcmQuY29sdW1uLCBjZW50ZXJDb29yZC5yb3cpO1xuXG4gICAgICAgIC8vIENvbnN0cmFpbiBtaW4vbWF4IHpvb20gdG8gb3VyIHRpbGUncyB6b29tIGxldmVsIGluIG9yZGVyIHRvIGZvcmNlXG4gICAgICAgIC8vIFNvdXJjZUNhY2hlIHRvIHJlcXVlc3QgdGhpcyB0aWxlIChubyBtYXR0ZXIgd2hhdCB0aGUgbWFwJ3Mgem9vbVxuICAgICAgICAvLyBsZXZlbClcbiAgICAgICAgdGhpcy5taW56b29tID0gdGhpcy5tYXh6b29tID0gY2VudGVyQ29vcmQuem9vbTtcblxuICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIGNvcm5lciBjb29yZGluYXRlcyBpbnRvIHRoZSBjb29yZGluYXRlIHNwYWNlIG9mIG91clxuICAgICAgICAvLyB0aWxlLlxuICAgICAgICBjb25zdCB0aWxlQ29vcmRzID0gY29ybmVyWjBDb29yZHMubWFwKChjb29yZCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgem9vbWVkQ29vcmQgPSBjb29yZC56b29tVG8oY2VudGVyQ29vcmQuem9vbSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KFxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoKHpvb21lZENvb3JkLmNvbHVtbiAtIGNlbnRlckNvb3JkLmNvbHVtbikgKiBFWFRFTlQpLFxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoKHpvb21lZENvb3JkLnJvdyAtIGNlbnRlckNvb3JkLnJvdykgKiBFWFRFTlQpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fYm91bmRzQXJyYXkgPSBuZXcgUmFzdGVyQm91bmRzQXJyYXkoKTtcbiAgICAgICAgdGhpcy5fYm91bmRzQXJyYXkuZW1wbGFjZUJhY2sodGlsZUNvb3Jkc1swXS54LCB0aWxlQ29vcmRzWzBdLnksIDAsIDApO1xuICAgICAgICB0aGlzLl9ib3VuZHNBcnJheS5lbXBsYWNlQmFjayh0aWxlQ29vcmRzWzFdLngsIHRpbGVDb29yZHNbMV0ueSwgRVhURU5ULCAwKTtcbiAgICAgICAgdGhpcy5fYm91bmRzQXJyYXkuZW1wbGFjZUJhY2sodGlsZUNvb3Jkc1szXS54LCB0aWxlQ29vcmRzWzNdLnksIDAsIEVYVEVOVCk7XG4gICAgICAgIHRoaXMuX2JvdW5kc0FycmF5LmVtcGxhY2VCYWNrKHRpbGVDb29yZHNbMl0ueCwgdGlsZUNvb3Jkc1syXS55LCBFWFRFTlQsIEVYVEVOVCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYm91bmRzQnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLmJvdW5kc0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5ib3VuZHNCdWZmZXI7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpcmUoJ2RhdGEnLCB7ZGF0YVR5cGU6J3NvdXJjZScsIHNvdXJjZURhdGFUeXBlOiAnY29udGVudCd9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHJlcGFyZSgpIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMudGlsZXMpLmxlbmd0aCA9PT0gMCB8fCAhdGhpcy5pbWFnZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMubWFwLnBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIGlmICghdGhpcy5ib3VuZHNCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzQnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5fYm91bmRzQXJyYXksIHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYm91bmRzVkFPKSB7XG4gICAgICAgICAgICB0aGlzLmJvdW5kc1ZBTyA9IG5ldyBWZXJ0ZXhBcnJheU9iamVjdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIHRoaXMuaW1hZ2UsIGdsLlJHQkEpO1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgdyBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy50aWxlc1t3XTtcbiAgICAgICAgICAgIGlmICh0aWxlLnN0YXRlICE9PSAnbG9hZGVkJykge1xuICAgICAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAnbG9hZGVkJztcbiAgICAgICAgICAgICAgICB0aWxlLnRleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkVGlsZSh0aWxlICAgICAgLCBjYWxsYmFjayAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBhIHNpbmdsZSB0aWxlIC0tIHdob29zZSBjb29yZGluYXRlcyBhcmUgdGhpcy50aWxlSUQgLS0gdGhhdFxuICAgICAgICAvLyBjb3ZlcnMgdGhlIGltYWdlIHdlIHdhbnQgdG8gcmVuZGVyLiAgSWYgdGhhdCdzIHRoZSBvbmUgYmVpbmdcbiAgICAgICAgLy8gcmVxdWVzdGVkLCBzZXQgaXQgdXAgd2l0aCB0aGUgaW1hZ2U7IG90aGVyd2lzZSwgbWFyayB0aGUgdGlsZSBhc1xuICAgICAgICAvLyBgZXJyb3JlZGAgdG8gaW5kaWNhdGUgdGhhdCB3ZSBoYXZlIG5vIGRhdGEgZm9yIGl0LlxuICAgICAgICAvLyBJZiB0aGUgd29ybGQgd3JhcHMsIHdlIG1heSBoYXZlIG11bHRpcGxlIFwid3JhcHBlZFwiIGNvcGllcyBvZiB0aGVcbiAgICAgICAgLy8gc2luZ2xlIHRpbGUuXG4gICAgICAgIGlmICh0aGlzLnRpbGVJRCAmJiB0aGlzLnRpbGVJRC5lcXVhbHModGlsZS50aWxlSUQuY2Fub25pY2FsKSkge1xuICAgICAgICAgICAgdGhpcy50aWxlc1tTdHJpbmcodGlsZS50aWxlSUQud3JhcCldID0gdGlsZTtcbiAgICAgICAgICAgIHRpbGUuYnVja2V0cyA9IHt9O1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2Vycm9yZWQnO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSAgICAgICAgIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdpbWFnZScsXG4gICAgICAgICAgICB1cmw6IHRoaXMub3B0aW9ucy51cmwsXG4gICAgICAgICAgICBjb29yZGluYXRlczogdGhpcy5jb29yZGluYXRlc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gSW1hZ2VTb3VyY2U7XG4iLCIvLyAgICAgIFxuXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5jb25zdCBhamF4ID0gcmVxdWlyZSgnLi4vdXRpbC9hamF4Jyk7XG5jb25zdCBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG5jb25zdCBub3JtYWxpemVVUkwgPSByZXF1aXJlKCcuLi91dGlsL21hcGJveCcpLm5vcm1hbGl6ZVNvdXJjZVVSTDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob3B0aW9ucyAgICAgLCByZXF1ZXN0VHJhbnNmb3JtRm4gICAgICAgICAgICAgICAgICAgICAgICAgICwgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICkge1xuICAgIGNvbnN0IGxvYWRlZCA9IGZ1bmN0aW9uKGVyciwgdGlsZUpTT04gICAgICkge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aWxlSlNPTikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ICAgICAgPSB1dGlsLnBpY2sodGlsZUpTT04sIFsndGlsZXMnLCAnbWluem9vbScsICdtYXh6b29tJywgJ2F0dHJpYnV0aW9uJywgJ21hcGJveF9sb2dvJywgJ2JvdW5kcyddKTtcblxuICAgICAgICAgICAgaWYgKHRpbGVKU09OLnZlY3Rvcl9sYXllcnMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQudmVjdG9yTGF5ZXJzID0gdGlsZUpTT04udmVjdG9yX2xheWVycztcbiAgICAgICAgICAgICAgICByZXN1bHQudmVjdG9yTGF5ZXJJZHMgPSByZXN1bHQudmVjdG9yTGF5ZXJzLm1hcCgobGF5ZXIpID0+IHsgcmV0dXJuIGxheWVyLmlkOyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAob3B0aW9ucy51cmwpIHtcbiAgICAgICAgYWpheC5nZXRKU09OKHJlcXVlc3RUcmFuc2Zvcm1Gbihub3JtYWxpemVVUkwob3B0aW9ucy51cmwpLCBhamF4LlJlc291cmNlVHlwZS5Tb3VyY2UpLCBsb2FkZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGJyb3dzZXIuZnJhbWUoKCkgPT4gbG9hZGVkKG51bGwsIG9wdGlvbnMpKTtcbiAgICB9XG59O1xuIiwiLy8gICAgICBcblxuY29uc3QgRVhURU5UID0gcmVxdWlyZSgnLi4vZGF0YS9leHRlbnQnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbi8qKlxuICogQ29udmVydHMgYSBwaXhlbCB2YWx1ZSBhdCBhIHRoZSBnaXZlbiB6b29tIGxldmVsIHRvIHRpbGUgdW5pdHMuXG4gKlxuICogVGhlIHNoYWRlcnMgbW9zdGx5IGNhbGN1bGF0ZSBldmVyeXRoaW5nIGluIHRpbGUgdW5pdHMgc28gc3R5bGVcbiAqIHByb3BlcnRpZXMgbmVlZCB0byBiZSBjb252ZXJ0ZWQgZnJvbSBwaXhlbHMgdG8gdGlsZSB1bml0cyB1c2luZyB0aGlzLlxuICpcbiAqIEZvciBleGFtcGxlLCBhIHRyYW5zbGF0aW9uIGJ5IDMwIHBpeGVscyBhdCB6b29tIDYuNSB3aWxsIGJlIGFcbiAqIHRyYW5zbGF0aW9uIGJ5IHBpeGVsc1RvVGlsZVVuaXRzKDMwLCA2LjUpIHRpbGUgdW5pdHMuXG4gKlxuICogQHJldHVybnMgdmFsdWUgaW4gdGlsZSB1bml0c1xuICogQHByaXZhdGVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih0aWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgcGl4ZWxWYWx1ZSAgICAgICAgLCB6ICAgICAgICApICAgICAgICAge1xuICAgIHJldHVybiBwaXhlbFZhbHVlICogKEVYVEVOVCAvICh0aWxlLnRpbGVTaXplICogTWF0aC5wb3coMiwgeiAtIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaKSkpO1xufTtcbiIsIi8vICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuZXhwb3J0cy5yZW5kZXJlZCA9IGZ1bmN0aW9uKHNvdXJjZUNhY2hlICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUxheWVycyAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUdlb21ldHJ5ICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhcmluZyAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkluZGV4ICAgICAgICAgICAgICAgICApIHtcbiAgICBjb25zdCB0aWxlc0luID0gc291cmNlQ2FjaGUudGlsZXNJbihxdWVyeUdlb21ldHJ5KTtcblxuICAgIHRpbGVzSW4uc29ydChzb3J0VGlsZXNJbik7XG5cbiAgICBjb25zdCByZW5kZXJlZEZlYXR1cmVMYXllcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRpbGVJbiBvZiB0aWxlc0luKSB7XG4gICAgICAgIHJlbmRlcmVkRmVhdHVyZUxheWVycy5wdXNoKHtcbiAgICAgICAgICAgIHdyYXBwZWRUaWxlSUQ6IHRpbGVJbi50aWxlSUQud3JhcHBlZCgpLmtleSxcbiAgICAgICAgICAgIHF1ZXJ5UmVzdWx0czogdGlsZUluLnRpbGUucXVlcnlSZW5kZXJlZEZlYXR1cmVzKFxuICAgICAgICAgICAgICAgIHN0eWxlTGF5ZXJzLFxuICAgICAgICAgICAgICAgIHRpbGVJbi5xdWVyeUdlb21ldHJ5LFxuICAgICAgICAgICAgICAgIHRpbGVJbi5zY2FsZSxcbiAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgYmVhcmluZyxcbiAgICAgICAgICAgICAgICBzb3VyY2VDYWNoZS5pZCxcbiAgICAgICAgICAgICAgICBjb2xsaXNpb25JbmRleClcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlUmVuZGVyZWRGZWF0dXJlTGF5ZXJzKHJlbmRlcmVkRmVhdHVyZUxheWVycyk7XG59O1xuXG5leHBvcnRzLnNvdXJjZSA9IGZ1bmN0aW9uKHNvdXJjZUNhY2hlICAgICAgICAgICAgICwgcGFyYW1zICAgICApIHtcbiAgICBjb25zdCB0aWxlcyA9IHNvdXJjZUNhY2hlLmdldFJlbmRlcmFibGVJZHMoKS5tYXAoKGlkKSA9PiB7XG4gICAgICAgIHJldHVybiBzb3VyY2VDYWNoZS5nZXRUaWxlQnlJRChpZCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIGNvbnN0IGRhdGFUaWxlcyA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHRpbGVzW2ldO1xuICAgICAgICBjb25zdCBkYXRhSUQgPSB0aWxlLnRpbGVJRC5jYW5vbmljYWwua2V5O1xuICAgICAgICBpZiAoIWRhdGFUaWxlc1tkYXRhSURdKSB7XG4gICAgICAgICAgICBkYXRhVGlsZXNbZGF0YUlEXSA9IHRydWU7XG4gICAgICAgICAgICB0aWxlLnF1ZXJ5U291cmNlRmVhdHVyZXMocmVzdWx0LCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmZ1bmN0aW9uIHNvcnRUaWxlc0luKGEsIGIpIHtcbiAgICBjb25zdCBpZEEgPSBhLnRpbGVJRDtcbiAgICBjb25zdCBpZEIgPSBiLnRpbGVJRDtcbiAgICByZXR1cm4gKGlkQS5vdmVyc2NhbGVkWiAtIGlkQi5vdmVyc2NhbGVkWikgfHwgKGlkQS5jYW5vbmljYWwueSAtIGlkQi5jYW5vbmljYWwueSkgfHwgKGlkQS53cmFwIC0gaWRCLndyYXApIHx8IChpZEEuY2Fub25pY2FsLnggLSBpZEIuY2Fub25pY2FsLngpO1xufVxuXG5mdW5jdGlvbiBtZXJnZVJlbmRlcmVkRmVhdHVyZUxheWVycyh0aWxlcykge1xuICAgIC8vIE1lcmdlIHJlc3VsdHMgZnJvbSBhbGwgdGlsZXMsIGJ1dCBpZiB0d28gdGlsZXMgc2hhcmUgdGhlIHNhbWVcbiAgICAvLyB3cmFwcGVkIElELCBkb24ndCBkdXBsaWNhdGUgZmVhdHVyZXMgYmV0d2VlbiB0aGUgdHdvIHRpbGVzXG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgY29uc3Qgd3JhcHBlZElETGF5ZXJNYXAgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHRpbGUgb2YgdGlsZXMpIHtcbiAgICAgICAgY29uc3QgcXVlcnlSZXN1bHRzID0gdGlsZS5xdWVyeVJlc3VsdHM7XG4gICAgICAgIGNvbnN0IHdyYXBwZWRJRCA9IHRpbGUud3JhcHBlZFRpbGVJRDtcbiAgICAgICAgY29uc3Qgd3JhcHBlZElETGF5ZXJzID0gd3JhcHBlZElETGF5ZXJNYXBbd3JhcHBlZElEXSA9IHdyYXBwZWRJRExheWVyTWFwW3dyYXBwZWRJRF0gfHwge307XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJRCBpbiBxdWVyeVJlc3VsdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGVGZWF0dXJlcyA9IHF1ZXJ5UmVzdWx0c1tsYXllcklEXTtcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRJREZlYXR1cmVzID0gd3JhcHBlZElETGF5ZXJzW2xheWVySURdID0gd3JhcHBlZElETGF5ZXJzW2xheWVySURdIHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0RmVhdHVyZXMgPSByZXN1bHRbbGF5ZXJJRF0gPSByZXN1bHRbbGF5ZXJJRF0gfHwgW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRpbGVGZWF0dXJlIG9mIHRpbGVGZWF0dXJlcykge1xuICAgICAgICAgICAgICAgIGlmICghd3JhcHBlZElERmVhdHVyZXNbdGlsZUZlYXR1cmUuZmVhdHVyZUluZGV4XSkge1xuICAgICAgICAgICAgICAgICAgICB3cmFwcGVkSURGZWF0dXJlc1t0aWxlRmVhdHVyZS5mZWF0dXJlSW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0RmVhdHVyZXMucHVzaCh0aWxlRmVhdHVyZS5mZWF0dXJlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsIi8vICAgICAgXG5cbmNvbnN0IGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbmNvbnN0IEV2ZW50ZWQgPSByZXF1aXJlKCcuLi91dGlsL2V2ZW50ZWQnKTtcbmNvbnN0IG5vcm1hbGl6ZVVSTCA9IHJlcXVpcmUoJy4uL3V0aWwvbWFwYm94Jykubm9ybWFsaXplVGlsZVVSTDtcbmNvbnN0IGJyb3dzZXIgPSByZXF1aXJlKCcuLi91dGlsL2Jyb3dzZXInKTtcbmNvbnN0IHtPdmVyc2NhbGVkVGlsZUlEfSA9IHJlcXVpcmUoJy4vdGlsZV9pZCcpO1xuY29uc3QgUmFzdGVyVGlsZVNvdXJjZSA9IHJlcXVpcmUoJy4vcmFzdGVyX3RpbGVfc291cmNlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5cbmNsYXNzIFJhc3RlckRFTVRpbGVTb3VyY2UgZXh0ZW5kcyBSYXN0ZXJUaWxlU291cmNlICAgICAgICAgICAgICAgICAgIHtcbiAgICBjb25zdHJ1Y3RvcihpZCAgICAgICAgLCBvcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBkaXNwYXRjaGVyICAgICAgICAgICAgLCBldmVudGVkUGFyZW50ICAgICAgICAgKSB7XG4gICAgICAgIHN1cGVyKGlkLCBvcHRpb25zLCBkaXNwYXRjaGVyLCBldmVudGVkUGFyZW50KTtcbiAgICAgICAgdGhpcy50eXBlID0gJ3Jhc3Rlci1kZW0nO1xuICAgICAgICB0aGlzLm1heHpvb20gPSAyMjtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHt9LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAncmFzdGVyLWRlbScsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgdGlsZVNpemU6IHRoaXMudGlsZVNpemUsXG4gICAgICAgICAgICB0aWxlczogdGhpcy50aWxlcyxcbiAgICAgICAgICAgIGJvdW5kczogdGhpcy5ib3VuZHMsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgbG9hZFRpbGUodGlsZSAgICAgICwgY2FsbGJhY2sgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5vcm1hbGl6ZVVSTCh0aWxlLnRpbGVJRC5jYW5vbmljYWwudXJsKHRoaXMudGlsZXMsIHRoaXMuc2NoZW1lKSwgdGhpcy51cmwsIHRoaXMudGlsZVNpemUpO1xuICAgICAgICB0aWxlLnJlcXVlc3QgPSBhamF4LmdldEltYWdlKHRoaXMubWFwLl90cmFuc2Zvcm1SZXF1ZXN0KHVybCwgYWpheC5SZXNvdXJjZVR5cGUuVGlsZSksIGltYWdlTG9hZGVkLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRpbGUubmVpZ2hib3JpbmdUaWxlcyA9IHRoaXMuX2dldE5laWdoYm9yaW5nVGlsZXModGlsZS50aWxlSUQpO1xuICAgICAgICBmdW5jdGlvbiBpbWFnZUxvYWRlZChlcnIsIGltZykge1xuICAgICAgICAgICAgZGVsZXRlIHRpbGUucmVxdWVzdDtcbiAgICAgICAgICAgIGlmICh0aWxlLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ3VubG9hZGVkJztcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdlcnJvcmVkJztcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpbWcpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXAuX3JlZnJlc2hFeHBpcmVkVGlsZXMpIHRpbGUuc2V0RXhwaXJ5RGF0YShpbWcpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSAoaW1nICAgICApLmNhY2hlQ29udHJvbDtcbiAgICAgICAgICAgICAgICBkZWxldGUgKGltZyAgICAgKS5leHBpcmVzO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmF3SW1hZ2VEYXRhID0gYnJvd3Nlci5nZXRJbWFnZURhdGEoaW1nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHVpZDogdGlsZS51aWQsXG4gICAgICAgICAgICAgICAgICAgIGNvb3JkOiB0aWxlLnRpbGVJRCxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICByYXdJbWFnZURhdGE6IHJhd0ltYWdlRGF0YVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRpbGUud29ya2VySUQgfHwgdGlsZS5zdGF0ZSA9PT0gJ2V4cGlyZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUud29ya2VySUQgPSB0aGlzLmRpc3BhdGNoZXIuc2VuZCgnbG9hZERFTVRpbGUnLCBwYXJhbXMsIGRvbmUuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZG9uZShlcnIsIGRlbSkge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAnZXJyb3JlZCc7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRlbSkge1xuICAgICAgICAgICAgICAgIHRpbGUuZGVtID0gZGVtO1xuICAgICAgICAgICAgICAgIHRpbGUubmVlZHNIaWxsc2hhZGVQcmVwYXJlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2xvYWRlZCc7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIF9nZXROZWlnaGJvcmluZ1RpbGVzKHRpbGVJRCAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCBjYW5vbmljYWwgPSB0aWxlSUQuY2Fub25pY2FsO1xuICAgICAgICBjb25zdCBkaW0gPSBNYXRoLnBvdygyLCBjYW5vbmljYWwueik7XG5cbiAgICAgICAgY29uc3QgcHggPSAoY2Fub25pY2FsLnggLSAxICsgZGltKSAlIGRpbTtcbiAgICAgICAgY29uc3QgcHh3ID0gY2Fub25pY2FsLnggPT09IDAgPyB0aWxlSUQud3JhcCAtIDEgOiB0aWxlSUQud3JhcDtcbiAgICAgICAgY29uc3QgbnggPSAoY2Fub25pY2FsLnggKyAxICsgZGltKSAlIGRpbTtcbiAgICAgICAgY29uc3Qgbnh3ID0gY2Fub25pY2FsLnggKyAxID09PSBkaW0gPyB0aWxlSUQud3JhcCArIDEgOiB0aWxlSUQud3JhcDtcblxuICAgICAgICBjb25zdCBuZWlnaGJvcmluZ1RpbGVzID0ge307XG4gICAgICAgIC8vIGFkZCBhZGphY2VudCB0aWxlc1xuICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgcHh3LCBjYW5vbmljYWwueiwgcHgsIGNhbm9uaWNhbC55KS5rZXldID0ge2JhY2tmaWxsZWQ6IGZhbHNlfTtcbiAgICAgICAgbmVpZ2hib3JpbmdUaWxlc1tuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aWxlSUQub3ZlcnNjYWxlZFosIG54dywgY2Fub25pY2FsLnosIG54LCBjYW5vbmljYWwueSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XG5cbiAgICAgICAgLy8gQWRkIHVwcGVyIG5laWdoYm9yaW5nVGlsZXNcbiAgICAgICAgaWYgKGNhbm9uaWNhbC55ID4gMCkge1xuICAgICAgICAgICAgbmVpZ2hib3JpbmdUaWxlc1tuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aWxlSUQub3ZlcnNjYWxlZFosIHB4dywgY2Fub25pY2FsLnosIHB4LCBjYW5vbmljYWwueSAtIDEpLmtleV0gPSB7YmFja2ZpbGxlZDogZmFsc2V9O1xuICAgICAgICAgICAgbmVpZ2hib3JpbmdUaWxlc1tuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aWxlSUQub3ZlcnNjYWxlZFosIHRpbGVJRC53cmFwLCBjYW5vbmljYWwueiwgY2Fub25pY2FsLngsIGNhbm9uaWNhbC55IC0gMSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XG4gICAgICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgbnh3LCBjYW5vbmljYWwueiwgbngsIGNhbm9uaWNhbC55IC0gMSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWRkIGxvd2VyIG5laWdoYm9yaW5nVGlsZXNcbiAgICAgICAgaWYgKGNhbm9uaWNhbC55ICsgMSA8IGRpbSkge1xuICAgICAgICAgICAgbmVpZ2hib3JpbmdUaWxlc1tuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aWxlSUQub3ZlcnNjYWxlZFosIHB4dywgY2Fub25pY2FsLnosIHB4LCBjYW5vbmljYWwueSArIDEpLmtleV0gPSB7YmFja2ZpbGxlZDogZmFsc2V9O1xuICAgICAgICAgICAgbmVpZ2hib3JpbmdUaWxlc1tuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aWxlSUQub3ZlcnNjYWxlZFosIHRpbGVJRC53cmFwLCBjYW5vbmljYWwueiwgY2Fub25pY2FsLngsIGNhbm9uaWNhbC55ICsgMSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XG4gICAgICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgbnh3LCBjYW5vbmljYWwueiwgbngsIGNhbm9uaWNhbC55ICsgMSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmVpZ2hib3JpbmdUaWxlcztcbiAgICB9XG5cblxuICAgIHVubG9hZFRpbGUodGlsZSAgICAgICkge1xuICAgICAgICBpZiAodGlsZS5kZW1UZXh0dXJlKSB0aGlzLm1hcC5wYWludGVyLnNhdmVUaWxlVGV4dHVyZSh0aWxlLmRlbVRleHR1cmUpO1xuICAgICAgICBpZiAodGlsZS5mYm8pIHtcbiAgICAgICAgICAgIHRpbGUuZmJvLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aWxlLmZibztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGlsZS5kZW0pIGRlbGV0ZSB0aWxlLmRlbTtcbiAgICAgICAgZGVsZXRlIHRpbGUubmVpZ2hib3JpbmdUaWxlcztcblxuICAgICAgICB0aWxlLnN0YXRlID0gJ3VubG9hZGVkJztcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ3JlbW92ZURFTVRpbGUnLCB7IHVpZDogdGlsZS51aWQsIHNvdXJjZTogdGhpcy5pZCB9LCB1bmRlZmluZWQsIHRpbGUud29ya2VySUQpO1xuICAgIH1cblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJhc3RlckRFTVRpbGVTb3VyY2U7XG4iLCIvLyAgICAgIFxuXG5jb25zdCB7REVNRGF0YX0gPSByZXF1aXJlKCcuLi9kYXRhL2RlbV9kYXRhJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5cbmNsYXNzIFJhc3RlckRFTVRpbGVXb3JrZXJTb3VyY2Uge1xuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB7fTtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSB7fTtcbiAgICB9XG5cbiAgICBsb2FkVGlsZShwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgLCBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHBhcmFtcy5zb3VyY2UsXG4gICAgICAgICAgICB1aWQgPSBwYXJhbXMudWlkO1xuXG4gICAgICAgIGlmICghdGhpcy5sb2FkaW5nW3NvdXJjZV0pXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdbc291cmNlXSA9IHt9O1xuXG4gICAgICAgIGNvbnN0IGRlbSA9IG5ldyBERU1EYXRhKHVpZCk7XG4gICAgICAgIHRoaXMubG9hZGluZ1tzb3VyY2VdW3VpZF0gPSBkZW07XG4gICAgICAgIGRlbS5sb2FkRnJvbUltYWdlKHBhcmFtcy5yYXdJbWFnZURhdGEpO1xuICAgICAgICBkZWxldGUgdGhpcy5sb2FkaW5nW3NvdXJjZV1bdWlkXTtcblxuICAgICAgICB0aGlzLmxvYWRlZFtzb3VyY2VdID0gdGhpcy5sb2FkZWRbc291cmNlXSB8fCB7fTtcbiAgICAgICAgdGhpcy5sb2FkZWRbc291cmNlXVt1aWRdID0gZGVtO1xuICAgICAgICBjYWxsYmFjayhudWxsLCBkZW0pO1xuICAgIH1cblxuICAgIHJlbW92ZVRpbGUocGFyYW1zICAgICAgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCBsb2FkZWQgPSB0aGlzLmxvYWRlZFtwYXJhbXMuc291cmNlXSxcbiAgICAgICAgICAgIHVpZCA9IHBhcmFtcy51aWQ7XG4gICAgICAgIGlmIChsb2FkZWQgJiYgbG9hZGVkW3VpZF0pIHtcbiAgICAgICAgICAgIGRlbGV0ZSBsb2FkZWRbdWlkXTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSYXN0ZXJERU1UaWxlV29ya2VyU291cmNlO1xuIiwiLy8gICAgICBcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuY29uc3QgYWpheCA9IHJlcXVpcmUoJy4uL3V0aWwvYWpheCcpO1xuY29uc3QgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xuY29uc3QgbG9hZFRpbGVKU09OID0gcmVxdWlyZSgnLi9sb2FkX3RpbGVqc29uJyk7XG5jb25zdCBub3JtYWxpemVVUkwgPSByZXF1aXJlKCcuLi91dGlsL21hcGJveCcpLm5vcm1hbGl6ZVRpbGVVUkw7XG5jb25zdCBUaWxlQm91bmRzID0gcmVxdWlyZSgnLi90aWxlX2JvdW5kcycpO1xuY29uc3QgVGV4dHVyZSA9IHJlcXVpcmUoJy4uL3JlbmRlci90ZXh0dXJlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuY2xhc3MgUmFzdGVyVGlsZVNvdXJjZSBleHRlbmRzIEV2ZW50ZWQgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoaWQgICAgICAgICwgb3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGRpc3BhdGNoZXIgICAgICAgICAgICAsIGV2ZW50ZWRQYXJlbnQgICAgICAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyO1xuICAgICAgICB0aGlzLnNldEV2ZW50ZWRQYXJlbnQoZXZlbnRlZFBhcmVudCk7XG5cbiAgICAgICAgdGhpcy50eXBlID0gJ3Jhc3Rlcic7XG4gICAgICAgIHRoaXMubWluem9vbSA9IDA7XG4gICAgICAgIHRoaXMubWF4em9vbSA9IDIyO1xuICAgICAgICB0aGlzLnJvdW5kWm9vbSA9IHRydWU7XG4gICAgICAgIHRoaXMuc2NoZW1lID0gJ3h5eic7XG4gICAgICAgIHRoaXMudGlsZVNpemUgPSA1MTI7XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSB1dGlsLmV4dGVuZCh7fSwgb3B0aW9ucyk7XG4gICAgICAgIHV0aWwuZXh0ZW5kKHRoaXMsIHV0aWwucGljayhvcHRpb25zLCBbJ3VybCcsICdzY2hlbWUnLCAndGlsZVNpemUnXSkpO1xuICAgIH1cblxuICAgIGxvYWQoKSB7XG4gICAgICAgIHRoaXMuZmlyZSgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnfSk7XG4gICAgICAgIGxvYWRUaWxlSlNPTih0aGlzLl9vcHRpb25zLCB0aGlzLm1hcC5fdHJhbnNmb3JtUmVxdWVzdCwgKGVyciwgdGlsZUpTT04pID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGlsZUpTT04pIHtcbiAgICAgICAgICAgICAgICB1dGlsLmV4dGVuZCh0aGlzLCB0aWxlSlNPTik7XG4gICAgICAgICAgICAgICAgaWYgKHRpbGVKU09OLmJvdW5kcykgdGhpcy50aWxlQm91bmRzID0gbmV3IFRpbGVCb3VuZHModGlsZUpTT04uYm91bmRzLCB0aGlzLm1pbnpvb20sIHRoaXMubWF4em9vbSk7XG5cbiAgICAgICAgICAgICAgICAvLyBgY29udGVudGAgaXMgaW5jbHVkZWQgaGVyZSB0byBwcmV2ZW50IGEgcmFjZSBjb25kaXRpb24gd2hlcmUgYFN0eWxlI191cGRhdGVTb3VyY2VzYCBpcyBjYWxsZWRcbiAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIFRpbGVKU09OIGFycml2ZXMuIHRoaXMgbWFrZXMgc3VyZSB0aGUgdGlsZXMgbmVlZGVkIGFyZSBsb2FkZWQgb25jZSBUaWxlSlNPTiBhcnJpdmVzXG4gICAgICAgICAgICAgICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9wdWxsLzQzNDcjZGlzY3Vzc2lvbl9yMTA0NDE4MDg4XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKCdkYXRhJywge2RhdGFUeXBlOiAnc291cmNlJywgc291cmNlRGF0YVR5cGU6ICdtZXRhZGF0YSd9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ2NvbnRlbnQnfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcCAgICAgKSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiB1dGlsLmV4dGVuZCh7fSwgdGhpcy5fb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaGFzVGlsZSh0aWxlSUQgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnRpbGVCb3VuZHMgfHwgdGhpcy50aWxlQm91bmRzLmNvbnRhaW5zKHRpbGVJRC5jYW5vbmljYWwpO1xuICAgIH1cblxuICAgIGxvYWRUaWxlKHRpbGUgICAgICAsIGNhbGxiYWNrICAgICAgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCB1cmwgPSBub3JtYWxpemVVUkwodGlsZS50aWxlSUQuY2Fub25pY2FsLnVybCh0aGlzLnRpbGVzLCB0aGlzLnNjaGVtZSksIHRoaXMudXJsLCB0aGlzLnRpbGVTaXplKTtcbiAgICAgICAgdGlsZS5yZXF1ZXN0ID0gYWpheC5nZXRJbWFnZSh0aGlzLm1hcC5fdHJhbnNmb3JtUmVxdWVzdCh1cmwsIGFqYXguUmVzb3VyY2VUeXBlLlRpbGUpLCAoZXJyLCBpbWcpID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aWxlLnJlcXVlc3Q7XG5cbiAgICAgICAgICAgIGlmICh0aWxlLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ3VubG9hZGVkJztcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdlcnJvcmVkJztcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpbWcpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXAuX3JlZnJlc2hFeHBpcmVkVGlsZXMpIHRpbGUuc2V0RXhwaXJ5RGF0YShpbWcpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSAoaW1nICAgICApLmNhY2hlQ29udHJvbDtcbiAgICAgICAgICAgICAgICBkZWxldGUgKGltZyAgICAgKS5leHBpcmVzO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMubWFwLnBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlID0gdGhpcy5tYXAucGFpbnRlci5nZXRUaWxlVGV4dHVyZShpbWcud2lkdGgpO1xuICAgICAgICAgICAgICAgIGlmICh0aWxlLnRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFLCBnbC5MSU5FQVJfTUlQTUFQX05FQVJFU1QpO1xuICAgICAgICAgICAgICAgICAgICBnbC50ZXhTdWJJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIDAsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGltZyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgaW1nLCBnbC5SR0JBKTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFLCBnbC5MSU5FQVJfTUlQTUFQX05FQVJFU1QpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyZihnbC5URVhUVVJFXzJELCBjb250ZXh0LmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYy5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCwgY29udGV4dC5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWNNYXgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdsLmdlbmVyYXRlTWlwbWFwKGdsLlRFWFRVUkVfMkQpO1xuXG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdsb2FkZWQnO1xuXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFib3J0VGlsZSh0aWxlICAgICAgLCBjYWxsYmFjayAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKHRpbGUucmVxdWVzdCkge1xuICAgICAgICAgICAgdGlsZS5yZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgICAgICBkZWxldGUgdGlsZS5yZXF1ZXN0O1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgdW5sb2FkVGlsZSh0aWxlICAgICAgLCBjYWxsYmFjayAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKHRpbGUudGV4dHVyZSkgdGhpcy5tYXAucGFpbnRlci5zYXZlVGlsZVRleHR1cmUodGlsZS50ZXh0dXJlKTtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJhc3RlclRpbGVTb3VyY2U7XG4iLCIvLyAgICAgIFxuXG5jb25zdCBhamF4ID0gcmVxdWlyZSgnLi4vdXRpbC9hamF4Jyk7XG5jb25zdCBFdmVudGVkID0gcmVxdWlyZSgnLi4vdXRpbC9ldmVudGVkJyk7XG5jb25zdCB3aW5kb3cgPSByZXF1aXJlKCcuLi91dGlsL3dpbmRvdycpO1xuXG5sZXQgcGx1Z2luUmVxdWVzdGVkID0gZmFsc2U7XG5sZXQgcGx1Z2luQmxvYlVSTCA9IG51bGw7XG5cbm1vZHVsZS5leHBvcnRzLmV2ZW50ZWQgPSBuZXcgRXZlbnRlZCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5tb2R1bGUuZXhwb3J0cy5yZWdpc3RlckZvclBsdWdpbkF2YWlsYWJpbGl0eSA9IGZ1bmN0aW9uKFxuICAgIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbikge1xuICAgIGlmIChwbHVnaW5CbG9iVVJMKSB7XG4gICAgICAgIGNhbGxiYWNrKHsgcGx1Z2luQmxvYlVSTDogcGx1Z2luQmxvYlVSTCwgZXJyb3JDYWxsYmFjazogbW9kdWxlLmV4cG9ydHMuZXJyb3JDYWxsYmFja30pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzLmV2ZW50ZWQub25jZSgncGx1Z2luQXZhaWxhYmxlJywgY2FsbGJhY2spO1xuICAgIH1cbiAgICByZXR1cm4gY2FsbGJhY2s7XG59O1xuXG4vLyBFeHBvc2VkIHNvIGl0IGNhbiBiZSBzdHViYmVkIG91dCBieSB0ZXN0c1xubW9kdWxlLmV4cG9ydHMuY3JlYXRlQmxvYlVSTCA9IGZ1bmN0aW9uKHJlc3BvbnNlICAgICAgICApIHtcbiAgICByZXR1cm4gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwobmV3IHdpbmRvdy5CbG9iKFtyZXNwb25zZS5kYXRhXSwge3R5cGU6IFwidGV4dC9qYXZhc2NyaXB0XCJ9KSk7XG59O1xuLy8gT25seSBleHBvc2VkIGZvciB0ZXN0c1xubW9kdWxlLmV4cG9ydHMuY2xlYXJSVExUZXh0UGx1Z2luID0gZnVuY3Rpb24oKSB7XG4gICAgcGx1Z2luUmVxdWVzdGVkID0gZmFsc2U7XG4gICAgcGx1Z2luQmxvYlVSTCA9IG51bGw7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5zZXRSVExUZXh0UGx1Z2luID0gZnVuY3Rpb24ocGx1Z2luVVJMICAgICAgICAsIGNhbGxiYWNrICAgICAgICAgICAgICAgKSB7XG4gICAgaWYgKHBsdWdpblJlcXVlc3RlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFJUTFRleHRQbHVnaW4gY2Fubm90IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4nKTtcbiAgICB9XG4gICAgcGx1Z2luUmVxdWVzdGVkID0gdHJ1ZTtcbiAgICBtb2R1bGUuZXhwb3J0cy5lcnJvckNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgYWpheC5nZXRBcnJheUJ1ZmZlcih7IHVybDogcGx1Z2luVVJMIH0sIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHBsdWdpbkJsb2JVUkwgPSBtb2R1bGUuZXhwb3J0cy5jcmVhdGVCbG9iVVJMKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzLmV2ZW50ZWQuZmlyZSgncGx1Z2luQXZhaWxhYmxlJywgeyBwbHVnaW5CbG9iVVJMOiBwbHVnaW5CbG9iVVJMLCBlcnJvckNhbGxiYWNrOiBjYWxsYmFjayB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMuYXBwbHlBcmFiaWNTaGFwaW5nID0gKG51bGwgICAgICAgICAgICk7XG5tb2R1bGUuZXhwb3J0cy5wcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQgPSAobnVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuIiwiLy8gICAgICBcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbi8qKlxuICogVGhlIGBTb3VyY2VgIGludGVyZmFjZSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGVhY2ggc291cmNlIHR5cGUsIGluY2x1ZGluZyBcImNvcmVcIiB0eXBlcyAoYHZlY3RvcmAsIGByYXN0ZXJgLFxuICogYHZpZGVvYCwgZXRjLikgYW5kIGFsbCBjdXN0b20sIHRoaXJkLXBhcnR5IHR5cGVzLlxuICpcbiAqIEBjbGFzcyBTb3VyY2VcbiAqIEBwcml2YXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBpZCBmb3IgdGhlIHNvdXJjZS4gTXVzdCBub3QgYmUgdXNlZCBieSBhbnkgZXhpc3Rpbmcgc291cmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgU291cmNlIG9wdGlvbnMsIHNwZWNpZmljIHRvIHRoZSBzb3VyY2UgdHlwZSAoZXhjZXB0IGZvciBgb3B0aW9ucy50eXBlYCwgd2hpY2ggaXMgYWx3YXlzXG4gKiByZXF1aXJlZCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy50eXBlIFRoZSBzb3VyY2UgdHlwZSwgbWF0Y2hpbmcgdGhlIHZhbHVlIG9mIGBuYW1lYCB1c2VkIGluIHtAbGluayBTdHlsZSNhZGRTb3VyY2VUeXBlfS5cbiAqIEBwYXJhbSB7RGlzcGF0Y2hlcn0gZGlzcGF0Y2hlciBBIHtAbGluayBEaXNwYXRjaGVyfSBpbnN0YW5jZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2VuZCBtZXNzYWdlcyB0byB0aGUgd29ya2Vycy5cbiAqXG4gKiBAZmlyZXMgZGF0YSB3aXRoIGB7ZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ21ldGFkYXRhJ31gIHRvIGluZGljYXRlIHRoYXQgYW55IG5lY2Vzc2FyeSBtZXRhZGF0YVxuICogaGFzIGJlZW4gbG9hZGVkIHNvIHRoYXQgaXQncyBva2F5IHRvIGNhbGwgYGxvYWRUaWxlYDsgYW5kIHdpdGggYHtkYXRhVHlwZTogJ3NvdXJjZScsIHNvdXJjZURhdGFUeXBlOiAnY29udGVudCd9YFxuICogdG8gaW5kaWNhdGUgdGhhdCB0aGUgc291cmNlIGRhdGEgaGFzIGNoYW5nZWQsIHNvIHRoYXQgYW55IGN1cnJlbnQgY2FjaGVzIHNob3VsZCBiZSBmbHVzaGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIFRoZSBpZCBmb3IgdGhlIHNvdXJjZS4gIE11c3QgbWF0Y2ggdGhlIGlkIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWluem9vbVxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heHpvb21cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNUaWxlQ2xpcHBlZCBgZmFsc2VgIGlmIHRpbGVzIGNhbiBiZSBkcmF3biBvdXRzaWRlIHRoZWlyIGJvdW5kYXJpZXMsIGB0cnVlYCBpZiB0aGV5IGNhbm5vdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwYXJzZU92ZXJzY2FsZWQgYHRydWVgIGlmIHRpbGVzIHNob3VsZCBiZSBzZW50IGJhY2sgdG8gdGhlIHdvcmtlciBmb3IgZWFjaCBvdmVyem9vbWVkIHpvb21cbiAqIGxldmVsLCBgZmFsc2VgIGlmIG5vdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcm91bmRab29tIGB0cnVlYCBpZiB6b29tIGxldmVscyBhcmUgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIGluIHRoZSBzb3VyY2UgZGF0YSwgYGZhbHNlYFxuICogaWYgdGhleSBhcmUgZmxvb3ItZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci5cbiAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBcbiBcblxuY29uc3Qgc291cmNlVHlwZXMgPSB7XG4gICAgJ3ZlY3Rvcic6IHJlcXVpcmUoJy4uL3NvdXJjZS92ZWN0b3JfdGlsZV9zb3VyY2UnKSxcbiAgICAncmFzdGVyJzogcmVxdWlyZSgnLi4vc291cmNlL3Jhc3Rlcl90aWxlX3NvdXJjZScpLFxuICAgICdyYXN0ZXItZGVtJzogcmVxdWlyZSgnLi4vc291cmNlL3Jhc3Rlcl9kZW1fdGlsZV9zb3VyY2UnKSxcbiAgICAnZ2VvanNvbic6IHJlcXVpcmUoJy4uL3NvdXJjZS9nZW9qc29uX3NvdXJjZScpLFxuICAgICd2aWRlbyc6IHJlcXVpcmUoJy4uL3NvdXJjZS92aWRlb19zb3VyY2UnKSxcbiAgICAnaW1hZ2UnOiByZXF1aXJlKCcuLi9zb3VyY2UvaW1hZ2Vfc291cmNlJyksXG4gICAgJ2NhbnZhcyc6IHJlcXVpcmUoJy4uL3NvdXJjZS9jYW52YXNfc291cmNlJylcbn07XG5cbi8qXG4gKiBDcmVhdGVzIGEgdGlsZWQgZGF0YSBzb3VyY2UgaW5zdGFuY2UgZ2l2ZW4gYW4gb3B0aW9ucyBvYmplY3QuXG4gKlxuICogQHBhcmFtIGlkXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIEEgc291cmNlIGRlZmluaXRpb24gb2JqZWN0IGNvbXBsaWFudCB3aXRoXG4gKiBbYG1hcGJveC1nbC1zdHlsZS1zcGVjYF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jc291cmNlcykgb3IsIGZvciBhIHRoaXJkLXBhcnR5IHNvdXJjZSB0eXBlLFxuICAqIHdpdGggdGhhdCB0eXBlJ3MgcmVxdWlyZW1lbnRzLlxuICogQHBhcmFtIHtEaXNwYXRjaGVyfSBkaXNwYXRjaGVyXG4gKiBAcmV0dXJucyB7U291cmNlfVxuICovXG5leHBvcnRzLmNyZWF0ZSA9IGZ1bmN0aW9uKGlkICAgICAgICAsIHNwZWNpZmljYXRpb24gICAgICAgICAgICAgICAgICAgICAsIGRpc3BhdGNoZXIgICAgICAgICAgICAsIGV2ZW50ZWRQYXJlbnQgICAgICAgICApIHtcbiAgICBjb25zdCBzb3VyY2UgPSBuZXcgc291cmNlVHlwZXNbc3BlY2lmaWNhdGlvbi50eXBlXShpZCwgKHNwZWNpZmljYXRpb24gICAgICksIGRpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQpO1xuXG4gICAgaWYgKHNvdXJjZS5pZCAhPT0gaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBTb3VyY2UgaWQgdG8gYmUgJHtpZH0gaW5zdGVhZCBvZiAke3NvdXJjZS5pZH1gKTtcbiAgICB9XG5cbiAgICB1dGlsLmJpbmRBbGwoWydsb2FkJywgJ2Fib3J0JywgJ3VubG9hZCcsICdzZXJpYWxpemUnLCAncHJlcGFyZSddLCBzb3VyY2UpO1xuICAgIHJldHVybiBzb3VyY2U7XG59O1xuXG5leHBvcnRzLmdldFR5cGUgPSBmdW5jdGlvbiAobmFtZSAgICAgICAgKSB7XG4gICAgcmV0dXJuIHNvdXJjZVR5cGVzW25hbWVdO1xufTtcblxuZXhwb3J0cy5zZXRUeXBlID0gZnVuY3Rpb24gKG5hbWUgICAgICAgICwgdHlwZSAgICAgICAgICAgICAgICkge1xuICAgIHNvdXJjZVR5cGVzW25hbWVdID0gdHlwZTtcbn07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiBcbiIsIi8vICAgICAgXG5cbmNvbnN0IGNyZWF0ZVNvdXJjZSA9IHJlcXVpcmUoJy4vc291cmNlJykuY3JlYXRlO1xuY29uc3QgVGlsZSA9IHJlcXVpcmUoJy4vdGlsZScpO1xuY29uc3QgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xuY29uc3QgQ2FjaGUgPSByZXF1aXJlKCcuLi91dGlsL2xydV9jYWNoZScpO1xuY29uc3QgQ29vcmRpbmF0ZSA9IHJlcXVpcmUoJy4uL2dlby9jb29yZGluYXRlJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5jb25zdCBFWFRFTlQgPSByZXF1aXJlKCcuLi9kYXRhL2V4dGVudCcpO1xuY29uc3QgQ29udGV4dCA9IHJlcXVpcmUoJy4uL2dsL2NvbnRleHQnKTtcbmNvbnN0IFBvaW50ID0gcmVxdWlyZSgnQG1hcGJveC9wb2ludC1nZW9tZXRyeScpO1xuY29uc3QgYnJvd3NlciA9IHJlcXVpcmUoJy4uL3V0aWwvYnJvd3NlcicpO1xuY29uc3Qge092ZXJzY2FsZWRUaWxlSUR9ID0gcmVxdWlyZSgnLi90aWxlX2lkJyk7XG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbi8qKlxuICogYFNvdXJjZUNhY2hlYCBpcyByZXNwb25zaWJsZSBmb3JcbiAqXG4gKiAgLSBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiBgU291cmNlYFxuICogIC0gZm9yd2FyZGluZyBldmVudHMgZnJvbSBgU291cmNlYFxuICogIC0gY2FjaGluZyB0aWxlcyBsb2FkZWQgZnJvbSBhbiBpbnN0YW5jZSBvZiBgU291cmNlYFxuICogIC0gbG9hZGluZyB0aGUgdGlsZXMgbmVlZGVkIHRvIHJlbmRlciBhIGdpdmVuIHZpZXdwb3J0XG4gKiAgLSB1bmxvYWRpbmcgdGhlIGNhY2hlZCB0aWxlcyBub3QgbmVlZGVkIHRvIHJlbmRlciBhIGdpdmVuIHZpZXdwb3J0XG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU291cmNlQ2FjaGUgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoaWQgICAgICAgICwgb3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICwgZGlzcGF0Y2hlciAgICAgICAgICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7XG5cbiAgICAgICAgdGhpcy5vbignZGF0YScsIChlKSA9PiB7XG4gICAgICAgICAgICAvLyB0aGlzLl9zb3VyY2VMb2FkZWQgc2lnbmlmaWVzIHRoYXQgdGhlIFRpbGVKU09OIGlzIGxvYWRlZCBpZiBhcHBsaWNhYmxlLlxuICAgICAgICAgICAgLy8gaWYgdGhlIHNvdXJjZSB0eXBlIGRvZXMgbm90IGNvbWUgd2l0aCBhIFRpbGVKU09OLCB0aGUgZmxhZyBzaWduaWZpZXMgdGhlXG4gICAgICAgICAgICAvLyBzb3VyY2UgZGF0YSBoYXMgbG9hZGVkIChpLmUgZ2VvanNvbiBoYXMgYmVlbiB0aWxlZCBvbiB0aGUgd29ya2VyIGFuZCBpcyByZWFkeSlcbiAgICAgICAgICAgIGlmIChlLmRhdGFUeXBlID09PSAnc291cmNlJyAmJiBlLnNvdXJjZURhdGFUeXBlID09PSAnbWV0YWRhdGEnKSB0aGlzLl9zb3VyY2VMb2FkZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBmb3Igc291cmNlcyB3aXRoIG11dGFibGUgZGF0YSwgdGhpcyBldmVudCBmaXJlcyB3aGVuIHRoZSB1bmRlcmx5aW5nIGRhdGFcbiAgICAgICAgICAgIC8vIHRvIGEgc291cmNlIGlzIGNoYW5nZWQuIChpLmUuIEdlb0pTT05Tb3VyY2Ujc2V0RGF0YSBhbmQgSW1hZ2VTb3VyY2Ujc2VyQ29vcmRpbmF0ZXMpXG4gICAgICAgICAgICBpZiAodGhpcy5fc291cmNlTG9hZGVkICYmICF0aGlzLl9wYXVzZWQgJiYgZS5kYXRhVHlwZSA9PT0gXCJzb3VyY2VcIiAmJiBlLnNvdXJjZURhdGFUeXBlID09PSAnY29udGVudCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSh0aGlzLnRyYW5zZm9ybSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9uKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZUVycm9yZWQgPSB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9zb3VyY2UgPSBjcmVhdGVTb3VyY2UoaWQsIG9wdGlvbnMsIGRpc3BhdGNoZXIsIHRoaXMpO1xuXG4gICAgICAgIHRoaXMuX3RpbGVzID0ge307XG4gICAgICAgIHRoaXMuX2NhY2hlID0gbmV3IENhY2hlKDAsIHRoaXMuX3VubG9hZFRpbGUuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuX3RpbWVycyA9IHt9O1xuICAgICAgICB0aGlzLl9jYWNoZVRpbWVycyA9IHt9O1xuICAgICAgICB0aGlzLl9tYXhUaWxlQ2FjaGVTaXplID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9pc0lkUmVuZGVyYWJsZSA9IHRoaXMuX2lzSWRSZW5kZXJhYmxlLmJpbmQodGhpcyk7XG5cbiAgICAgICAgdGhpcy5fY292ZXJlZFRpbGVzID0ge307XG4gICAgfVxuXG4gICAgb25BZGQobWFwICAgICApIHtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX21heFRpbGVDYWNoZVNpemUgPSBtYXAgPyBtYXAuX21heFRpbGVDYWNoZVNpemUgOiBudWxsO1xuICAgICAgICBpZiAodGhpcy5fc291cmNlICYmIHRoaXMuX3NvdXJjZS5vbkFkZCkge1xuICAgICAgICAgICAgdGhpcy5fc291cmNlLm9uQWRkKG1hcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblJlbW92ZShtYXAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5fc291cmNlICYmIHRoaXMuX3NvdXJjZS5vblJlbW92ZSkge1xuICAgICAgICAgICAgdGhpcy5fc291cmNlLm9uUmVtb3ZlKG1hcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBubyB0aWxlIGRhdGEgaXMgcGVuZGluZywgdGlsZXMgd2lsbCBub3QgY2hhbmdlIHVubGVzc1xuICAgICAqIGFuIGFkZGl0aW9uYWwgQVBJIGNhbGwgaXMgcmVjZWl2ZWQuXG4gICAgICovXG4gICAgbG9hZGVkKCkgICAgICAgICAge1xuICAgICAgICBpZiAodGhpcy5fc291cmNlRXJyb3JlZCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICBpZiAoIXRoaXMuX3NvdXJjZUxvYWRlZCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgZm9yIChjb25zdCB0IGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbdF07XG4gICAgICAgICAgICBpZiAodGlsZS5zdGF0ZSAhPT0gJ2xvYWRlZCcgJiYgdGlsZS5zdGF0ZSAhPT0gJ2Vycm9yZWQnKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXRTb3VyY2UoKSAgICAgICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZTtcbiAgICB9XG5cbiAgICBwYXVzZSgpIHtcbiAgICAgICAgdGhpcy5fcGF1c2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXN1bWUoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcGF1c2VkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHNob3VsZFJlbG9hZCA9IHRoaXMuX3Nob3VsZFJlbG9hZE9uUmVzdW1lO1xuICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc2hvdWxkUmVsb2FkT25SZXN1bWUgPSBmYWxzZTtcbiAgICAgICAgaWYgKHNob3VsZFJlbG9hZCkgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNmb3JtKSB0aGlzLnVwZGF0ZSh0aGlzLnRyYW5zZm9ybSk7XG4gICAgfVxuXG4gICAgX2xvYWRUaWxlKHRpbGUgICAgICAsIGNhbGxiYWNrICAgICAgICAgICAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlLmxvYWRUaWxlKHRpbGUsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBfdW5sb2FkVGlsZSh0aWxlICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UudW5sb2FkVGlsZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2UudW5sb2FkVGlsZSh0aWxlLCAoKSA9PiB7fSk7XG4gICAgfVxuXG4gICAgX2Fib3J0VGlsZSh0aWxlICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UuYWJvcnRUaWxlKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZS5hYm9ydFRpbGUodGlsZSwgKCkgPT4ge30pO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZS5zZXJpYWxpemUoKTtcbiAgICB9XG5cbiAgICBwcmVwYXJlKGNvbnRleHQgICAgICAgICApIHtcbiAgICAgICAgaWYgICh0aGlzLl9zb3VyY2UucHJlcGFyZSkge1xuICAgICAgICAgICAgdGhpcy5fc291cmNlLnByZXBhcmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgaSBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgdGhpcy5fdGlsZXNbaV0udXBsb2FkKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFsbCB0aWxlIGlkcyBvcmRlcmVkIHdpdGggei1vcmRlciwgYW5kIGNhc3QgdG8gbnVtYmVyc1xuICAgICAqL1xuICAgIGdldElkcygpICAgICAgICAgICAgICAgIHtcblxuICAgICAgICBjb25zdCBjb21wYXJlS2V5Wm9vbSA9IChhXywgYl8pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSB0aGlzLl90aWxlc1thX10udGlsZUlEO1xuICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMuX3RpbGVzW2JfXS50aWxlSUQ7XG4gICAgICAgICAgICBjb25zdCByb3RhdGVkQSA9IChuZXcgUG9pbnQoYS5jYW5vbmljYWwueCwgYS5jYW5vbmljYWwueSkpLnJvdGF0ZSh0aGlzLnRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgICAgICBjb25zdCByb3RhdGVkQiA9IChuZXcgUG9pbnQoYi5jYW5vbmljYWwueCwgYi5jYW5vbmljYWwueSkpLnJvdGF0ZSh0aGlzLnRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgICAgICByZXR1cm4gYS5vdmVyc2NhbGVkWiAtIGIub3ZlcnNjYWxlZFogfHwgcm90YXRlZEIueSAtIHJvdGF0ZWRBLnkgfHwgcm90YXRlZEIueCAtIHJvdGF0ZWRBLng7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX3RpbGVzKS5tYXAoTnVtYmVyKS5zb3J0KGNvbXBhcmVLZXlab29tKTtcbiAgICB9XG5cbiAgICBnZXRSZW5kZXJhYmxlSWRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRJZHMoKS5maWx0ZXIodGhpcy5faXNJZFJlbmRlcmFibGUpO1xuICAgIH1cblxuICAgIGhhc1JlbmRlcmFibGVQYXJlbnQodGlsZUlEICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFRpbGUgPSB0aGlzLmZpbmRMb2FkZWRQYXJlbnQodGlsZUlELCAwLCB7fSk7XG4gICAgICAgIGlmIChwYXJlbnRUaWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNJZFJlbmRlcmFibGUocGFyZW50VGlsZS50aWxlSUQua2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgX2lzSWRSZW5kZXJhYmxlKGlkICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbGVzW2lkXSAmJiB0aGlzLl90aWxlc1tpZF0uaGFzRGF0YSgpICYmICF0aGlzLl9jb3ZlcmVkVGlsZXNbaWRdO1xuICAgIH1cblxuICAgIHJlbG9hZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3BhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5fc2hvdWxkUmVsb2FkT25SZXN1bWUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcmVzZXRDYWNoZSgpO1xuXG4gICAgICAgIGZvciAoY29uc3QgaSBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgdGhpcy5fcmVsb2FkVGlsZShpLCAncmVsb2FkaW5nJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfcmVsb2FkVGlsZShpZCAgICAgICAgICAgICAgICAgLCBzdGF0ZSAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XG5cbiAgICAgICAgLy8gdGhpcyBwb3RlbnRpYWxseSBkb2VzIG5vdCBhZGRyZXNzIGFsbCB1bmRlcmx5aW5nXG4gICAgICAgIC8vIGlzc3VlcyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNDI1MlxuICAgICAgICAvLyAtIGhhcmQgdG8gdGVsbCB3aXRob3V0IHJlcHJvIHN0ZXBzXG4gICAgICAgIGlmICghdGlsZSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gXCJsb2FkaW5nXCIgdGlsZXMgYW5kIFwicmVsb2FkaW5nXCIgb3IgXCJleHBpcmVkXCJcbiAgICAgICAgLy8gdGlsZXMgaXMgdGhhdCBcInJlbG9hZGluZ1wiL1wiZXhwaXJlZFwiIHRpbGVzIGFyZSBcInJlbmRlcmFibGVcIi5cbiAgICAgICAgLy8gVGhlcmVmb3JlLCBhIFwibG9hZGluZ1wiIHRpbGUgY2Fubm90IGJlY29tZSBhIFwicmVsb2FkaW5nXCIgdGlsZSB3aXRob3V0XG4gICAgICAgIC8vIGZpcnN0IGJlY29taW5nIGEgXCJsb2FkZWRcIiB0aWxlLlxuICAgICAgICBpZiAodGlsZS5zdGF0ZSAhPT0gJ2xvYWRpbmcnKSB7XG4gICAgICAgICAgICB0aWxlLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb2FkVGlsZSh0aWxlLCB0aGlzLl90aWxlTG9hZGVkLmJpbmQodGhpcywgdGlsZSwgaWQsIHN0YXRlKSk7XG4gICAgfVxuXG4gICAgX3RpbGVMb2FkZWQodGlsZSAgICAgICwgaWQgICAgICAgICAgICAgICAgICwgcHJldmlvdXNTdGF0ZSAgICAgICAgICAgLCBlcnIgICAgICAgICkge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2Vycm9yZWQnO1xuICAgICAgICAgICAgaWYgKGVyci5zdGF0dXMgIT09IDQwNCkgdGhpcy5fc291cmNlLmZpcmUoJ2Vycm9yJywge3RpbGU6IHRpbGUsIGVycm9yOiBlcnJ9KTtcbiAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIHRyeSBsb2FkaW5nIHBhcmVudC9jaGlsZHJlbiB0aWxlcyBpZiBhIHRpbGUgZG9lc24ndCBleGlzdCAoNDA0KVxuICAgICAgICAgICAgZWxzZSB0aGlzLnVwZGF0ZSh0aGlzLnRyYW5zZm9ybSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aWxlLnRpbWVBZGRlZCA9IGJyb3dzZXIubm93KCk7XG4gICAgICAgIGlmIChwcmV2aW91c1N0YXRlID09PSAnZXhwaXJlZCcpIHRpbGUucmVmcmVzaGVkVXBvbkV4cGlyYXRpb24gPSB0cnVlO1xuICAgICAgICB0aGlzLl9zZXRUaWxlUmVsb2FkVGltZXIoaWQsIHRpbGUpO1xuICAgICAgICBpZiAodGhpcy5nZXRTb3VyY2UoKS50eXBlID09PSAncmFzdGVyLWRlbScgJiYgdGlsZS5kZW0pIHRoaXMuX2JhY2tmaWxsREVNKHRpbGUpO1xuICAgICAgICB0aGlzLl9zb3VyY2UuZmlyZSgnZGF0YScsIHtkYXRhVHlwZTogJ3NvdXJjZScsIHRpbGU6IHRpbGUsIGNvb3JkOiB0aWxlLnRpbGVJRH0pO1xuXG4gICAgICAgIC8vIEhBQ0sgdGhpcyBpcyBuZWNlc3NhcnkgdG8gZml4IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yOTg2XG4gICAgICAgIGlmICh0aGlzLm1hcCkgdGhpcy5tYXAucGFpbnRlci50aWxlRXh0ZW50VkFPLnZhbyA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBGb3IgcmFzdGVyIHRlcnJhaW4gc291cmNlLCBiYWNrZmlsbCBERU0gdG8gZWxpbWluYXRlIHZpc2libGUgdGlsZSBib3VuZGFyaWVzXG4gICAgKiBAcHJpdmF0ZVxuICAgICovXG4gICAgX2JhY2tmaWxsREVNKHRpbGUgICAgICApIHtcbiAgICAgICAgY29uc3QgcmVuZGVyYWJsZXMgPSB0aGlzLmdldFJlbmRlcmFibGVJZHMoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW5kZXJhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYm9yZGVySWQgPSByZW5kZXJhYmxlc1tpXTtcbiAgICAgICAgICAgIGlmICh0aWxlLm5laWdoYm9yaW5nVGlsZXMgJiYgdGlsZS5uZWlnaGJvcmluZ1RpbGVzW2JvcmRlcklkXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvcmRlclRpbGUgPSB0aGlzLmdldFRpbGVCeUlEKGJvcmRlcklkKTtcbiAgICAgICAgICAgICAgICBmaWxsQm9yZGVyKHRpbGUsIGJvcmRlclRpbGUpO1xuICAgICAgICAgICAgICAgIGZpbGxCb3JkZXIoYm9yZGVyVGlsZSwgdGlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBmaWxsQm9yZGVyKHRpbGUsIGJvcmRlclRpbGUpIHtcbiAgICAgICAgICAgIHRpbGUubmVlZHNIaWxsc2hhZGVQcmVwYXJlID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBkeCA9IGJvcmRlclRpbGUudGlsZUlELmNhbm9uaWNhbC54IC0gdGlsZS50aWxlSUQuY2Fub25pY2FsLng7XG4gICAgICAgICAgICBjb25zdCBkeSA9IGJvcmRlclRpbGUudGlsZUlELmNhbm9uaWNhbC55IC0gdGlsZS50aWxlSUQuY2Fub25pY2FsLnk7XG4gICAgICAgICAgICBjb25zdCBkaW0gPSBNYXRoLnBvdygyLCB0aWxlLnRpbGVJRC5jYW5vbmljYWwueik7XG4gICAgICAgICAgICBjb25zdCBib3JkZXJJZCA9IGJvcmRlclRpbGUudGlsZUlELmtleTtcbiAgICAgICAgICAgIGlmIChkeCA9PT0gMCAmJiBkeSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoZHkpID4gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhkeCkgPiAxKSB7XG4gICAgICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSBkZWx0YSBjb29yZGluYXRlIGZvciB3b3JsZCB3cmFwYXJvdW5kLlxuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhkeCArIGRpbSkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZHggKz0gZGltO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoZHggLSBkaW0pID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGR4IC09IGRpbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWJvcmRlclRpbGUuZGVtIHx8ICF0aWxlLmRlbSkgcmV0dXJuO1xuICAgICAgICAgICAgdGlsZS5kZW0uYmFja2ZpbGxCb3JkZXIoYm9yZGVyVGlsZS5kZW0sIGR4LCBkeSk7XG4gICAgICAgICAgICBpZiAodGlsZS5uZWlnaGJvcmluZ1RpbGVzICYmIHRpbGUubmVpZ2hib3JpbmdUaWxlc1tib3JkZXJJZF0pXG4gICAgICAgICAgICAgICAgdGlsZS5uZWlnaGJvcmluZ1RpbGVzW2JvcmRlcklkXS5iYWNrZmlsbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzcGVjaWZpYyB0aWxlIGJ5IFRpbGVJRFxuICAgICAqL1xuICAgIGdldFRpbGUodGlsZUlEICAgICAgICAgICAgICAgICAgKSAgICAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRpbGVCeUlEKHRpbGVJRC5rZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHNwZWNpZmljIHRpbGUgYnkgaWRcbiAgICAgKi9cbiAgICBnZXRUaWxlQnlJRChpZCAgICAgICAgICAgICAgICAgKSAgICAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aWxlc1tpZF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IHRoZSB6b29tIGxldmVsIGFkanVzdGVkIGZvciB0aGUgZGlmZmVyZW5jZSBpbiBtYXAgYW5kIHNvdXJjZSB0aWxlc2l6ZXNcbiAgICAgKi9cbiAgICBnZXRab29tKHRyYW5zZm9ybSAgICAgICAgICAgKSAgICAgICAgIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS56b29tICsgdHJhbnNmb3JtLnNjYWxlWm9vbSh0cmFuc2Zvcm0udGlsZVNpemUgLyB0aGlzLl9zb3VyY2UudGlsZVNpemUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IGZpbmQgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIHRpbGUgKHVwIHRvIG1heENvdmVyaW5nWm9vbSkgdGhhdCBhcmUgYWxyZWFkeSBsb2FkZWQ7XG4gICAgICogYWRkcyBmb3VuZCB0aWxlcyB0byByZXRhaW4gb2JqZWN0OyByZXR1cm5zIHRydWUgaWYgYW55IGNoaWxkIGlzIGZvdW5kLlxuICAgICAqL1xuICAgIF9maW5kTG9hZGVkQ2hpbGRyZW4odGlsZUlEICAgICAgICAgICAgICAgICAgLCBtYXhDb3ZlcmluZ1pvb20gICAgICAgICwgcmV0YWluICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICB7XG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy5fdGlsZXNbaWRdO1xuXG4gICAgICAgICAgICAvLyBvbmx5IGNvbnNpZGVyIHJlbmRlcmFibGUgdGlsZXMgb24gaGlnaGVyIHpvb20gbGV2ZWxzICh1cCB0byBtYXhDb3ZlcmluZ1pvb20pXG4gICAgICAgICAgICBpZiAocmV0YWluW2lkXSB8fCAhdGlsZS5oYXNEYXRhKCkgfHwgdGlsZS50aWxlSUQub3ZlcnNjYWxlZFogPD0gdGlsZUlELm92ZXJzY2FsZWRaIHx8IHRpbGUudGlsZUlELm92ZXJzY2FsZWRaID4gbWF4Q292ZXJpbmdab29tKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gZGlzcmVnYXJkIHRpbGVzIHRoYXQgYXJlIG5vdCBkZXNjZW5kYW50cyBvZiB0aGUgZ2l2ZW4gdGlsZSBjb29yZGluYXRlXG4gICAgICAgICAgICBjb25zdCB6MiA9IE1hdGgucG93KDIsIHRpbGUudGlsZUlELmNhbm9uaWNhbC56IC0gdGlsZUlELmNhbm9uaWNhbC56KTtcbiAgICAgICAgICAgIGlmIChNYXRoLmZsb29yKHRpbGUudGlsZUlELmNhbm9uaWNhbC54IC8gejIpICE9PSB0aWxlSUQuY2Fub25pY2FsLnggfHxcbiAgICAgICAgICAgICAgICBNYXRoLmZsb29yKHRpbGUudGlsZUlELmNhbm9uaWNhbC55IC8gejIpICE9PSB0aWxlSUQuY2Fub25pY2FsLnkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIGZvdW5kIGxvYWRlZCBjaGlsZFxuICAgICAgICAgICAgcmV0YWluW2lkXSA9IHRpbGUudGlsZUlEO1xuICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBsb29wIHRocm91Z2ggcGFyZW50czsgcmV0YWluIHRoZSB0b3Btb3N0IGxvYWRlZCBvbmUgaWYgZm91bmRcbiAgICAgICAgICAgIHdoaWxlICh0aWxlICYmIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaIC0gMSA+IHRpbGVJRC5vdmVyc2NhbGVkWikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRpbGUudGlsZUlELnNjYWxlZFRvKHRpbGUudGlsZUlELm92ZXJzY2FsZWRaIC0gMSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgdGlsZSA9IHRoaXMuX3RpbGVzW3BhcmVudC5rZXldO1xuICAgICAgICAgICAgICAgIGlmICh0aWxlICYmIHRpbGUuaGFzRGF0YSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXRhaW5baWRdO1xuICAgICAgICAgICAgICAgICAgICByZXRhaW5bcGFyZW50LmtleV0gPSBwYXJlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGEgbG9hZGVkIHBhcmVudCBvZiB0aGUgZ2l2ZW4gdGlsZSAodXAgdG8gbWluQ292ZXJpbmdab29tKTtcbiAgICAgKiBhZGRzIHRoZSBmb3VuZCB0aWxlIHRvIHJldGFpbiBvYmplY3QgYW5kIHJldHVybnMgdGhlIHRpbGUgaWYgZm91bmRcbiAgICAgKi9cbiAgICBmaW5kTG9hZGVkUGFyZW50KHRpbGVJRCAgICAgICAgICAgICAgICAgICwgbWluQ292ZXJpbmdab29tICAgICAgICAsIHJldGFpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgIHtcbiAgICAgICAgZm9yIChsZXQgeiA9IHRpbGVJRC5vdmVyc2NhbGVkWiAtIDE7IHogPj0gbWluQ292ZXJpbmdab29tOyB6LS0pIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRpbGVJRC5zY2FsZWRUbyh6KTtcbiAgICAgICAgICAgIGlmICghcGFyZW50KSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBpZCA9IFN0cmluZyhwYXJlbnQua2V5KTtcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgICAgICBpZiAodGlsZSAmJiB0aWxlLmhhc0RhdGEoKSkge1xuICAgICAgICAgICAgICAgIHJldGFpbltpZF0gPSBwYXJlbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRpbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY2FjaGUuaGFzKGlkKSkge1xuICAgICAgICAgICAgICAgIHJldGFpbltpZF0gPSBwYXJlbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlLmdldChpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSB0aWxlIGNhY2hlIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZpZXdwb3J0J3Mgc2l6ZVxuICAgICAqIG9yIHRoZSBtYXhUaWxlQ2FjaGVTaXplIG9wdGlvbiBwYXNzZWQgZHVyaW5nIG1hcCBjcmVhdGlvblxuICAgICAqXG4gICAgICogTGFyZ2VyIHZpZXdwb3J0cyB1c2UgbW9yZSB0aWxlcyBhbmQgbmVlZCBsYXJnZXIgY2FjaGVzLiBMYXJnZXIgdmlld3BvcnRzXG4gICAgICogYXJlIG1vcmUgbGlrZWx5IHRvIGJlIGZvdW5kIG9uIGRldmljZXMgd2l0aCBtb3JlIG1lbW9yeSBhbmQgb24gcGFnZXMgd2hlcmVcbiAgICAgKiB0aGUgbWFwIGlzIG1vcmUgaW1wb3J0YW50LlxuICAgICAqL1xuICAgIHVwZGF0ZUNhY2hlU2l6ZSh0cmFuc2Zvcm0gICAgICAgICAgICkge1xuICAgICAgICBjb25zdCB3aWR0aEluVGlsZXMgPSBNYXRoLmNlaWwodHJhbnNmb3JtLndpZHRoIC8gdGhpcy5fc291cmNlLnRpbGVTaXplKSArIDE7XG4gICAgICAgIGNvbnN0IGhlaWdodEluVGlsZXMgPSBNYXRoLmNlaWwodHJhbnNmb3JtLmhlaWdodCAvIHRoaXMuX3NvdXJjZS50aWxlU2l6ZSkgKyAxO1xuICAgICAgICBjb25zdCBhcHByb3hUaWxlc0luVmlldyA9IHdpZHRoSW5UaWxlcyAqIGhlaWdodEluVGlsZXM7XG4gICAgICAgIGNvbnN0IGNvbW1vblpvb21SYW5nZSA9IDU7XG5cbiAgICAgICAgY29uc3Qgdmlld0RlcGVuZGVudE1heFNpemUgPSBNYXRoLmZsb29yKGFwcHJveFRpbGVzSW5WaWV3ICogY29tbW9uWm9vbVJhbmdlKTtcbiAgICAgICAgY29uc3QgbWF4U2l6ZSA9IHR5cGVvZiB0aGlzLl9tYXhUaWxlQ2FjaGVTaXplID09PSAnbnVtYmVyJyA/IE1hdGgubWluKHRoaXMuX21heFRpbGVDYWNoZVNpemUsIHZpZXdEZXBlbmRlbnRNYXhTaXplKSA6IHZpZXdEZXBlbmRlbnRNYXhTaXplO1xuXG4gICAgICAgIHRoaXMuX2NhY2hlLnNldE1heFNpemUobWF4U2l6ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aWxlcyB0aGF0IGFyZSBvdXRzaWRlIHRoZSB2aWV3cG9ydCBhbmQgYWRkcyBuZXcgdGlsZXMgdGhhdFxuICAgICAqIGFyZSBpbnNpZGUgdGhlIHZpZXdwb3J0LlxuICAgICAqL1xuICAgIHVwZGF0ZSh0cmFuc2Zvcm0gICAgICAgICAgICkge1xuICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICAgICAgaWYgKCF0aGlzLl9zb3VyY2VMb2FkZWQgfHwgdGhpcy5fcGF1c2VkKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlQ2FjaGVTaXplKHRyYW5zZm9ybSk7XG4gICAgICAgIC8vIENvdmVyZWQgaXMgYSBsaXN0IG9mIHJldGFpbmVkIHRpbGVzIHdobydzIGFyZWFzIGFyZSBmdWxseSBjb3ZlcmVkIGJ5IG90aGVyLFxuICAgICAgICAvLyBiZXR0ZXIsIHJldGFpbmVkIHRpbGVzLiBUaGV5IGFyZSBub3QgZHJhd24gc2VwYXJhdGVseS5cbiAgICAgICAgdGhpcy5fY292ZXJlZFRpbGVzID0ge307XG5cbiAgICAgICAgbGV0IGlkZWFsVGlsZUlEcztcbiAgICAgICAgaWYgKCF0aGlzLnVzZWQpIHtcbiAgICAgICAgICAgIGlkZWFsVGlsZUlEcyA9IFtdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3NvdXJjZS50aWxlSUQpIHtcbiAgICAgICAgICAgIGlkZWFsVGlsZUlEcyA9IHRyYW5zZm9ybS5nZXRWaXNpYmxlVW53cmFwcGVkQ29vcmRpbmF0ZXMoKHRoaXMuX3NvdXJjZS50aWxlSUQgICAgICkpXG4gICAgICAgICAgICAgICAgLm1hcCgodW53cmFwcGVkKSA9PiBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh1bndyYXBwZWQuY2Fub25pY2FsLnosIHVud3JhcHBlZC53cmFwLCB1bndyYXBwZWQuY2Fub25pY2FsLnosIHVud3JhcHBlZC5jYW5vbmljYWwueCwgdW53cmFwcGVkLmNhbm9uaWNhbC55KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZGVhbFRpbGVJRHMgPSB0cmFuc2Zvcm0uY292ZXJpbmdUaWxlcyh7XG4gICAgICAgICAgICAgICAgdGlsZVNpemU6IHRoaXMuX3NvdXJjZS50aWxlU2l6ZSxcbiAgICAgICAgICAgICAgICBtaW56b29tOiB0aGlzLl9zb3VyY2UubWluem9vbSxcbiAgICAgICAgICAgICAgICBtYXh6b29tOiB0aGlzLl9zb3VyY2UubWF4em9vbSxcbiAgICAgICAgICAgICAgICByb3VuZFpvb206IHRoaXMuX3NvdXJjZS5yb3VuZFpvb20sXG4gICAgICAgICAgICAgICAgcmVwYXJzZU92ZXJzY2FsZWQ6IHRoaXMuX3NvdXJjZS5yZXBhcnNlT3ZlcnNjYWxlZFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9zb3VyY2UuaGFzVGlsZSkge1xuICAgICAgICAgICAgICAgIGlkZWFsVGlsZUlEcyA9IGlkZWFsVGlsZUlEcy5maWx0ZXIoKGNvb3JkKSA9PiAodGhpcy5fc291cmNlLmhhc1RpbGUgICAgICkoY29vcmQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgb3Zlcnpvb21pbmcvdW5kZXJ6b29taW5nIGFtb3VudHMuXG4gICAgICAgIGNvbnN0IHpvb20gPSAodGhpcy5fc291cmNlLnJvdW5kWm9vbSA/IE1hdGgucm91bmQgOiBNYXRoLmZsb29yKSh0aGlzLmdldFpvb20odHJhbnNmb3JtKSk7XG4gICAgICAgIGNvbnN0IG1pbkNvdmVyaW5nWm9vbSA9IE1hdGgubWF4KHpvb20gLSBTb3VyY2VDYWNoZS5tYXhPdmVyem9vbWluZywgdGhpcy5fc291cmNlLm1pbnpvb20pO1xuICAgICAgICBjb25zdCBtYXhDb3ZlcmluZ1pvb20gPSBNYXRoLm1heCh6b29tICsgU291cmNlQ2FjaGUubWF4VW5kZXJ6b29taW5nLCAgdGhpcy5fc291cmNlLm1pbnpvb20pO1xuXG4gICAgICAgIC8vIFJldGFpbiBpcyBhIGxpc3Qgb2YgdGlsZXMgdGhhdCB3ZSBzaG91bGRuJ3QgZGVsZXRlLCBldmVuIGlmIHRoZXkgYXJlIG5vdFxuICAgICAgICAvLyB0aGUgbW9zdCBpZGVhbCB0aWxlIGZvciB0aGUgY3VycmVudCB2aWV3cG9ydC4gVGhpcyBtYXkgaW5jbHVkZSB0aWxlcyBsaWtlXG4gICAgICAgIC8vIHBhcmVudCBvciBjaGlsZCB0aWxlcyB0aGF0IGFyZSAqYWxyZWFkeSogbG9hZGVkLlxuICAgICAgICBjb25zdCByZXRhaW4gPSB0aGlzLl91cGRhdGVSZXRhaW5lZFRpbGVzKGlkZWFsVGlsZUlEcywgem9vbSk7XG5cbiAgICAgICAgY29uc3QgcGFyZW50c0ZvckZhZGluZyA9IHt9O1xuXG4gICAgICAgIGlmIChpc1Jhc3RlclR5cGUodGhpcy5fc291cmNlLnR5cGUpKSB7XG4gICAgICAgICAgICBjb25zdCBpZHMgPSBPYmplY3Qua2V5cyhyZXRhaW4pO1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBpZHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGlkc1trXTtcbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlSUQgPSByZXRhaW5baWRdO1xuICAgICAgICAgICAgICAgIGFzc2VydCh0aWxlSUQua2V5ID09PSAraWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgICAgICAgICAgaWYgKCF0aWxlKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBkcmF3UmFzdGVyVGlsZSBoYXMgbmV2ZXIgc2VlbiB0aGlzIHRpbGUsIHRoZW5cbiAgICAgICAgICAgICAgICAvLyB0aWxlLmZhZGVFbmRUaW1lIG1heSBiZSB1bnNldC4gIEluIHRoYXQgY2FzZSwgb3IgaWZcbiAgICAgICAgICAgICAgICAvLyBmYWRlRW5kVGltZSBpcyBpbiB0aGUgZnV0dXJlLCB0aGVuIHRoaXMgdGlsZSBpcyBzdGlsbFxuICAgICAgICAgICAgICAgIC8vIGZhZGluZyBpbi4gRmluZCB0aWxlcyB0byBjcm9zcy1mYWRlIHdpdGggaXQuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aWxlLmZhZGVFbmRUaW1lID09PSAndW5kZWZpbmVkJyB8fCB0aWxlLmZhZGVFbmRUaW1lID49IGJyb3dzZXIubm93KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2ZpbmRMb2FkZWRDaGlsZHJlbih0aWxlSUQsIG1heENvdmVyaW5nWm9vbSwgcmV0YWluKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluW2lkXSA9IHRpbGVJRDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRUaWxlID0gdGhpcy5maW5kTG9hZGVkUGFyZW50KHRpbGVJRCwgbWluQ292ZXJpbmdab29tLCBwYXJlbnRzRm9yRmFkaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudFRpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZFRpbGUocGFyZW50VGlsZS50aWxlSUQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZhZGVkUGFyZW50O1xuICAgICAgICBmb3IgKGZhZGVkUGFyZW50IGluIHBhcmVudHNGb3JGYWRpbmcpIHtcbiAgICAgICAgICAgIGlmICghcmV0YWluW2ZhZGVkUGFyZW50XSkge1xuICAgICAgICAgICAgICAgIC8vIElmIGEgdGlsZSBpcyBvbmx5IG5lZWRlZCBmb3IgZmFkaW5nLCBtYXJrIGl0IGFzIGNvdmVyZWQgc28gdGhhdCBpdCBpc24ndCByZW5kZXJlZCBvbiBpdCdzIG93bi5cbiAgICAgICAgICAgICAgICB0aGlzLl9jb3ZlcmVkVGlsZXNbZmFkZWRQYXJlbnRdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGZhZGVkUGFyZW50IGluIHBhcmVudHNGb3JGYWRpbmcpIHtcbiAgICAgICAgICAgIHJldGFpbltmYWRlZFBhcmVudF0gPSBwYXJlbnRzRm9yRmFkaW5nW2ZhZGVkUGFyZW50XTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZW1vdmUgdGhlIHRpbGVzIHdlIGRvbid0IG5lZWQgYW55bW9yZS5cbiAgICAgICAgY29uc3QgcmVtb3ZlID0gdXRpbC5rZXlzRGlmZmVyZW5jZSh0aGlzLl90aWxlcywgcmV0YWluKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW1vdmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZVRpbGUocmVtb3ZlW2ldKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVSZXRhaW5lZFRpbGVzKGlkZWFsVGlsZUlEcyAgICAgICAgICAgICAgICAgICAgICAgICAsIHpvb20gICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgY29uc3QgcmV0YWluID0ge307XG4gICAgICAgIGNvbnN0IGNoZWNrZWQgICAgICAgICAgICAgICAgICAgICAgID0ge307XG4gICAgICAgIGNvbnN0IG1pbkNvdmVyaW5nWm9vbSA9IE1hdGgubWF4KHpvb20gLSBTb3VyY2VDYWNoZS5tYXhPdmVyem9vbWluZywgdGhpcy5fc291cmNlLm1pbnpvb20pO1xuICAgICAgICBjb25zdCBtYXhDb3ZlcmluZ1pvb20gPSBNYXRoLm1heCh6b29tICsgU291cmNlQ2FjaGUubWF4VW5kZXJ6b29taW5nLCAgdGhpcy5fc291cmNlLm1pbnpvb20pO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWRlYWxUaWxlSURzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlSUQgPSBpZGVhbFRpbGVJRHNbaV07XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMuX2FkZFRpbGUodGlsZUlEKTtcbiAgICAgICAgICAgIGxldCBwYXJlbnRXYXNSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aWxlLmhhc0RhdGEoKSkge1xuICAgICAgICAgICAgICAgIHJldGFpblt0aWxlSUQua2V5XSA9IHRpbGVJRDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHRpbGUgd2UgcmVxdWlyZSBpcyBub3QgeWV0IGxvYWRlZCBvciBkb2VzIG5vdCBleGlzdC5cbiAgICAgICAgICAgICAgICAvLyBXZSBhcmUgbm93IGF0dGVtcHRpbmcgdG8gbG9hZCBjaGlsZCBhbmQgcGFyZW50IHRpbGVzLlxuXG4gICAgICAgICAgICAgICAgLy8gQXMgd2UgZGVzY2VuZCB1cCBhbmQgZG93biB0aGUgdGlsZSBweXJhbWlkIG9mIHRoZSBpZGVhbCB0aWxlLCB3ZSBjaGVjayB3aGV0aGVyIHRoZSBwYXJlbnRcbiAgICAgICAgICAgICAgICAvLyB0aWxlIGhhcyBiZWVuIHByZXZpb3VzbHkgcmVxdWVzdGVkIChhbmQgZXJyb3JlZCBpbiB0aGlzIGNhc2UgZHVlIHRvIHRoZSBwcmV2aW91cyBjb25kaXRpb25hbClcbiAgICAgICAgICAgICAgICAvLyBpbiBvcmRlciB0byBkZXRlcm1pbmUgaWYgd2UgbmVlZCB0byByZXF1ZXN0IGl0cyBwYXJlbnQuXG4gICAgICAgICAgICAgICAgcGFyZW50V2FzUmVxdWVzdGVkID0gdGlsZS53YXNSZXF1ZXN0ZWQoKTtcblxuICAgICAgICAgICAgICAgIC8vIFRoZSB0aWxlIGlzbid0IGxvYWRlZCB5ZXQsIGJ1dCByZXRhaW4gaXQgYW55d2F5IGJlY2F1c2UgaXQncyBhbiBpZGVhbCB0aWxlLlxuICAgICAgICAgICAgICAgIHJldGFpblt0aWxlSUQua2V5XSA9IHRpbGVJRDtcbiAgICAgICAgICAgICAgICBsZXQgY292ZXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3ZlcnNjYWxlZFogPSB6b29tICsgMTtcbiAgICAgICAgICAgICAgICBpZiAob3ZlcnNjYWxlZFogPiB0aGlzLl9zb3VyY2UubWF4em9vbSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBsb29raW5nIGZvciBhbiBvdmVyem9vbWVkIGNoaWxkIHRpbGUuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkQ29vcmQgPSB0aWxlSUQuY2hpbGRyZW4odGhpcy5fc291cmNlLm1heHpvb20pWzBdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFRpbGUgPSB0aGlzLmdldFRpbGUoY2hpbGRDb29yZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghIWNoaWxkVGlsZSAmJiBjaGlsZFRpbGUuaGFzRGF0YSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5bY2hpbGRDb29yZC5rZXldID0gY2hpbGRDb29yZDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdmVyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmRMb2FkZWRDaGlsZHJlbih0aWxlSUQsIG1heENvdmVyaW5nWm9vbSwgcmV0YWluKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgYWxsIDQgaW1tZWRpYXRlIGNoaWxkcmVuIGFyZSBsb2FkZWQgKGkuZS4gdGhlIG1pc3NpbmcgaWRlYWwgdGlsZSBpcyBjb3ZlcmVkKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRpbGVJRC5jaGlsZHJlbih0aGlzLl9zb3VyY2UubWF4em9vbSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmV0YWluW2NoaWxkcmVuW2pdLmtleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWNvdmVyZWQpIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBXZSBjb3VsZG4ndCBmaW5kIGNoaWxkIHRpbGVzIHRoYXQgZW50aXJlbHkgY292ZXIgdGhlIGlkZWFsIHRpbGUuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG92ZXJzY2FsZWRaID0gdGlsZUlELm92ZXJzY2FsZWRaIC0gMTsgb3ZlcnNjYWxlZFogPj0gbWluQ292ZXJpbmdab29tOyAtLW92ZXJzY2FsZWRaKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudElkID0gdGlsZUlELnNjYWxlZFRvKG92ZXJzY2FsZWRaKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja2VkW3BhcmVudElkLmtleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCcmVhayBwYXJlbnQgdGlsZSBhc2NlbnQsIHRoaXMgcm91dGUgaGFzIGJlZW4gcHJldmlvdXNseSBjaGVja2VkIGJ5IGFub3RoZXIgY2hpbGQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWRbcGFyZW50SWQua2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUgPSB0aGlzLmdldFRpbGUocGFyZW50SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aWxlICYmIHBhcmVudFdhc1JlcXVlc3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUgPSB0aGlzLl9hZGRUaWxlKHBhcmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5bcGFyZW50SWQua2V5XSA9IHBhcmVudElkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGN1cnJlbnQgdmFsdWVzLCBzaW5jZSB0aGV5J3JlIHRoZSBwYXJlbnQgb2YgdGhlIG5leHQgaXRlcmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHBhcmVudCB0aWxlIGFzY2VudCBsb29wLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFdhc1JlcXVlc3RlZCA9IHRpbGUud2FzUmVxdWVzdGVkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGUuaGFzRGF0YSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXRhaW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgdGlsZSwgZ2l2ZW4gaXRzIGNvb3JkaW5hdGUsIHRvIHRoZSBweXJhbWlkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2FkZFRpbGUodGlsZUlEICAgICAgICAgICAgICAgICAgKSAgICAgICB7XG4gICAgICAgIGxldCB0aWxlID0gdGhpcy5fdGlsZXNbdGlsZUlELmtleV07XG4gICAgICAgIGlmICh0aWxlKVxuICAgICAgICAgICAgcmV0dXJuIHRpbGU7XG5cblxuICAgICAgICB0aWxlID0gdGhpcy5fY2FjaGUuZ2V0QW5kUmVtb3ZlKCh0aWxlSUQua2V5ICAgICApKTtcbiAgICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWNoZVRpbWVyc1t0aWxlSUQua2V5XSkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jYWNoZVRpbWVyc1t0aWxlSUQua2V5XSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NhY2hlVGltZXJzW3RpbGVJRC5rZXldO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldFRpbGVSZWxvYWRUaW1lcih0aWxlSUQua2V5LCB0aWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IEJvb2xlYW4odGlsZSk7XG4gICAgICAgIGlmICghY2FjaGVkKSB7XG4gICAgICAgICAgICB0aWxlID0gbmV3IFRpbGUodGlsZUlELCB0aGlzLl9zb3VyY2UudGlsZVNpemUgKiB0aWxlSUQub3ZlcnNjYWxlRmFjdG9yKCkpO1xuICAgICAgICAgICAgdGhpcy5fbG9hZFRpbGUodGlsZSwgdGhpcy5fdGlsZUxvYWRlZC5iaW5kKHRoaXMsIHRpbGUsIHRpbGVJRC5rZXksIHRpbGUuc3RhdGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBzaWxlbmNlIGZsb3cuXG4gICAgICAgIGlmICghdGlsZSkgcmV0dXJuIChudWxsICAgICApO1xuXG4gICAgICAgIHRpbGUudXNlcysrO1xuICAgICAgICB0aGlzLl90aWxlc1t0aWxlSUQua2V5XSA9IHRpbGU7XG4gICAgICAgIGlmICghY2FjaGVkKSB0aGlzLl9zb3VyY2UuZmlyZSgnZGF0YWxvYWRpbmcnLCB7dGlsZTogdGlsZSwgY29vcmQ6IHRpbGUudGlsZUlELCBkYXRhVHlwZTogJ3NvdXJjZSd9KTtcblxuICAgICAgICByZXR1cm4gdGlsZTtcbiAgICB9XG5cbiAgICBfc2V0VGlsZVJlbG9hZFRpbWVyKGlkICAgICAgICAgICAgICAgICAsIHRpbGUgICAgICApIHtcbiAgICAgICAgaWYgKGlkIGluIHRoaXMuX3RpbWVycykge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyc1tpZF0pO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3RpbWVyc1tpZF07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHBpcnlUaW1lb3V0ID0gdGlsZS5nZXRFeHBpcnlUaW1lb3V0KCk7XG4gICAgICAgIGlmIChleHBpcnlUaW1lb3V0KSB7XG4gICAgICAgICAgICB0aGlzLl90aW1lcnNbaWRdID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVsb2FkVGlsZShpZCwgJ2V4cGlyZWQnKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fdGltZXJzW2lkXTtcbiAgICAgICAgICAgIH0sIGV4cGlyeVRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3NldENhY2hlSW52YWxpZGF0aW9uVGltZXIoaWQgICAgICAgICAgICAgICAgICwgdGlsZSAgICAgICkge1xuICAgICAgICBpZiAoaWQgaW4gdGhpcy5fY2FjaGVUaW1lcnMpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jYWNoZVRpbWVyc1tpZF0pO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NhY2hlVGltZXJzW2lkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4cGlyeVRpbWVvdXQgPSB0aWxlLmdldEV4cGlyeVRpbWVvdXQoKTtcbiAgICAgICAgaWYgKGV4cGlyeVRpbWVvdXQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlVGltZXJzW2lkXSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlLnJlbW92ZSgoaWQgICAgICkpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWNoZVRpbWVyc1tpZF07XG4gICAgICAgICAgICB9LCBleHBpcnlUaW1lb3V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIHRpbGUsIGdpdmVuIGl0cyBpZCwgZnJvbSB0aGUgcHlyYW1pZFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3JlbW92ZVRpbGUoaWQgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbaWRdO1xuICAgICAgICBpZiAoIXRpbGUpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGlsZS51c2VzLS07XG4gICAgICAgIGRlbGV0ZSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgIGlmICh0aGlzLl90aW1lcnNbaWRdKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJzW2lkXSk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fdGltZXJzW2lkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aWxlLnVzZXMgPiAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0aWxlLmhhc0RhdGEoKSkge1xuICAgICAgICAgICAgdGlsZS50aWxlSUQgPSB0aWxlLnRpbGVJRC53cmFwcGVkKCk7XG4gICAgICAgICAgICBjb25zdCB3cmFwcGVkSWQgPSB0aWxlLnRpbGVJRC5rZXk7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZS5hZGQoKHdyYXBwZWRJZCAgICAgKSwgdGlsZSk7XG4gICAgICAgICAgICB0aGlzLl9zZXRDYWNoZUludmFsaWRhdGlvblRpbWVyKHdyYXBwZWRJZCwgdGlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aWxlLmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fYWJvcnRUaWxlKHRpbGUpO1xuICAgICAgICAgICAgdGhpcy5fdW5sb2FkVGlsZSh0aWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbGwgdGlsZXMgZnJvbSB0aGlzIHB5cmFtaWRcbiAgICAgKi9cbiAgICBjbGVhclRpbGVzKCkge1xuICAgICAgICB0aGlzLl9zaG91bGRSZWxvYWRPblJlc3VtZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3RpbGVzKVxuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlVGlsZShpZCk7XG5cbiAgICAgICAgdGhpcy5fcmVzZXRDYWNoZSgpO1xuICAgIH1cblxuICAgIF9yZXNldENhY2hlKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX2NhY2hlVGltZXJzKVxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2NhY2hlVGltZXJzW2lkXSk7XG5cbiAgICAgICAgdGhpcy5fY2FjaGVUaW1lcnMgPSB7fTtcbiAgICAgICAgdGhpcy5fY2FjaGUucmVzZXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWFyY2ggdGhyb3VnaCBvdXIgY3VycmVudCB0aWxlcyBhbmQgYXR0ZW1wdCB0byBmaW5kIHRoZSB0aWxlcyB0aGF0XG4gICAgICogY292ZXIgdGhlIGdpdmVuIGJvdW5kcy5cbiAgICAgKiBAcGFyYW0gcXVlcnlHZW9tZXRyeSBjb29yZGluYXRlcyBvZiB0aGUgY29ybmVycyBvZiBib3VuZGluZyByZWN0YW5nbGVcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8T2JqZWN0Pn0gcmVzdWx0IGl0ZW1zIGhhdmUge3RpbGUsIG1pblgsIG1heFgsIG1pblksIG1heFl9LCB3aGVyZSBtaW4vbWF4IGJvdW5kaW5nIHZhbHVlcyBhcmUgdGhlIGdpdmVuIGJvdW5kcyB0cmFuc2Zvcm1lZCBpbiBpbnRvIHRoZSBjb29yZGluYXRlIHNwYWNlIG9mIHRoaXMgdGlsZS5cbiAgICAgKi9cbiAgICB0aWxlc0luKHF1ZXJ5R2VvbWV0cnkgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHRpbGVSZXN1bHRzID0gW107XG4gICAgICAgIGNvbnN0IGlkcyA9IHRoaXMuZ2V0SWRzKCk7XG5cbiAgICAgICAgbGV0IG1pblggPSBJbmZpbml0eTtcbiAgICAgICAgbGV0IG1pblkgPSBJbmZpbml0eTtcbiAgICAgICAgbGV0IG1heFggPSAtSW5maW5pdHk7XG4gICAgICAgIGxldCBtYXhZID0gLUluZmluaXR5O1xuICAgICAgICBjb25zdCB6ID0gcXVlcnlHZW9tZXRyeVswXS56b29tO1xuXG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcXVlcnlHZW9tZXRyeS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgY29uc3QgcCA9IHF1ZXJ5R2VvbWV0cnlba107XG4gICAgICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgcC5jb2x1bW4pO1xuICAgICAgICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIHAucm93KTtcbiAgICAgICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBwLmNvbHVtbik7XG4gICAgICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgcC5yb3cpO1xuICAgICAgICB9XG5cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW2lkc1tpXV07XG4gICAgICAgICAgICBjb25zdCB0aWxlSUQgPSB0aWxlLnRpbGVJRDtcblxuICAgICAgICAgICAgY29uc3QgdGlsZVNwYWNlQm91bmRzID0gW1xuICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVUb1RpbGVQb2ludCh0aWxlSUQsIG5ldyBDb29yZGluYXRlKG1pblgsIG1pblksIHopKSxcbiAgICAgICAgICAgICAgICBjb29yZGluYXRlVG9UaWxlUG9pbnQodGlsZUlELCBuZXcgQ29vcmRpbmF0ZShtYXhYLCBtYXhZLCB6KSlcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIGlmICh0aWxlU3BhY2VCb3VuZHNbMF0ueCA8IEVYVEVOVCAmJiB0aWxlU3BhY2VCb3VuZHNbMF0ueSA8IEVYVEVOVCAmJlxuICAgICAgICAgICAgICAgIHRpbGVTcGFjZUJvdW5kc1sxXS54ID49IDAgJiYgdGlsZVNwYWNlQm91bmRzWzFdLnkgPj0gMCkge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZVNwYWNlUXVlcnlHZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcXVlcnlHZW9tZXRyeS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICB0aWxlU3BhY2VRdWVyeUdlb21ldHJ5LnB1c2goY29vcmRpbmF0ZVRvVGlsZVBvaW50KHRpbGVJRCwgcXVlcnlHZW9tZXRyeVtqXSkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRpbGVSZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0aWxlOiB0aWxlLFxuICAgICAgICAgICAgICAgICAgICB0aWxlSUQ6IHRpbGVJRCxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlHZW9tZXRyeTogW3RpbGVTcGFjZVF1ZXJ5R2VvbWV0cnldLFxuICAgICAgICAgICAgICAgICAgICBzY2FsZTogTWF0aC5wb3coMiwgdGhpcy50cmFuc2Zvcm0uem9vbSAtIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbGVSZXN1bHRzO1xuICAgIH1cblxuICAgIGdldFZpc2libGVDb29yZGluYXRlcygpIHtcbiAgICAgICAgY29uc3QgY29vcmRzID0gdGhpcy5nZXRSZW5kZXJhYmxlSWRzKCkubWFwKChpZCkgPT4gdGhpcy5fdGlsZXNbaWRdLnRpbGVJRCk7XG4gICAgICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgICAgICBjb29yZC5wb3NNYXRyaXggPSB0aGlzLnRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgoY29vcmQudG9VbndyYXBwZWQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvb3JkcztcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5fc291cmNlLmhhc1RyYW5zaXRpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNSYXN0ZXJUeXBlKHRoaXMuX3NvdXJjZS50eXBlKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgICAgICAgICAgaWYgKHRpbGUuZmFkZUVuZFRpbWUgIT09IHVuZGVmaW5lZCAmJiB0aWxlLmZhZGVFbmRUaW1lID49IGJyb3dzZXIubm93KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuU291cmNlQ2FjaGUubWF4T3Zlcnpvb21pbmcgPSAxMDtcblNvdXJjZUNhY2hlLm1heFVuZGVyem9vbWluZyA9IDM7XG5cbi8qKlxuICogQ29udmVydCBhIGNvb3JkaW5hdGUgdG8gYSBwb2ludCBpbiBhIHRpbGUncyBjb29yZGluYXRlIHNwYWNlLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY29vcmRpbmF0ZVRvVGlsZVBvaW50KHRpbGVJRCAgICAgICAgICAgICAgICAgICwgY29vcmQgICAgICAgICAgICApICAgICAgICB7XG4gICAgY29uc3Qgem9vbWVkQ29vcmQgPSBjb29yZC56b29tVG8odGlsZUlELmNhbm9uaWNhbC56KTtcbiAgICByZXR1cm4gbmV3IFBvaW50KFxuICAgICAgICAoem9vbWVkQ29vcmQuY29sdW1uIC0gKHRpbGVJRC5jYW5vbmljYWwueCArIHRpbGVJRC53cmFwICogTWF0aC5wb3coMiwgdGlsZUlELmNhbm9uaWNhbC56KSkpICogRVhURU5ULFxuICAgICAgICAoem9vbWVkQ29vcmQucm93IC0gdGlsZUlELmNhbm9uaWNhbC55KSAqIEVYVEVOVFxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGlzUmFzdGVyVHlwZSh0eXBlKSB7XG4gICAgcmV0dXJuIHR5cGUgPT09ICdyYXN0ZXInIHx8IHR5cGUgPT09ICdpbWFnZScgfHwgdHlwZSA9PT0gJ3ZpZGVvJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTb3VyY2VDYWNoZTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbmNvbnN0IGRlc2VyaWFsaXplQnVja2V0ID0gcmVxdWlyZSgnLi4vZGF0YS9idWNrZXQnKS5kZXNlcmlhbGl6ZTtcbmNvbnN0IEZlYXR1cmVJbmRleCA9IHJlcXVpcmUoJy4uL2RhdGEvZmVhdHVyZV9pbmRleCcpO1xuY29uc3QgdnQgPSByZXF1aXJlKCdAbWFwYm94L3ZlY3Rvci10aWxlJyk7XG5jb25zdCBQcm90b2J1ZiA9IHJlcXVpcmUoJ3BiZicpO1xuY29uc3QgR2VvSlNPTkZlYXR1cmUgPSByZXF1aXJlKCcuLi91dGlsL3ZlY3RvcnRpbGVfdG9fZ2VvanNvbicpO1xuY29uc3QgZmVhdHVyZUZpbHRlciA9IHJlcXVpcmUoJy4uL3N0eWxlLXNwZWMvZmVhdHVyZV9maWx0ZXInKTtcbmNvbnN0IENvbGxpc2lvbkluZGV4ID0gcmVxdWlyZSgnLi4vc3ltYm9sL2NvbGxpc2lvbl9pbmRleCcpO1xuY29uc3QgU3ltYm9sQnVja2V0ID0gcmVxdWlyZSgnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldCcpO1xuY29uc3Qge1xuICAgIFJhc3RlckJvdW5kc0FycmF5LFxuICAgIENvbGxpc2lvbkJveEFycmF5XG59ID0gcmVxdWlyZSgnLi4vZGF0YS9hcnJheV90eXBlcycpO1xuY29uc3QgcmFzdGVyQm91bmRzQXR0cmlidXRlcyA9IHJlcXVpcmUoJy4uL2RhdGEvcmFzdGVyX2JvdW5kc19hdHRyaWJ1dGVzJyk7XG5jb25zdCBFWFRFTlQgPSByZXF1aXJlKCcuLi9kYXRhL2V4dGVudCcpO1xuY29uc3QgUG9pbnQgPSByZXF1aXJlKCdAbWFwYm94L3BvaW50LWdlb21ldHJ5Jyk7XG5jb25zdCBUZXh0dXJlID0gcmVxdWlyZSgnLi4vcmVuZGVyL3RleHR1cmUnKTtcbmNvbnN0IHtTZWdtZW50VmVjdG9yfSA9IHJlcXVpcmUoJy4uL2RhdGEvc2VnbWVudCcpO1xuY29uc3Qge1RyaWFuZ2xlSW5kZXhBcnJheX0gPSByZXF1aXJlKCcuLi9kYXRhL2luZGV4X2FycmF5X3R5cGUnKTtcbmNvbnN0IGJyb3dzZXIgPSByZXF1aXJlKCcuLi91dGlsL2Jyb3dzZXInKTtcblxuY29uc3QgQ0xPQ0tfU0tFV19SRVRSWV9USU1FT1VUID0gMzAwMDA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgLyogVGlsZSBkYXRhIHdhcyBwcmV2aW91c2x5IGxvYWRlZCwgYnV0IGhhcyBleHBpcmVkIHBlciBpdHNcbiAgICAgICAgICAgICAgICAgICAqIEhUVFAgaGVhZGVycyBhbmQgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgcmVmcmVzaGluZy4gKi9cblxuLyoqXG4gKiBBIHRpbGUgb2JqZWN0IGlzIHRoZSBjb21iaW5hdGlvbiBvZiBhIENvb3JkaW5hdGUsIHdoaWNoIGRlZmluZXNcbiAqIGl0cyBwbGFjZSwgYXMgd2VsbCBhcyBhIHVuaXF1ZSBJRCBhbmQgZGF0YSB0cmFja2luZyBmb3IgaXRzIGNvbnRlbnRcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBUaWxlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T3ZlcnNjYWxlZFRpbGVJRH0gdGlsZUlEXG4gICAgICogQHBhcmFtIHNpemVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0aWxlSUQgICAgICAgICAgICAgICAgICAsIHNpemUgICAgICAgICkge1xuICAgICAgICB0aGlzLnRpbGVJRCA9IHRpbGVJRDtcbiAgICAgICAgdGhpcy51aWQgPSB1dGlsLnVuaXF1ZUlkKCk7XG4gICAgICAgIHRoaXMudXNlcyA9IDA7XG4gICAgICAgIHRoaXMudGlsZVNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLmJ1Y2tldHMgPSB7fTtcbiAgICAgICAgdGhpcy5leHBpcmF0aW9uVGltZSA9IG51bGw7XG5cbiAgICAgICAgLy8gQ291bnRzIHRoZSBudW1iZXIgb2YgdGltZXMgYSByZXNwb25zZSB3YXMgYWxyZWFkeSBleHBpcmVkIHdoZW5cbiAgICAgICAgLy8gcmVjZWl2ZWQuIFdlJ3JlIHVzaW5nIHRoaXMgdG8gYWRkIGEgZGVsYXkgd2hlbiBtYWtpbmcgYSBuZXcgcmVxdWVzdFxuICAgICAgICAvLyBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgcmV0cnlpbmcgaW1tZWRpYXRlbHkgaW4gY2FzZSBvZiBhIHNlcnZlclxuICAgICAgICAvLyBzZXJ2aW5nIGV4cGlyZWQgdGlsZXMuXG4gICAgICAgIHRoaXMuZXhwaXJlZFJlcXVlc3RDb3VudCA9IDA7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdsb2FkaW5nJztcbiAgICB9XG5cbiAgICByZWdpc3RlckZhZGVEdXJhdGlvbihkdXJhdGlvbiAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGZhZGVFbmRUaW1lID0gZHVyYXRpb24gKyB0aGlzLnRpbWVBZGRlZDtcbiAgICAgICAgaWYgKGZhZGVFbmRUaW1lIDwgYnJvd3Nlci5ub3coKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5mYWRlRW5kVGltZSAmJiBmYWRlRW5kVGltZSA8IHRoaXMuZmFkZUVuZFRpbWUpIHJldHVybjtcblxuICAgICAgICB0aGlzLmZhZGVFbmRUaW1lID0gZmFkZUVuZFRpbWU7XG4gICAgfVxuXG4gICAgd2FzUmVxdWVzdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gJ2Vycm9yZWQnIHx8IHRoaXMuc3RhdGUgPT09ICdsb2FkZWQnIHx8IHRoaXMuc3RhdGUgPT09ICdyZWxvYWRpbmcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgZGF0YSBvYmplY3Qgd2l0aCBhICdidWZmZXJzJyBwcm9wZXJ0eSwgbG9hZCBpdCBpbnRvXG4gICAgICogdGhpcyB0aWxlJ3MgZWxlbWVudEdyb3VwcyBhbmQgYnVmZmVycyBwcm9wZXJ0aWVzIGFuZCBzZXQgbG9hZGVkXG4gICAgICogdG8gdHJ1ZS4gSWYgdGhlIGRhdGEgaXMgbnVsbCwgbGlrZSBpbiB0aGUgY2FzZSBvZiBhbiBlbXB0eVxuICAgICAqIEdlb0pTT04gdGlsZSwgbm8tb3AgYnV0IHN0aWxsIHNldCBsb2FkZWQgdG8gdHJ1ZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgICAqIEBwYXJhbSBwYWludGVyXG4gICAgICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGxvYWRWZWN0b3JEYXRhKGRhdGEgICAgICAgICAgICAgICAgICAsIHBhaW50ZXIgICAgICwganVzdFJlbG9hZGVkICAgICAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5oYXNEYXRhKCkpIHtcbiAgICAgICAgICAgIHRoaXMudW5sb2FkVmVjdG9yRGF0YSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdsb2FkZWQnO1xuXG4gICAgICAgIC8vIGVtcHR5IEdlb0pTT04gdGlsZVxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuY29sbGlzaW9uQm94QXJyYXkgPSBuZXcgQ29sbGlzaW9uQm94QXJyYXkoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhLnJhd1RpbGVEYXRhKSB7XG4gICAgICAgICAgICAvLyBPbmx5IHZlY3RvciB0aWxlcyBoYXZlIHJhd1RpbGVEYXRhXG4gICAgICAgICAgICB0aGlzLnJhd1RpbGVEYXRhID0gZGF0YS5yYXdUaWxlRGF0YTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbGxpc2lvbkJveEFycmF5ID0gZGF0YS5jb2xsaXNpb25Cb3hBcnJheTtcbiAgICAgICAgdGhpcy5mZWF0dXJlSW5kZXggPSBkYXRhLmZlYXR1cmVJbmRleDtcbiAgICAgICAgdGhpcy5mZWF0dXJlSW5kZXgucmF3VGlsZURhdGEgPSB0aGlzLnJhd1RpbGVEYXRhO1xuICAgICAgICB0aGlzLmJ1Y2tldHMgPSBkZXNlcmlhbGl6ZUJ1Y2tldChkYXRhLmJ1Y2tldHMsIHBhaW50ZXIuc3R5bGUpO1xuXG4gICAgICAgIGlmIChqdXN0UmVsb2FkZWQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5idWNrZXRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVja2V0ID0gdGhpcy5idWNrZXRzW2lkXTtcbiAgICAgICAgICAgICAgICBpZiAoYnVja2V0IGluc3RhbmNlb2YgU3ltYm9sQnVja2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5qdXN0UmVsb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhLmljb25BdGxhc0ltYWdlKSB7XG4gICAgICAgICAgICB0aGlzLmljb25BdGxhc0ltYWdlID0gZGF0YS5pY29uQXRsYXNJbWFnZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5nbHlwaEF0bGFzSW1hZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuZ2x5cGhBdGxhc0ltYWdlID0gZGF0YS5nbHlwaEF0bGFzSW1hZ2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlIGFueSBkYXRhIG9yIFdlYkdMIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMgdGlsZS5cbiAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdW5sb2FkVmVjdG9yRGF0YSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLmJ1Y2tldHMpIHtcbiAgICAgICAgICAgIHRoaXMuYnVja2V0c1tpZF0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVja2V0cyA9IHt9O1xuXG4gICAgICAgIGlmICh0aGlzLmljb25BdGxhc1RleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuaWNvbkF0bGFzVGV4dHVyZS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZ2x5cGhBdGxhc1RleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuZ2x5cGhBdGxhc1RleHR1cmUuZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb2xsaXNpb25Cb3hBcnJheSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmVhdHVyZUluZGV4ID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdGF0ZSA9ICd1bmxvYWRlZCc7XG4gICAgfVxuXG4gICAgdW5sb2FkREVNRGF0YSgpIHtcbiAgICAgICAgdGhpcy5kZW0gPSBudWxsO1xuICAgICAgICB0aGlzLm5laWdoYm9yaW5nVGlsZXMgPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXRlID0gJ3VubG9hZGVkJztcbiAgICB9XG5cbiAgICBnZXRCdWNrZXQobGF5ZXIgICAgICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVja2V0c1tsYXllci5pZF07XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQgICAgICAgICApIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLmJ1Y2tldHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1Y2tldCA9IHRoaXMuYnVja2V0c1tpZF07XG4gICAgICAgICAgICBpZiAoIWJ1Y2tldC51cGxvYWRlZCkge1xuICAgICAgICAgICAgICAgIGJ1Y2tldC51cGxvYWQoY29udGV4dCk7XG4gICAgICAgICAgICAgICAgYnVja2V0LnVwbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgICAgICBpZiAodGhpcy5pY29uQXRsYXNJbWFnZSkge1xuICAgICAgICAgICAgdGhpcy5pY29uQXRsYXNUZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgdGhpcy5pY29uQXRsYXNJbWFnZSwgZ2wuUkdCQSk7XG4gICAgICAgICAgICB0aGlzLmljb25BdGxhc0ltYWdlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmdseXBoQXRsYXNJbWFnZSkge1xuICAgICAgICAgICAgdGhpcy5nbHlwaEF0bGFzVGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIHRoaXMuZ2x5cGhBdGxhc0ltYWdlLCBnbC5BTFBIQSk7XG4gICAgICAgICAgICB0aGlzLmdseXBoQXRsYXNJbWFnZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBxdWVyeVJlbmRlcmVkRmVhdHVyZXMobGF5ZXJzICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUdlb21ldHJ5ICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhcmluZyAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VJRCAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25JbmRleCAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICBpZiAoIXRoaXMuZmVhdHVyZUluZGV4IHx8ICF0aGlzLmNvbGxpc2lvbkJveEFycmF5KVxuICAgICAgICAgICAgcmV0dXJuIHt9O1xuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgYWRkaXRpb25hbCByYWRpdXMgbmVlZGVkIGZhY3RvcmluZyBpbiBwcm9wZXJ0eSBmdW5jdGlvbnNcbiAgICAgICAgbGV0IGFkZGl0aW9uYWxSYWRpdXMgPSAwO1xuICAgICAgICBjb25zdCBidWNrZXRJbnN0YW5jZUlkcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGxheWVycykge1xuICAgICAgICAgICAgY29uc3QgYnVja2V0ID0gdGhpcy5nZXRCdWNrZXQobGF5ZXJzW2lkXSk7XG4gICAgICAgICAgICBpZiAoYnVja2V0KSB7XG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbFJhZGl1cyA9IE1hdGgubWF4KGFkZGl0aW9uYWxSYWRpdXMsIGxheWVyc1tpZF0ucXVlcnlSYWRpdXMoYnVja2V0KSk7XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGJ1Y2tldCBpbnN0YW5jZSdzIGlkIHRvIHRoZSBzZXQgb2YgY3VycmVudCBpZHMuXG4gICAgICAgICAgICAgICAgLy8gVGhlIHF1ZXJ5IHdpbGwgb25seSBpbmNsdWRlIHJlc3VsdHMgZnJvbSBjdXJyZW50IGJ1Y2tldHMuXG4gICAgICAgICAgICAgICAgaWYgKGJ1Y2tldCBpbnN0YW5jZW9mIFN5bWJvbEJ1Y2tldCAmJiBidWNrZXQuYnVja2V0SW5zdGFuY2VJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldEluc3RhbmNlSWRzW2J1Y2tldC5idWNrZXRJbnN0YW5jZUlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZmVhdHVyZUluZGV4LnF1ZXJ5KHtcbiAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnk6IHF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICBzY2FsZTogc2NhbGUsXG4gICAgICAgICAgICB0aWxlU2l6ZTogdGhpcy50aWxlU2l6ZSxcbiAgICAgICAgICAgIGJlYXJpbmc6IGJlYXJpbmcsXG4gICAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxSYWRpdXM6IGFkZGl0aW9uYWxSYWRpdXMsXG4gICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheTogdGhpcy5jb2xsaXNpb25Cb3hBcnJheSxcbiAgICAgICAgICAgIHNvdXJjZUlEOiBzb3VyY2VJRCxcbiAgICAgICAgICAgIGNvbGxpc2lvbkluZGV4OiBjb2xsaXNpb25JbmRleCxcbiAgICAgICAgICAgIGJ1Y2tldEluc3RhbmNlSWRzOiBidWNrZXRJbnN0YW5jZUlkc1xuICAgICAgICB9LCBsYXllcnMpO1xuICAgIH1cblxuICAgIHF1ZXJ5U291cmNlRmVhdHVyZXMocmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAsIHBhcmFtcyAgICAgKSB7XG4gICAgICAgIGlmICghdGhpcy5yYXdUaWxlRGF0YSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICghdGhpcy52dExheWVycykge1xuICAgICAgICAgICAgdGhpcy52dExheWVycyA9IG5ldyB2dC5WZWN0b3JUaWxlKG5ldyBQcm90b2J1Zih0aGlzLnJhd1RpbGVEYXRhKSkubGF5ZXJzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSBwYXJhbXMgPyBwYXJhbXMuc291cmNlTGF5ZXIgOiAnJztcbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLnZ0TGF5ZXJzLl9nZW9qc29uVGlsZUxheWVyIHx8IHRoaXMudnRMYXllcnNbc291cmNlTGF5ZXJdO1xuXG4gICAgICAgIGlmICghbGF5ZXIpIHJldHVybjtcblxuICAgICAgICBjb25zdCBmaWx0ZXIgPSBmZWF0dXJlRmlsdGVyKHBhcmFtcyAmJiBwYXJhbXMuZmlsdGVyKTtcbiAgICAgICAgY29uc3QgY29vcmQgPSB7IHo6IHRoaXMudGlsZUlELm92ZXJzY2FsZWRaLCB4OiB0aGlzLnRpbGVJRC5jYW5vbmljYWwueCwgeTogdGhpcy50aWxlSUQuY2Fub25pY2FsLnkgfTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxheWVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gbGF5ZXIuZmVhdHVyZShpKTtcbiAgICAgICAgICAgIGlmIChmaWx0ZXIoe3pvb206IHRoaXMudGlsZUlELm92ZXJzY2FsZWRafSwgZmVhdHVyZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBnZW9qc29uRmVhdHVyZSA9IG5ldyBHZW9KU09ORmVhdHVyZShmZWF0dXJlLCBjb29yZC56LCBjb29yZC54LCBjb29yZC55KTtcbiAgICAgICAgICAgICAgICAoZ2VvanNvbkZlYXR1cmUgICAgICkudGlsZSA9IGNvb3JkO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlb2pzb25GZWF0dXJlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyTWFzaygpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VnbWVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2VnbWVudHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWFza2VkQm91bmRzQnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLm1hc2tlZEJvdW5kc0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5tYXNrZWRCb3VuZHNCdWZmZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWFza2VkSW5kZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMubWFza2VkSW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMubWFza2VkSW5kZXhCdWZmZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRNYXNrKG1hc2sgICAgICAsIGNvbnRleHQgICAgICAgICApIHtcblxuICAgICAgICAvLyBkb24ndCByZWRvIGJ1ZmZlciB3b3JrIGlmIHRoZSBtYXNrIGlzIHRoZSBzYW1lO1xuICAgICAgICBpZiAodXRpbC5kZWVwRXF1YWwodGhpcy5tYXNrLCBtYXNrKSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMubWFzayA9IG1hc2s7XG4gICAgICAgIHRoaXMuY2xlYXJNYXNrKCk7XG5cbiAgICAgICAgLy8gV2Ugd2FudCB0byByZW5kZXIgdGhlIGZ1bGwgdGlsZSwgYW5kIGtlZXBpbmcgdGhlIHNlZ21lbnRzL3ZlcnRpY2VzL2luZGljZXMgZW1wdHkgbWVhbnNcbiAgICAgICAgLy8gdXNpbmcgdGhlIGdsb2JhbCBzaGFyZWQgYnVmZmVycyBmb3IgY292ZXJpbmcgdGhlIGVudGlyZSB0aWxlLlxuICAgICAgICBpZiAodXRpbC5kZWVwRXF1YWwobWFzaywgeycwJzogdHJ1ZX0pKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgbWFza2VkQm91bmRzQXJyYXkgPSBuZXcgUmFzdGVyQm91bmRzQXJyYXkoKTtcbiAgICAgICAgY29uc3QgaW5kZXhBcnJheSA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcblxuICAgICAgICB0aGlzLnNlZ21lbnRzID0gbmV3IFNlZ21lbnRWZWN0b3IoKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHNlZ21lbnQgc28gdGhhdCB3ZSB3aWxsIHVwbG9hZCAoZW1wdHkpIGJ1ZmZlcnMgZXZlbiB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG9cbiAgICAgICAgLy8gZHJhdyBmb3IgdGhpcyB0aWxlLlxuICAgICAgICB0aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDAsIG1hc2tlZEJvdW5kc0FycmF5LCBpbmRleEFycmF5KTtcblxuICAgICAgICBjb25zdCBtYXNrQXJyYXkgPSBPYmplY3Qua2V5cyhtYXNrKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXNrQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG1hc2tDb29yZCA9IG1hc2tbbWFza0FycmF5W2ldXTtcbiAgICAgICAgICAgIGNvbnN0IHZlcnRleEV4dGVudCA9IEVYVEVOVCA+PiBtYXNrQ29vcmQuejtcbiAgICAgICAgICAgIGNvbnN0IHRsVmVydGV4ID0gbmV3IFBvaW50KG1hc2tDb29yZC54ICogdmVydGV4RXh0ZW50LCBtYXNrQ29vcmQueSAqIHZlcnRleEV4dGVudCk7XG4gICAgICAgICAgICBjb25zdCBiclZlcnRleCA9IG5ldyBQb2ludCh0bFZlcnRleC54ICsgdmVydGV4RXh0ZW50LCB0bFZlcnRleC55ICsgdmVydGV4RXh0ZW50KTtcblxuICAgICAgICAgICAgLy8gbm90IHN1cmUgd2h5IGZsb3cgaXMgY29tcGxhaW5pbmcgaGVyZSBiZWNhdXNlIGl0IGRvZXNuJ3QgY29tcGxhaW4gYXQgTDQwMVxuICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9ICh0aGlzLnNlZ21lbnRzICAgICApLnByZXBhcmVTZWdtZW50KDQsIG1hc2tlZEJvdW5kc0FycmF5LCBpbmRleEFycmF5KTtcblxuICAgICAgICAgICAgbWFza2VkQm91bmRzQXJyYXkuZW1wbGFjZUJhY2sodGxWZXJ0ZXgueCwgdGxWZXJ0ZXgueSwgdGxWZXJ0ZXgueCwgdGxWZXJ0ZXgueSk7XG4gICAgICAgICAgICBtYXNrZWRCb3VuZHNBcnJheS5lbXBsYWNlQmFjayhiclZlcnRleC54LCB0bFZlcnRleC55LCBiclZlcnRleC54LCB0bFZlcnRleC55KTtcbiAgICAgICAgICAgIG1hc2tlZEJvdW5kc0FycmF5LmVtcGxhY2VCYWNrKHRsVmVydGV4LngsIGJyVmVydGV4LnksIHRsVmVydGV4LngsIGJyVmVydGV4LnkpO1xuICAgICAgICAgICAgbWFza2VkQm91bmRzQXJyYXkuZW1wbGFjZUJhY2soYnJWZXJ0ZXgueCwgYnJWZXJ0ZXgueSwgYnJWZXJ0ZXgueCwgYnJWZXJ0ZXgueSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHNlZ21lbnQudmVydGV4TGVuZ3RoO1xuICAgICAgICAgICAgLy8gMCwgMSwgMlxuICAgICAgICAgICAgLy8gMSwgMiwgM1xuICAgICAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhvZmZzZXQsIG9mZnNldCArIDEsIG9mZnNldCArIDIpO1xuICAgICAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhvZmZzZXQgKyAxLCBvZmZzZXQgKyAyLCBvZmZzZXQgKyAzKTtcblxuICAgICAgICAgICAgc2VnbWVudC52ZXJ0ZXhMZW5ndGggKz0gNDtcbiAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICs9IDI7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1hc2tlZEJvdW5kc0J1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKG1hc2tlZEJvdW5kc0FycmF5LCByYXN0ZXJCb3VuZHNBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICB0aGlzLm1hc2tlZEluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcihpbmRleEFycmF5KTtcbiAgICB9XG5cbiAgICBoYXNEYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gJ2xvYWRlZCcgfHwgdGhpcy5zdGF0ZSA9PT0gJ3JlbG9hZGluZycgfHwgdGhpcy5zdGF0ZSA9PT0gJ2V4cGlyZWQnO1xuICAgIH1cblxuICAgIHNldEV4cGlyeURhdGEoZGF0YSAgICAgKSB7XG4gICAgICAgIGNvbnN0IHByaW9yID0gdGhpcy5leHBpcmF0aW9uVGltZTtcblxuICAgICAgICBpZiAoZGF0YS5jYWNoZUNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZENDID0gdXRpbC5wYXJzZUNhY2hlQ29udHJvbChkYXRhLmNhY2hlQ29udHJvbCk7XG4gICAgICAgICAgICBpZiAocGFyc2VkQ0NbJ21heC1hZ2UnXSkgdGhpcy5leHBpcmF0aW9uVGltZSA9IERhdGUubm93KCkgKyBwYXJzZWRDQ1snbWF4LWFnZSddICogMTAwMDtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV4cGlyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwaXJhdGlvblRpbWUgPSBuZXcgRGF0ZShkYXRhLmV4cGlyZXMpLmdldFRpbWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgbGV0IGlzRXhwaXJlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5leHBpcmF0aW9uVGltZSA+IG5vdykge1xuICAgICAgICAgICAgICAgIGlzRXhwaXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghcHJpb3IpIHtcbiAgICAgICAgICAgICAgICBpc0V4cGlyZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmV4cGlyYXRpb25UaW1lIDwgcHJpb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBFeHBpcmluZyBkYXRlIGlzIGdvaW5nIGJhY2t3YXJkczpcbiAgICAgICAgICAgICAgICAvLyBmYWxsIGJhY2sgdG8gZXhwb25lbnRpYWwgYmFja29mZlxuICAgICAgICAgICAgICAgIGlzRXhwaXJlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVsdGEgPSB0aGlzLmV4cGlyYXRpb25UaW1lIC0gcHJpb3I7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWRlbHRhKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlcnZlciBpcyBzZXJ2aW5nIHRoZSBzYW1lIGV4cGlyZWQgcmVzb3VyY2Ugb3ZlciBhbmQgb3ZlcjogZmFsbFxuICAgICAgICAgICAgICAgICAgICAvLyBiYWNrIHRvIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gICAgICAgICAgICAgICAgICAgIGlzRXhwaXJlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhhdCBlaXRoZXIgdGhlIGNsaWVudCBvciB0aGUgc2VydmVyIGNsb2NrIGlzIHdyb25nIGFuZFxuICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gaW50ZXJwb2xhdGUgYSB2YWxpZCBleHBpcmF0aW9uIGRhdGUgKGZyb20gdGhlIGNsaWVudCBQT1YpXG4gICAgICAgICAgICAgICAgICAgIC8vIG9ic2VydmluZyBhIG1pbmltdW0gdGltZW91dC5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBpcmF0aW9uVGltZSA9IG5vdyArIE1hdGgubWF4KGRlbHRhLCBDTE9DS19TS0VXX1JFVFJZX1RJTUVPVVQpO1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNFeHBpcmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHBpcmVkUmVxdWVzdENvdW50Kys7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICdleHBpcmVkJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHBpcmVkUmVxdWVzdENvdW50ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEV4cGlyeVRpbWVvdXQoKSB7XG4gICAgICAgIGlmICh0aGlzLmV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5leHBpcmVkUmVxdWVzdENvdW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEwMDAgKiAoMSA8PCBNYXRoLm1pbih0aGlzLmV4cGlyZWRSZXF1ZXN0Q291bnQgLSAxLCAzMSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBNYXggdmFsdWUgZm9yIGBzZXRUaW1lb3V0YCBpbXBsZW1lbnRhdGlvbnMgaXMgYSAzMiBiaXQgaW50ZWdlcjsgY2FwIHRoaXMgYWNjb3JkaW5nbHlcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4odGhpcy5leHBpcmF0aW9uVGltZSAtIG5ldyBEYXRlKCkuZ2V0VGltZSgpLCBNYXRoLnBvdygyLCAzMSkgLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUaWxlO1xuIiwiLy8gICAgICBcblxuY29uc3QgTG5nTGF0Qm91bmRzID0gcmVxdWlyZSgnLi4vZ2VvL2xuZ19sYXRfYm91bmRzJyk7XG5jb25zdCBjbGFtcCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpLmNsYW1wO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jbGFzcyBUaWxlQm91bmRzIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoYm91bmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbWluem9vbSAgICAgICAgICwgbWF4em9vbSAgICAgICAgICkge1xuICAgICAgICB0aGlzLmJvdW5kcyA9IExuZ0xhdEJvdW5kcy5jb252ZXJ0KHRoaXMudmFsaWRhdGVCb3VuZHMoYm91bmRzKSk7XG4gICAgICAgIHRoaXMubWluem9vbSA9IG1pbnpvb20gfHwgMDtcbiAgICAgICAgdGhpcy5tYXh6b29tID0gbWF4em9vbSB8fCAyNDtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZUJvdW5kcyhib3VuZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgYm91bmRzIHByb3BlcnR5IGNvbnRhaW5zIHZhbGlkIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGVzXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShib3VuZHMpIHx8IGJvdW5kcy5sZW5ndGggIT09IDQpIHJldHVybiBbLTE4MCwgLTkwLCAxODAsIDkwXTtcbiAgICAgICAgcmV0dXJuIFtNYXRoLm1heCgtMTgwLCBib3VuZHNbMF0pLCBNYXRoLm1heCgtOTAsIGJvdW5kc1sxXSksIE1hdGgubWluKDE4MCwgYm91bmRzWzJdKSwgTWF0aC5taW4oOTAsIGJvdW5kc1szXSldO1xuICAgIH1cblxuICAgIGNvbnRhaW5zKHRpbGVJRCAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGxldmVsID0ge1xuICAgICAgICAgICAgbWluWDogTWF0aC5mbG9vcih0aGlzLmxuZ1godGhpcy5ib3VuZHMuZ2V0V2VzdCgpLCB0aWxlSUQueikpLFxuICAgICAgICAgICAgbWluWTogTWF0aC5mbG9vcih0aGlzLmxhdFkodGhpcy5ib3VuZHMuZ2V0Tm9ydGgoKSwgdGlsZUlELnopKSxcbiAgICAgICAgICAgIG1heFg6IE1hdGguY2VpbCh0aGlzLmxuZ1godGhpcy5ib3VuZHMuZ2V0RWFzdCgpLCB0aWxlSUQueikpLFxuICAgICAgICAgICAgbWF4WTogTWF0aC5jZWlsKHRoaXMubGF0WSh0aGlzLmJvdW5kcy5nZXRTb3V0aCgpLCB0aWxlSUQueikpXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGhpdCA9IHRpbGVJRC54ID49IGxldmVsLm1pblggJiYgdGlsZUlELnggPCBsZXZlbC5tYXhYICYmIHRpbGVJRC55ID49IGxldmVsLm1pblkgJiYgdGlsZUlELnkgPCBsZXZlbC5tYXhZO1xuICAgICAgICByZXR1cm4gaGl0O1xuICAgIH1cblxuICAgIGxuZ1gobG5nICAgICAgICAsIHpvb20gICAgICAgICkge1xuICAgICAgICByZXR1cm4gKGxuZyArIDE4MCkgKiAoTWF0aC5wb3coMiwgem9vbSkgLyAzNjApO1xuICAgIH1cblxuICAgIGxhdFkobGF0ICAgICAgICAsIHpvb20gICAgICAgICkge1xuICAgICAgICBjb25zdCBmID0gY2xhbXAoTWF0aC5zaW4oTWF0aC5QSSAvIDE4MCAqIGxhdCksIC0wLjk5OTksIDAuOTk5OSk7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5wb3coMiwgem9vbSkgLyAoMiAqIE1hdGguUEkpO1xuICAgICAgICByZXR1cm4gTWF0aC5wb3coMiwgem9vbSAtIDEpICsgMC41ICogTWF0aC5sb2coKDEgKyBmKSAvICgxIC0gZikpICogLXNjYWxlO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUaWxlQm91bmRzO1xuIiwiLy8gICAgICBcblxuY29uc3QgV2hvb1RTID0gcmVxdWlyZSgnQG1hcGJveC93aG9vdHMtanMnKTtcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuY29uc3Qge3JlZ2lzdGVyfSA9IHJlcXVpcmUoJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2ZlcicpO1xuY29uc3QgQ29vcmRpbmF0ZSA9IHJlcXVpcmUoJy4uL2dlby9jb29yZGluYXRlJyk7XG5cbmNsYXNzIENhbm9uaWNhbFRpbGVJRCB7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcih6ICAgICAgICAsIHggICAgICAgICwgeSAgICAgICAgKSB7XG4gICAgICAgIGFzc2VydCh6ID49IDAgJiYgeiA8PSAyNSk7XG4gICAgICAgIGFzc2VydCh4ID49IDAgJiYgeCA8IE1hdGgucG93KDIsIHopKTtcbiAgICAgICAgYXNzZXJ0KHkgPj0gMCAmJiB5IDwgTWF0aC5wb3coMiwgeikpO1xuICAgICAgICB0aGlzLnogPSB6O1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICB0aGlzLmtleSA9IGNhbGN1bGF0ZUtleSgwLCB6LCB4LCB5KTtcbiAgICB9XG5cbiAgICBlcXVhbHMoaWQgICAgICAgICAgICAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy56ID09PSBpZC56ICYmIHRoaXMueCA9PT0gaWQueCAmJiB0aGlzLnkgPT09IGlkLnk7XG4gICAgfVxuXG4gICAgLy8gZ2l2ZW4gYSBsaXN0IG9mIHVybHMsIGNob29zZSBhIHVybCB0ZW1wbGF0ZSBhbmQgcmV0dXJuIGEgdGlsZSBVUkxcbiAgICB1cmwodXJscyAgICAgICAgICAgICAgICwgc2NoZW1lICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGJib3ggPSBXaG9vVFMuZ2V0VGlsZUJCb3godGhpcy54LCB0aGlzLnksIHRoaXMueik7XG4gICAgICAgIGNvbnN0IHF1YWRrZXkgPSBnZXRRdWFka2V5KHRoaXMueiwgdGhpcy54LCB0aGlzLnkpO1xuXG4gICAgICAgIHJldHVybiB1cmxzWyh0aGlzLnggKyB0aGlzLnkpICUgdXJscy5sZW5ndGhdXG4gICAgICAgICAgICAucmVwbGFjZSgne3ByZWZpeH0nLCAodGhpcy54ICUgMTYpLnRvU3RyaW5nKDE2KSArICh0aGlzLnkgJSAxNikudG9TdHJpbmcoMTYpKVxuICAgICAgICAgICAgLnJlcGxhY2UoJ3t6fScsIFN0cmluZyh0aGlzLnopKVxuICAgICAgICAgICAgLnJlcGxhY2UoJ3t4fScsIFN0cmluZyh0aGlzLngpKVxuICAgICAgICAgICAgLnJlcGxhY2UoJ3t5fScsIFN0cmluZyhzY2hlbWUgPT09ICd0bXMnID8gKE1hdGgucG93KDIsIHRoaXMueikgLSB0aGlzLnkgLSAxKSA6IHRoaXMueSkpXG4gICAgICAgICAgICAucmVwbGFjZSgne3F1YWRrZXl9JywgcXVhZGtleSlcbiAgICAgICAgICAgIC5yZXBsYWNlKCd7YmJveC1lcHNnLTM4NTd9JywgYmJveCk7XG4gICAgfVxufVxuXG5jbGFzcyBVbndyYXBwZWRUaWxlSUQge1xuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKHdyYXAgICAgICAgICwgY2Fub25pY2FsICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy53cmFwID0gd3JhcDtcbiAgICAgICAgdGhpcy5jYW5vbmljYWwgPSBjYW5vbmljYWw7XG4gICAgICAgIHRoaXMua2V5ID0gY2FsY3VsYXRlS2V5KHdyYXAsIGNhbm9uaWNhbC56LCBjYW5vbmljYWwueCwgY2Fub25pY2FsLnkpO1xuICAgIH1cbn1cblxuY2xhc3MgT3ZlcnNjYWxlZFRpbGVJRCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihvdmVyc2NhbGVkWiAgICAgICAgLCB3cmFwICAgICAgICAsIHogICAgICAgICwgeCAgICAgICAgLCB5ICAgICAgICApIHtcbiAgICAgICAgYXNzZXJ0KG92ZXJzY2FsZWRaID49IHopO1xuICAgICAgICB0aGlzLm92ZXJzY2FsZWRaID0gb3ZlcnNjYWxlZFo7XG4gICAgICAgIHRoaXMud3JhcCA9IHdyYXA7XG4gICAgICAgIHRoaXMuY2Fub25pY2FsID0gbmV3IENhbm9uaWNhbFRpbGVJRCh6LCAreCwgK3kpO1xuICAgICAgICB0aGlzLmtleSA9IGNhbGN1bGF0ZUtleSh3cmFwLCBvdmVyc2NhbGVkWiwgeCwgeSk7XG4gICAgfVxuXG4gICAgc2NhbGVkVG8odGFyZ2V0WiAgICAgICAgKSB7XG4gICAgICAgIGFzc2VydCh0YXJnZXRaIDw9IHRoaXMub3ZlcnNjYWxlZFopO1xuICAgICAgICBjb25zdCB6RGlmZmVyZW5jZSA9IHRoaXMuY2Fub25pY2FsLnogLSB0YXJnZXRaO1xuICAgICAgICBpZiAodGFyZ2V0WiA+IHRoaXMuY2Fub25pY2FsLnopIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0YXJnZXRaLCB0aGlzLndyYXAsIHRoaXMuY2Fub25pY2FsLnosIHRoaXMuY2Fub25pY2FsLngsIHRoaXMuY2Fub25pY2FsLnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBPdmVyc2NhbGVkVGlsZUlEKHRhcmdldFosIHRoaXMud3JhcCwgdGFyZ2V0WiwgdGhpcy5jYW5vbmljYWwueCA+PiB6RGlmZmVyZW5jZSwgdGhpcy5jYW5vbmljYWwueSA+PiB6RGlmZmVyZW5jZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc0NoaWxkT2YocGFyZW50ICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHpEaWZmZXJlbmNlID0gdGhpcy5jYW5vbmljYWwueiAtIHBhcmVudC5jYW5vbmljYWwuejtcbiAgICAgICAgLy8gV2UncmUgZmlyc3QgdGVzdGluZyBmb3IgeiA9PSAwLCB0byBhdm9pZCBhIDMyIGJpdCBzaGlmdCwgd2hpY2ggaXMgdW5kZWZpbmVkLlxuICAgICAgICByZXR1cm4gcGFyZW50Lm92ZXJzY2FsZWRaID09PSAwIHx8IChcbiAgICAgICAgICAgIHBhcmVudC5vdmVyc2NhbGVkWiA8IHRoaXMub3ZlcnNjYWxlZFogJiZcbiAgICAgICAgICAgICAgICBwYXJlbnQuY2Fub25pY2FsLnggPT09ICh0aGlzLmNhbm9uaWNhbC54ID4+IHpEaWZmZXJlbmNlKSAmJlxuICAgICAgICAgICAgICAgIHBhcmVudC5jYW5vbmljYWwueSA9PT0gKHRoaXMuY2Fub25pY2FsLnkgPj4gekRpZmZlcmVuY2UpKTtcbiAgICB9XG5cbiAgICBjaGlsZHJlbihzb3VyY2VNYXhab29tICAgICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMub3ZlcnNjYWxlZFogPj0gc291cmNlTWF4Wm9vbSkge1xuICAgICAgICAgICAgLy8gcmV0dXJuIGEgc2luZ2xlIHRpbGUgY29vcmQgcmVwcmVzZW50aW5nIGEgYW4gb3ZlcnNjYWxlZCB0aWxlXG4gICAgICAgICAgICByZXR1cm4gW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRoaXMub3ZlcnNjYWxlZFogKyAxLCB0aGlzLndyYXAsIHRoaXMuY2Fub25pY2FsLnosIHRoaXMuY2Fub25pY2FsLngsIHRoaXMuY2Fub25pY2FsLnkpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHogPSB0aGlzLmNhbm9uaWNhbC56ICsgMTtcbiAgICAgICAgY29uc3QgeCA9IHRoaXMuY2Fub25pY2FsLnggKiAyO1xuICAgICAgICBjb25zdCB5ID0gdGhpcy5jYW5vbmljYWwueSAqIDI7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh6LCB0aGlzLndyYXAsIHosIHgsIHkpLFxuICAgICAgICAgICAgbmV3IE92ZXJzY2FsZWRUaWxlSUQoeiwgdGhpcy53cmFwLCB6LCB4ICsgMSwgeSksXG4gICAgICAgICAgICBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh6LCB0aGlzLndyYXAsIHosIHgsIHkgKyAxKSxcbiAgICAgICAgICAgIG5ldyBPdmVyc2NhbGVkVGlsZUlEKHosIHRoaXMud3JhcCwgeiwgeCArIDEsIHkgKyAxKVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIGlzTGVzc1RoYW4ocmhzICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLndyYXAgPCByaHMud3JhcCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh0aGlzLndyYXAgPiByaHMud3JhcCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLm92ZXJzY2FsZWRaIDwgcmhzLm92ZXJzY2FsZWRaKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMub3ZlcnNjYWxlZFogPiByaHMub3ZlcnNjYWxlZFopIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5jYW5vbmljYWwueCA8IHJocy5jYW5vbmljYWwueCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh0aGlzLmNhbm9uaWNhbC54ID4gcmhzLmNhbm9uaWNhbC54KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuY2Fub25pY2FsLnkgPCByaHMuY2Fub25pY2FsLnkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgd3JhcHBlZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPdmVyc2NhbGVkVGlsZUlEKHRoaXMub3ZlcnNjYWxlZFosIDAsIHRoaXMuY2Fub25pY2FsLnosIHRoaXMuY2Fub25pY2FsLngsIHRoaXMuY2Fub25pY2FsLnkpO1xuICAgIH1cblxuICAgIG92ZXJzY2FsZUZhY3RvcigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucG93KDIsIHRoaXMub3ZlcnNjYWxlZFogLSB0aGlzLmNhbm9uaWNhbC56KTtcbiAgICB9XG5cbiAgICB0b1Vud3JhcHBlZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVbndyYXBwZWRUaWxlSUQodGhpcy53cmFwLCB0aGlzLmNhbm9uaWNhbCk7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLm92ZXJzY2FsZWRafS8ke3RoaXMuY2Fub25pY2FsLnh9LyR7dGhpcy5jYW5vbmljYWwueX1gO1xuICAgIH1cblxuICAgIHRvQ29vcmRpbmF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb29yZGluYXRlKHRoaXMuY2Fub25pY2FsLnggKyBNYXRoLnBvdygyLCB0aGlzLndyYXApLCB0aGlzLmNhbm9uaWNhbC55LCB0aGlzLmNhbm9uaWNhbC56KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZUtleSh3cmFwICAgICAgICAsIHogICAgICAgICwgeCAgICAgICAgLCB5ICAgICAgICApIHtcbiAgICB3cmFwICo9IDI7XG4gICAgaWYgKHdyYXAgPCAwKSB3cmFwID0gd3JhcCAqIC0xIC0gMTtcbiAgICBjb25zdCBkaW0gPSAxIDw8IHo7XG4gICAgcmV0dXJuICgoZGltICogZGltICogd3JhcCArIGRpbSAqIHkgKyB4KSAqIDMyKSArIHo7XG59XG5cblxuZnVuY3Rpb24gZ2V0UXVhZGtleSh6LCB4LCB5KSB7XG4gICAgbGV0IHF1YWRrZXkgPSAnJywgbWFzaztcbiAgICBmb3IgKGxldCBpID0gejsgaSA+IDA7IGktLSkge1xuICAgICAgICBtYXNrID0gMSA8PCAoaSAtIDEpO1xuICAgICAgICBxdWFka2V5ICs9ICgoeCAmIG1hc2sgPyAxIDogMCkgKyAoeSAmIG1hc2sgPyAyIDogMCkpO1xuICAgIH1cbiAgICByZXR1cm4gcXVhZGtleTtcbn1cblxucmVnaXN0ZXIoJ0Nhbm9uaWNhbFRpbGVJRCcsIENhbm9uaWNhbFRpbGVJRCk7XG5yZWdpc3RlcignT3ZlcnNjYWxlZFRpbGVJRCcsIE92ZXJzY2FsZWRUaWxlSUQsIHtvbWl0OiBbJ3Bvc01hdHJpeCddfSk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIENhbm9uaWNhbFRpbGVJRDogQ2Fub25pY2FsVGlsZUlELFxuICAgIE92ZXJzY2FsZWRUaWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsXG4gICAgVW53cmFwcGVkVGlsZUlEOiBVbndyYXBwZWRUaWxlSURcbn07XG4iLCIvLyAgICAgIFxuXG5jb25zdCBFdmVudGVkID0gcmVxdWlyZSgnLi4vdXRpbC9ldmVudGVkJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5jb25zdCBsb2FkVGlsZUpTT04gPSByZXF1aXJlKCcuL2xvYWRfdGlsZWpzb24nKTtcbmNvbnN0IG5vcm1hbGl6ZVVSTCA9IHJlcXVpcmUoJy4uL3V0aWwvbWFwYm94Jykubm9ybWFsaXplVGlsZVVSTDtcbmNvbnN0IFRpbGVCb3VuZHMgPSByZXF1aXJlKCcuL3RpbGVfYm91bmRzJyk7XG5jb25zdCBSZXNvdXJjZVR5cGUgPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKS5SZXNvdXJjZVR5cGU7XG5jb25zdCBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuY2xhc3MgVmVjdG9yVGlsZVNvdXJjZSBleHRlbmRzIEV2ZW50ZWQgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGlkICAgICAgICAsIG9wdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgZGlzcGF0Y2hlciAgICAgICAgICAgICwgZXZlbnRlZFBhcmVudCAgICAgICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7XG5cbiAgICAgICAgdGhpcy50eXBlID0gJ3ZlY3Rvcic7XG4gICAgICAgIHRoaXMubWluem9vbSA9IDA7XG4gICAgICAgIHRoaXMubWF4em9vbSA9IDIyO1xuICAgICAgICB0aGlzLnNjaGVtZSA9ICd4eXonO1xuICAgICAgICB0aGlzLnRpbGVTaXplID0gNTEyO1xuICAgICAgICB0aGlzLnJlcGFyc2VPdmVyc2NhbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc1RpbGVDbGlwcGVkID0gdHJ1ZTtcblxuICAgICAgICB1dGlsLmV4dGVuZCh0aGlzLCB1dGlsLnBpY2sob3B0aW9ucywgWyd1cmwnLCAnc2NoZW1lJywgJ3RpbGVTaXplJ10pKTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHsgdHlwZTogJ3ZlY3RvcicgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5fY29sbGVjdFJlc291cmNlVGltaW5nID0gb3B0aW9ucy5jb2xsZWN0UmVzb3VyY2VUaW1pbmc7XG5cbiAgICAgICAgaWYgKHRoaXMudGlsZVNpemUgIT09IDUxMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZWN0b3IgdGlsZSBzb3VyY2VzIG11c3QgaGF2ZSBhIHRpbGVTaXplIG9mIDUxMicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRFdmVudGVkUGFyZW50KGV2ZW50ZWRQYXJlbnQpO1xuICAgIH1cblxuICAgIGxvYWQoKSB7XG4gICAgICAgIHRoaXMuZmlyZSgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnfSk7XG5cbiAgICAgICAgbG9hZFRpbGVKU09OKHRoaXMuX29wdGlvbnMsIHRoaXMubWFwLl90cmFuc2Zvcm1SZXF1ZXN0LCAoZXJyLCB0aWxlSlNPTikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxlSlNPTikge1xuICAgICAgICAgICAgICAgIHV0aWwuZXh0ZW5kKHRoaXMsIHRpbGVKU09OKTtcbiAgICAgICAgICAgICAgICBpZiAodGlsZUpTT04uYm91bmRzKSB0aGlzLnRpbGVCb3VuZHMgPSBuZXcgVGlsZUJvdW5kcyh0aWxlSlNPTi5ib3VuZHMsIHRoaXMubWluem9vbSwgdGhpcy5tYXh6b29tKTtcblxuICAgICAgICAgICAgICAgIC8vIGBjb250ZW50YCBpcyBpbmNsdWRlZCBoZXJlIHRvIHByZXZlbnQgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSBgU3R5bGUjX3VwZGF0ZVNvdXJjZXNgIGlzIGNhbGxlZFxuICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgVGlsZUpTT04gYXJyaXZlcy4gdGhpcyBtYWtlcyBzdXJlIHRoZSB0aWxlcyBuZWVkZWQgYXJlIGxvYWRlZCBvbmNlIFRpbGVKU09OIGFycml2ZXNcbiAgICAgICAgICAgICAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL3B1bGwvNDM0NyNkaXNjdXNzaW9uX3IxMDQ0MTgwODhcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ21ldGFkYXRhJ30pO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgnZGF0YScsIHtkYXRhVHlwZTogJ3NvdXJjZScsIHNvdXJjZURhdGFUeXBlOiAnY29udGVudCd9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaGFzVGlsZSh0aWxlSUQgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnRpbGVCb3VuZHMgfHwgdGhpcy50aWxlQm91bmRzLmNvbnRhaW5zKHRpbGVJRC5jYW5vbmljYWwpO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcCAgICAgKSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiB1dGlsLmV4dGVuZCh7fSwgdGhpcy5fb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgbG9hZFRpbGUodGlsZSAgICAgICwgY2FsbGJhY2sgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG92ZXJzY2FsaW5nID0gdGlsZS50aWxlSUQub3ZlcnNjYWxlRmFjdG9yKCk7XG4gICAgICAgIGNvbnN0IHVybCA9IG5vcm1hbGl6ZVVSTCh0aWxlLnRpbGVJRC5jYW5vbmljYWwudXJsKHRoaXMudGlsZXMsIHRoaXMuc2NoZW1lKSwgdGhpcy51cmwpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgICByZXF1ZXN0OiB0aGlzLm1hcC5fdHJhbnNmb3JtUmVxdWVzdCh1cmwsIFJlc291cmNlVHlwZS5UaWxlKSxcbiAgICAgICAgICAgIHVpZDogdGlsZS51aWQsXG4gICAgICAgICAgICB0aWxlSUQ6IHRpbGUudGlsZUlELFxuICAgICAgICAgICAgem9vbTogdGlsZS50aWxlSUQub3ZlcnNjYWxlZFosXG4gICAgICAgICAgICB0aWxlU2l6ZTogdGhpcy50aWxlU2l6ZSAqIG92ZXJzY2FsaW5nLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgc291cmNlOiB0aGlzLmlkLFxuICAgICAgICAgICAgcGl4ZWxSYXRpbzogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgICAgb3ZlcnNjYWxpbmc6IG92ZXJzY2FsaW5nLFxuICAgICAgICAgICAgc2hvd0NvbGxpc2lvbkJveGVzOiB0aGlzLm1hcC5zaG93Q29sbGlzaW9uQm94ZXMsXG4gICAgICAgIH07XG4gICAgICAgIHBhcmFtcy5yZXF1ZXN0LmNvbGxlY3RSZXNvdXJjZVRpbWluZyA9IHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZztcblxuICAgICAgICBpZiAodGlsZS53b3JrZXJJRCA9PT0gdW5kZWZpbmVkIHx8IHRpbGUuc3RhdGUgPT09ICdleHBpcmVkJykge1xuICAgICAgICAgICAgdGlsZS53b3JrZXJJRCA9IHRoaXMuZGlzcGF0Y2hlci5zZW5kKCdsb2FkVGlsZScsIHBhcmFtcywgZG9uZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aWxlLnN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAgICAgICAgIC8vIHNjaGVkdWxlIHRpbGUgcmVsb2FkaW5nIGFmdGVyIGl0IGhhcyBiZWVuIGxvYWRlZFxuICAgICAgICAgICAgdGlsZS5yZWxvYWRDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ3JlbG9hZFRpbGUnLCBwYXJhbXMsIGRvbmUuYmluZCh0aGlzKSwgdGlsZS53b3JrZXJJRCk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBkb25lKGVyciwgZGF0YSkge1xuICAgICAgICAgICAgaWYgKHRpbGUuYWJvcnRlZClcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG5cbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5yZXNvdXJjZVRpbWluZylcbiAgICAgICAgICAgICAgICB0aWxlLnJlc291cmNlVGltaW5nID0gZGF0YS5yZXNvdXJjZVRpbWluZztcblxuICAgICAgICAgICAgaWYgKHRoaXMubWFwLl9yZWZyZXNoRXhwaXJlZFRpbGVzKSB0aWxlLnNldEV4cGlyeURhdGEoZGF0YSk7XG4gICAgICAgICAgICB0aWxlLmxvYWRWZWN0b3JEYXRhKGRhdGEsIHRoaXMubWFwLnBhaW50ZXIpO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcblxuICAgICAgICAgICAgaWYgKHRpbGUucmVsb2FkQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRUaWxlKHRpbGUsIHRpbGUucmVsb2FkQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIHRpbGUucmVsb2FkQ2FsbGJhY2sgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWJvcnRUaWxlKHRpbGUgICAgICApIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ2Fib3J0VGlsZScsIHsgdWlkOiB0aWxlLnVpZCwgdHlwZTogdGhpcy50eXBlLCBzb3VyY2U6IHRoaXMuaWQgfSwgdW5kZWZpbmVkLCB0aWxlLndvcmtlcklEKTtcbiAgICB9XG5cbiAgICB1bmxvYWRUaWxlKHRpbGUgICAgICApIHtcbiAgICAgICAgdGlsZS51bmxvYWRWZWN0b3JEYXRhKCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5zZW5kKCdyZW1vdmVUaWxlJywgeyB1aWQ6IHRpbGUudWlkLCB0eXBlOiB0aGlzLnR5cGUsIHNvdXJjZTogdGhpcy5pZCB9LCB1bmRlZmluZWQsIHRpbGUud29ya2VySUQpO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZVNvdXJjZTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcbmNvbnN0IHZ0ID0gcmVxdWlyZSgnQG1hcGJveC92ZWN0b3ItdGlsZScpO1xuY29uc3QgUHJvdG9idWYgPSByZXF1aXJlKCdwYmYnKTtcbmNvbnN0IFdvcmtlclRpbGUgPSByZXF1aXJlKCcuL3dvcmtlcl90aWxlJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5jb25zdCBwZXJmID0gcmVxdWlyZSgnLi4vdXRpbC9wZXJmb3JtYW5jZScpO1xuXG4gICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgXG5cbi8qKlxuICogQGNhbGxiYWNrIExvYWRWZWN0b3JEYXRhQ2FsbGJhY2tcbiAqIEBwYXJhbSBlcnJvclxuICogQHBhcmFtIHZlY3RvclRpbGVcbiAqIEBwcml2YXRlXG4gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbG9hZFZlY3RvclRpbGUocGFyYW1zICAgICAgICAgICAgICAgICAgICAgICwgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICBjb25zdCB4aHIgPSBhamF4LmdldEFycmF5QnVmZmVyKHBhcmFtcy5yZXF1ZXN0LCAoZXJyLCByZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICAgICAgICAgICAgdmVjdG9yVGlsZTogbmV3IHZ0LlZlY3RvclRpbGUobmV3IFByb3RvYnVmKHJlc3BvbnNlLmRhdGEpKSxcbiAgICAgICAgICAgICAgICByYXdEYXRhOiByZXNwb25zZS5kYXRhLFxuICAgICAgICAgICAgICAgIGNhY2hlQ29udHJvbDogcmVzcG9uc2UuY2FjaGVDb250cm9sLFxuICAgICAgICAgICAgICAgIGV4cGlyZXM6IHJlc3BvbnNlLmV4cGlyZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgeGhyLmFib3J0KCk7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBUaGUge0BsaW5rIFdvcmtlclNvdXJjZX0gaW1wbGVtZW50YXRpb24gdGhhdCBzdXBwb3J0cyB7QGxpbmsgVmVjdG9yVGlsZVNvdXJjZX0uXG4gKiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGJlIGVhc2lseSByZXVzZWQgdG8gc3VwcG9ydCBjdXN0b20gc291cmNlIHR5cGVzXG4gKiBmb3IgZGF0YSBmb3JtYXRzIHRoYXQgY2FuIGJlIHBhcnNlZC9jb252ZXJ0ZWQgaW50byBhbiBpbi1tZW1vcnkgVmVjdG9yVGlsZVxuICogcmVwcmVzZW50YXRpb24uICBUbyBkbyBzbywgY3JlYXRlIGl0IHdpdGhcbiAqIGBuZXcgVmVjdG9yVGlsZVdvcmtlclNvdXJjZShhY3Rvciwgc3R5bGVMYXllcnMsIGN1c3RvbUxvYWRWZWN0b3JEYXRhRnVuY3Rpb24pYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBWZWN0b3JUaWxlV29ya2VyU291cmNlICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIFtsb2FkVmVjdG9yRGF0YV0gT3B0aW9uYWwgbWV0aG9kIGZvciBjdXN0b20gbG9hZGluZyBvZiBhIFZlY3RvclRpbGVcbiAgICAgKiBvYmplY3QgYmFzZWQgb24gcGFyYW1ldGVycyBwYXNzZWQgZnJvbSB0aGUgbWFpbi10aHJlYWQgU291cmNlLiBTZWVcbiAgICAgKiB7QGxpbmsgVmVjdG9yVGlsZVdvcmtlclNvdXJjZSNsb2FkVGlsZX0uIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseVxuICAgICAqIGxvYWRzIHRoZSBwYmYgYXQgYHBhcmFtcy51cmxgLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGFjdG9yICAgICAgICwgbGF5ZXJJbmRleCAgICAgICAgICAgICAgICAgLCBsb2FkVmVjdG9yRGF0YSAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuYWN0b3IgPSBhY3RvcjtcbiAgICAgICAgdGhpcy5sYXllckluZGV4ID0gbGF5ZXJJbmRleDtcbiAgICAgICAgdGhpcy5sb2FkVmVjdG9yRGF0YSA9IGxvYWRWZWN0b3JEYXRhIHx8IGxvYWRWZWN0b3JUaWxlO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB7fTtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbXBsZW1lbnRzIHtAbGluayBXb3JrZXJTb3VyY2UjbG9hZFRpbGV9LiBEZWxlZ2F0ZXMgdG9cbiAgICAgKiB7QGxpbmsgVmVjdG9yVGlsZVdvcmtlclNvdXJjZSNsb2FkVmVjdG9yRGF0YX0gKHdoaWNoIGJ5IGRlZmF1bHQgZXhwZWN0c1xuICAgICAqIGEgYHBhcmFtcy51cmxgIHByb3BlcnR5KSBmb3IgZmV0Y2hpbmcgYW5kIHByb2R1Y2luZyBhIFZlY3RvclRpbGUgb2JqZWN0LlxuICAgICAqL1xuICAgIGxvYWRUaWxlKHBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAsIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gcGFyYW1zLnNvdXJjZSxcbiAgICAgICAgICAgIHVpZCA9IHBhcmFtcy51aWQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLmxvYWRpbmdbc291cmNlXSlcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1tzb3VyY2VdID0ge307XG5cbiAgICAgICAgY29uc3Qgd29ya2VyVGlsZSA9IHRoaXMubG9hZGluZ1tzb3VyY2VdW3VpZF0gPSBuZXcgV29ya2VyVGlsZShwYXJhbXMpO1xuICAgICAgICB3b3JrZXJUaWxlLmFib3J0ID0gdGhpcy5sb2FkVmVjdG9yRGF0YShwYXJhbXMsIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5sb2FkaW5nW3NvdXJjZV1bdWlkXTtcblxuICAgICAgICAgICAgaWYgKGVyciB8fCAhcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmF3VGlsZURhdGEgPSByZXNwb25zZS5yYXdEYXRhO1xuICAgICAgICAgICAgY29uc3QgY2FjaGVDb250cm9sID0ge307XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuZXhwaXJlcykgY2FjaGVDb250cm9sLmV4cGlyZXMgPSByZXNwb25zZS5leHBpcmVzO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmNhY2hlQ29udHJvbCkgY2FjaGVDb250cm9sLmNhY2hlQ29udHJvbCA9IHJlc3BvbnNlLmNhY2hlQ29udHJvbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc291cmNlVGltaW5nID0ge307XG4gICAgICAgICAgICBpZiAocGFyYW1zLnJlcXVlc3QgJiYgcGFyYW1zLnJlcXVlc3QuY29sbGVjdFJlc291cmNlVGltaW5nKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VUaW1pbmdEYXRhID0gcGVyZi5nZXRFbnRyaWVzQnlOYW1lKHBhcmFtcy5yZXF1ZXN0LnVybCk7XG4gICAgICAgICAgICAgICAgLy8gaXQncyBuZWNlc3NhcnkgdG8gZXZhbCB0aGUgcmVzdWx0IG9mIGdldEVudHJpZXNCeU5hbWUoKSBoZXJlIHZpYSBwYXJzZS9zdHJpbmdpZnlcbiAgICAgICAgICAgICAgICAvLyBsYXRlIGV2YWx1YXRpb24gaW4gdGhlIG1haW4gdGhyZWFkIGNhdXNlcyBUeXBlRXJyb3I6IGlsbGVnYWwgaW52b2NhdGlvblxuICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZVRpbWluZ0RhdGEpXG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlVGltaW5nLnJlc291cmNlVGltaW5nID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXNvdXJjZVRpbWluZ0RhdGEpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd29ya2VyVGlsZS52ZWN0b3JUaWxlID0gcmVzcG9uc2UudmVjdG9yVGlsZTtcbiAgICAgICAgICAgIHdvcmtlclRpbGUucGFyc2UocmVzcG9uc2UudmVjdG9yVGlsZSwgdGhpcy5sYXllckluZGV4LCB0aGlzLmFjdG9yLCAoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyIHx8ICFyZXN1bHQpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuXG4gICAgICAgICAgICAgICAgLy8gVHJhbnNmZXJyaW5nIGEgY29weSBvZiByYXdUaWxlRGF0YSBiZWNhdXNlIHRoZSB3b3JrZXIgbmVlZHMgdG8gcmV0YWluIGl0cyBjb3B5LlxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHV0aWwuZXh0ZW5kKHtyYXdUaWxlRGF0YTogcmF3VGlsZURhdGEuc2xpY2UoMCl9LCByZXN1bHQsIGNhY2hlQ29udHJvbCwgcmVzb3VyY2VUaW1pbmcpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmxvYWRlZFtzb3VyY2VdID0gdGhpcy5sb2FkZWRbc291cmNlXSB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMubG9hZGVkW3NvdXJjZV1bdWlkXSA9IHdvcmtlclRpbGU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudHMge0BsaW5rIFdvcmtlclNvdXJjZSNyZWxvYWRUaWxlfS5cbiAgICAgKi9cbiAgICByZWxvYWRUaWxlKHBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAsIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgY29uc3QgbG9hZGVkID0gdGhpcy5sb2FkZWRbcGFyYW1zLnNvdXJjZV0sXG4gICAgICAgICAgICB1aWQgPSBwYXJhbXMudWlkLFxuICAgICAgICAgICAgdnRTb3VyY2UgPSB0aGlzO1xuICAgICAgICBpZiAobG9hZGVkICYmIGxvYWRlZFt1aWRdKSB7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXJUaWxlID0gbG9hZGVkW3VpZF07XG4gICAgICAgICAgICB3b3JrZXJUaWxlLnNob3dDb2xsaXNpb25Cb3hlcyA9IHBhcmFtcy5zaG93Q29sbGlzaW9uQm94ZXM7XG5cbiAgICAgICAgICAgIGlmICh3b3JrZXJUaWxlLnN0YXR1cyA9PT0gJ3BhcnNpbmcnKSB7XG4gICAgICAgICAgICAgICAgd29ya2VyVGlsZS5yZWxvYWRDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh3b3JrZXJUaWxlLnN0YXR1cyA9PT0gJ2RvbmUnKSB7XG4gICAgICAgICAgICAgICAgd29ya2VyVGlsZS5wYXJzZSh3b3JrZXJUaWxlLnZlY3RvclRpbGUsIHRoaXMubGF5ZXJJbmRleCwgdGhpcy5hY3RvciwgZG9uZS5iaW5kKHdvcmtlclRpbGUpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZG9uZShlcnIsIGRhdGEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlbG9hZENhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVsb2FkQ2FsbGJhY2sgPSB0aGlzLnJlbG9hZENhbGxiYWNrO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJlbG9hZENhbGxiYWNrO1xuICAgICAgICAgICAgICAgIHRoaXMucGFyc2UodGhpcy52ZWN0b3JUaWxlLCB2dFNvdXJjZS5sYXllckluZGV4LCB2dFNvdXJjZS5hY3RvciwgcmVsb2FkQ2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYWxsYmFjayhlcnIsIGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50cyB7QGxpbmsgV29ya2VyU291cmNlI2Fib3J0VGlsZX0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW1zXG4gICAgICogQHBhcmFtIHBhcmFtcy5zb3VyY2UgVGhlIGlkIG9mIHRoZSBzb3VyY2UgZm9yIHdoaWNoIHdlJ3JlIGxvYWRpbmcgdGhpcyB0aWxlLlxuICAgICAqIEBwYXJhbSBwYXJhbXMudWlkIFRoZSBVSUQgZm9yIHRoaXMgdGlsZS5cbiAgICAgKi9cbiAgICBhYm9ydFRpbGUocGFyYW1zICAgICAgICAgICAgICAgICwgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCBsb2FkaW5nID0gdGhpcy5sb2FkaW5nW3BhcmFtcy5zb3VyY2VdLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcbiAgICAgICAgaWYgKGxvYWRpbmcgJiYgbG9hZGluZ1t1aWRdICYmIGxvYWRpbmdbdWlkXS5hYm9ydCkge1xuICAgICAgICAgICAgbG9hZGluZ1t1aWRdLmFib3J0KCk7XG4gICAgICAgICAgICBkZWxldGUgbG9hZGluZ1t1aWRdO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50cyB7QGxpbmsgV29ya2VyU291cmNlI3JlbW92ZVRpbGV9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqIEBwYXJhbSBwYXJhbXMuc291cmNlIFRoZSBpZCBvZiB0aGUgc291cmNlIGZvciB3aGljaCB3ZSdyZSBsb2FkaW5nIHRoaXMgdGlsZS5cbiAgICAgKiBAcGFyYW0gcGFyYW1zLnVpZCBUaGUgVUlEIGZvciB0aGlzIHRpbGUuXG4gICAgICovXG4gICAgcmVtb3ZlVGlsZShwYXJhbXMgICAgICAgICAgICAgICAgLCBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGxvYWRlZCA9IHRoaXMubG9hZGVkW3BhcmFtcy5zb3VyY2VdLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcbiAgICAgICAgaWYgKGxvYWRlZCAmJiBsb2FkZWRbdWlkXSkge1xuICAgICAgICAgICAgZGVsZXRlIGxvYWRlZFt1aWRdO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVXb3JrZXJTb3VyY2U7XG4iLCIvLyAgICAgIFxuXG5jb25zdCBhamF4ID0gcmVxdWlyZSgnLi4vdXRpbC9hamF4Jyk7XG5jb25zdCBJbWFnZVNvdXJjZSA9IHJlcXVpcmUoJy4vaW1hZ2Vfc291cmNlJyk7XG5jb25zdCByYXN0ZXJCb3VuZHNBdHRyaWJ1dGVzID0gcmVxdWlyZSgnLi4vZGF0YS9yYXN0ZXJfYm91bmRzX2F0dHJpYnV0ZXMnKTtcbmNvbnN0IFZlcnRleEFycmF5T2JqZWN0ID0gcmVxdWlyZSgnLi4vcmVuZGVyL3ZlcnRleF9hcnJheV9vYmplY3QnKTtcbmNvbnN0IFRleHR1cmUgPSByZXF1aXJlKCcuLi9yZW5kZXIvdGV4dHVyZScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuLyoqXG4gKiBBIGRhdGEgc291cmNlIGNvbnRhaW5pbmcgdmlkZW8uXG4gKiAoU2VlIHRoZSBbU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jc291cmNlcy12aWRlbykgZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb2Ygb3B0aW9ucy4pXG4gKiBAaW50ZXJmYWNlIFZpZGVvU291cmNlXG4gKiBAZXhhbXBsZVxuICogLy8gYWRkIHRvIG1hcFxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgIHR5cGU6ICd2aWRlbycsXG4gKiAgICB1cmw6IFtcbiAqICAgICAgICAnaHR0cHM6Ly93d3cubWFwYm94LmNvbS9ibG9nL2Fzc2V0cy9iYWx0aW1vcmUtc21va2UubXA0JyxcbiAqICAgICAgICAnaHR0cHM6Ly93d3cubWFwYm94LmNvbS9ibG9nL2Fzc2V0cy9iYWx0aW1vcmUtc21va2Uud2VibSdcbiAqICAgIF0sXG4gKiAgICBjb29yZGluYXRlczogW1xuICogICAgICAgIFstNzYuNTQsIDM5LjE4XSxcbiAqICAgICAgICBbLTc2LjUyLCAzOS4xOF0sXG4gKiAgICAgICAgWy03Ni41MiwgMzkuMTddLFxuICogICAgICAgIFstNzYuNTQsIDM5LjE3XVxuICogICAgXVxuICogfSk7XG4gKlxuICogLy8gdXBkYXRlXG4gKiB2YXIgbXlTb3VyY2UgPSBtYXAuZ2V0U291cmNlKCdzb21lIGlkJyk7XG4gKiBteVNvdXJjZS5zZXRDb29yZGluYXRlcyhbXG4gKiAgICAgWy03Ni41NDMzNTczNzIyODM5NCwgMzkuMTg1Nzk5MDcyMjk3NDhdLFxuICogICAgIFstNzYuNTI4MDM2NTk0MzkwODcsIDM5LjE4MzgzNjQ4NDc1ODddLFxuICogICAgIFstNzYuNTI5NTM4NjMxNDM5MiwgMzkuMTc2ODMzOTI1MDc2MDZdLFxuICogICAgIFstNzYuNTQ1MjAyNzMyMDg2MTgsIDM5LjE3ODc2MzQ0MTA2NjQyXVxuICogXSk7XG4gKlxuICogbWFwLnJlbW92ZVNvdXJjZSgnc29tZSBpZCcpOyAgLy8gcmVtb3ZlXG4gKiBAc2VlIFtBZGQgYSB2aWRlb10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS92aWRlby1vbi1hLW1hcC8pXG4gKi9cbmNsYXNzIFZpZGVvU291cmNlIGV4dGVuZHMgSW1hZ2VTb3VyY2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGlkICAgICAgICAsIG9wdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICwgZGlzcGF0Y2hlciAgICAgICAgICAgICwgZXZlbnRlZFBhcmVudCAgICAgICAgICkge1xuICAgICAgICBzdXBlcihpZCwgb3B0aW9ucywgZGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudCk7XG4gICAgICAgIHRoaXMucm91bmRab29tID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50eXBlID0gJ3ZpZGVvJztcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICB0aGlzLnVybHMgPSBvcHRpb25zLnVybHM7XG5cbiAgICAgICAgYWpheC5nZXRWaWRlbyhvcHRpb25zLnVybHMsIChlcnIsIHZpZGVvKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKCdlcnJvcicsIHtlcnJvcjogZXJyfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZpZGVvKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlbyA9IHZpZGVvO1xuICAgICAgICAgICAgICAgIHRoaXMudmlkZW8ubG9vcCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAvLyBTdGFydCByZXBhaW50aW5nIHdoZW4gdmlkZW8gc3RhcnRzIHBsYXlpbmcuIGhhc1RyYW5zaXRpb24oKSB3aWxsIHRoZW4gcmV0dXJuXG4gICAgICAgICAgICAgICAgLy8gdHJ1ZSB0byB0cmlnZ2VyIGFkZGl0aW9uYWwgZnJhbWVzIGFzIGxvbmcgYXMgdGhlIHZpZGVvcyBjb250aW51ZXMgcGxheWluZy5cbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXlpbmcnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwLl9yZXJlbmRlcigpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlkZW8ucGxheSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmlzaExvYWRpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgSFRNTCBgdmlkZW9gIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7SFRNTFZpZGVvRWxlbWVudH0gVGhlIEhUTUwgYHZpZGVvYCBlbGVtZW50LlxuICAgICAqL1xuICAgIGdldFZpZGVvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWRlbztcbiAgICB9XG5cbiAgICBvbkFkZChtYXAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5tYXApIHJldHVybjtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMubG9hZCgpO1xuICAgICAgICBpZiAodGhpcy52aWRlbykge1xuICAgICAgICAgICAgdGhpcy52aWRlby5wbGF5KCk7XG4gICAgICAgICAgICB0aGlzLnNldENvb3JkaW5hdGVzKHRoaXMuY29vcmRpbmF0ZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmlkZW8ncyBjb29yZGluYXRlcyBhbmQgcmUtcmVuZGVycyB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQG1ldGhvZCBzZXRDb29yZGluYXRlc1xuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBWaWRlb1NvdXJjZVxuICAgICAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8bnVtYmVyPj59IGNvb3JkaW5hdGVzIEZvdXIgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzLFxuICAgICAqICAgcmVwcmVzZW50ZWQgYXMgYXJyYXlzIG9mIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgbnVtYmVycywgd2hpY2ggZGVmaW5lIHRoZSBjb3JuZXJzIG9mIHRoZSB2aWRlby5cbiAgICAgKiAgIFRoZSBjb29yZGluYXRlcyBzdGFydCBhdCB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSB2aWRlbyBhbmQgcHJvY2VlZCBpbiBjbG9ja3dpc2Ugb3JkZXIuXG4gICAgICogICBUaGV5IGRvIG5vdCBoYXZlIHRvIHJlcHJlc2VudCBhIHJlY3RhbmdsZS5cbiAgICAgKiBAcmV0dXJucyB7VmlkZW9Tb3VyY2V9IHRoaXNcbiAgICAgKi9cbiAgICAvLyBzZXRDb29yZGluYXRlcyBpbmhlcml0ZWQgZnJvbSBJbWFnZVNvdXJjZVxuXG4gICAgcHJlcGFyZSgpIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMudGlsZXMpLmxlbmd0aCA9PT0gMCB8fCB0aGlzLnZpZGVvLnJlYWR5U3RhdGUgPCAyKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIG5vdCBlbm91Z2ggZGF0YSBmb3IgY3VycmVudCBwb3NpdGlvblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMubWFwLnBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIGlmICghdGhpcy5ib3VuZHNCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzQnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5fYm91bmRzQXJyYXksIHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYm91bmRzVkFPKSB7XG4gICAgICAgICAgICB0aGlzLmJvdW5kc1ZBTyA9IG5ldyBWZXJ0ZXhBcnJheU9iamVjdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIHRoaXMudmlkZW8sIGdsLlJHQkEpO1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy52aWRlby5wYXVzZWQpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICBnbC50ZXhTdWJJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIDAsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHRoaXMudmlkZW8pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB3IGluIHRoaXMudGlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLnRpbGVzW3ddO1xuICAgICAgICAgICAgaWYgKHRpbGUuc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdsb2FkZWQnO1xuICAgICAgICAgICAgICAgIHRpbGUudGV4dHVyZSA9IHRoaXMudGV4dHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICd2aWRlbycsXG4gICAgICAgICAgICB1cmxzOiB0aGlzLnVybHMsXG4gICAgICAgICAgICBjb29yZGluYXRlczogdGhpcy5jb29yZGluYXRlc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZGVvICYmICF0aGlzLnZpZGVvLnBhdXNlZDtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVmlkZW9Tb3VyY2U7XG4iLCIvLyAgICAgIFxuXG5jb25zdCBBY3RvciA9IHJlcXVpcmUoJy4uL3V0aWwvYWN0b3InKTtcbmNvbnN0IFN0eWxlTGF5ZXJJbmRleCA9IHJlcXVpcmUoJy4uL3N0eWxlL3N0eWxlX2xheWVyX2luZGV4Jyk7XG5cbmNvbnN0IFZlY3RvclRpbGVXb3JrZXJTb3VyY2UgPSByZXF1aXJlKCcuL3ZlY3Rvcl90aWxlX3dvcmtlcl9zb3VyY2UnKTtcbmNvbnN0IFJhc3RlckRFTVRpbGVXb3JrZXJTb3VyY2UgPSByZXF1aXJlKCcuL3Jhc3Rlcl9kZW1fdGlsZV93b3JrZXJfc291cmNlJyk7XG5jb25zdCBHZW9KU09OV29ya2VyU291cmNlID0gcmVxdWlyZSgnLi9nZW9qc29uX3dvcmtlcl9zb3VyY2UnKTtcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuXG5jb25zdCBnbG9iYWxSVExUZXh0UGx1Z2luID0gcmVxdWlyZSgnLi9ydGxfdGV4dF9wbHVnaW4nKTtcblxuICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgV29ya2VyIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3Ioc2VsZiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5zZWxmID0gc2VsZjtcbiAgICAgICAgdGhpcy5hY3RvciA9IG5ldyBBY3RvcihzZWxmLCB0aGlzKTtcblxuICAgICAgICB0aGlzLmxheWVySW5kZXhlcyA9IHt9O1xuXG4gICAgICAgIHRoaXMud29ya2VyU291cmNlVHlwZXMgPSB7XG4gICAgICAgICAgICB2ZWN0b3I6IFZlY3RvclRpbGVXb3JrZXJTb3VyY2UsXG4gICAgICAgICAgICBnZW9qc29uOiBHZW9KU09OV29ya2VyU291cmNlXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gW21hcElkXVtzb3VyY2VUeXBlXSA9PiB3b3JrZXIgc291cmNlIGluc3RhbmNlXG4gICAgICAgIHRoaXMud29ya2VyU291cmNlcyA9IHt9O1xuICAgICAgICB0aGlzLmRlbVdvcmtlclNvdXJjZXMgPSB7fTtcblxuICAgICAgICB0aGlzLnNlbGYucmVnaXN0ZXJXb3JrZXJTb3VyY2UgPSAobmFtZSAgICAgICAgLCBXb3JrZXJTb3VyY2UgICAgICAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLndvcmtlclNvdXJjZVR5cGVzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXb3JrZXIgc291cmNlIHdpdGggbmFtZSBcIiR7bmFtZX1cIiBhbHJlYWR5IHJlZ2lzdGVyZWQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLndvcmtlclNvdXJjZVR5cGVzW25hbWVdID0gV29ya2VyU291cmNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc2VsZi5yZWdpc3RlclJUTFRleHRQbHVnaW4gPSAocnRsVGV4dFBsdWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICBpZiAoZ2xvYmFsUlRMVGV4dFBsdWdpbi5hcHBseUFyYWJpY1NoYXBpbmcgfHwgZ2xvYmFsUlRMVGV4dFBsdWdpbi5wcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JUTCB0ZXh0IHBsdWdpbiBhbHJlYWR5IHJlZ2lzdGVyZWQuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnbG9iYWxSVExUZXh0UGx1Z2luWydhcHBseUFyYWJpY1NoYXBpbmcnXSA9IHJ0bFRleHRQbHVnaW4uYXBwbHlBcmFiaWNTaGFwaW5nO1xuICAgICAgICAgICAgZ2xvYmFsUlRMVGV4dFBsdWdpblsncHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0J10gPSBydGxUZXh0UGx1Z2luLnByb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzZXRMYXllcnMobWFwSWQgICAgICAgICwgbGF5ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuZ2V0TGF5ZXJJbmRleChtYXBJZCkucmVwbGFjZShsYXllcnMpO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHVwZGF0ZUxheWVycyhtYXBJZCAgICAgICAgLCBwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuZ2V0TGF5ZXJJbmRleChtYXBJZCkudXBkYXRlKHBhcmFtcy5sYXllcnMsIHBhcmFtcy5yZW1vdmVkSWRzKTtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBsb2FkVGlsZShtYXBJZCAgICAgICAgLCBwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgYXNzZXJ0KHBhcmFtcy50eXBlKTtcbiAgICAgICAgdGhpcy5nZXRXb3JrZXJTb3VyY2UobWFwSWQsIHBhcmFtcy50eXBlKS5sb2FkVGlsZShwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBsb2FkREVNVGlsZShtYXBJZCAgICAgICAgLCBwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgLCBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuZ2V0REVNV29ya2VyU291cmNlKG1hcElkKS5sb2FkVGlsZShwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICByZWxvYWRUaWxlKG1hcElkICAgICAgICAsIHBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBhc3NlcnQocGFyYW1zLnR5cGUpO1xuICAgICAgICB0aGlzLmdldFdvcmtlclNvdXJjZShtYXBJZCwgcGFyYW1zLnR5cGUpLnJlbG9hZFRpbGUocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgYWJvcnRUaWxlKG1hcElkICAgICAgICAsIHBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBhc3NlcnQocGFyYW1zLnR5cGUpO1xuICAgICAgICB0aGlzLmdldFdvcmtlclNvdXJjZShtYXBJZCwgcGFyYW1zLnR5cGUpLmFib3J0VGlsZShwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICByZW1vdmVUaWxlKG1hcElkICAgICAgICAsIHBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBhc3NlcnQocGFyYW1zLnR5cGUpO1xuICAgICAgICB0aGlzLmdldFdvcmtlclNvdXJjZShtYXBJZCwgcGFyYW1zLnR5cGUpLnJlbW92ZVRpbGUocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcmVtb3ZlREVNVGlsZShtYXBJZCAgICAgICAgLCBwYXJhbXMgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuZ2V0REVNV29ya2VyU291cmNlKG1hcElkKS5yZW1vdmVUaWxlKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgcmVtb3ZlU291cmNlKG1hcElkICAgICAgICAsIHBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGFzc2VydChwYXJhbXMudHlwZSk7XG4gICAgICAgIGNvbnN0IHdvcmtlciA9IHRoaXMuZ2V0V29ya2VyU291cmNlKG1hcElkLCBwYXJhbXMudHlwZSk7XG4gICAgICAgIGlmICh3b3JrZXIucmVtb3ZlU291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdvcmtlci5yZW1vdmVTb3VyY2UocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhIHtAbGluayBXb3JrZXJTb3VyY2V9IHNjcmlwdCBhdCBwYXJhbXMudXJsLiAgVGhlIHNjcmlwdCBpcyBydW5cbiAgICAgKiAodXNpbmcgaW1wb3J0U2NyaXB0cykgd2l0aCBgcmVnaXN0ZXJXb3JrZXJTb3VyY2VgIGluIHNjb3BlLCB3aGljaCBpcyBhXG4gICAgICogZnVuY3Rpb24gdGFraW5nIGAobmFtZSwgd29ya2VyU291cmNlT2JqZWN0KWAuXG4gICAgICogIEBwcml2YXRlXG4gICAgICovXG4gICAgbG9hZFdvcmtlclNvdXJjZShtYXAgICAgICAgICwgcGFyYW1zICAgICAgICAgICAgICAgICAsIGNhbGxiYWNrICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zZWxmLmltcG9ydFNjcmlwdHMocGFyYW1zLnVybCk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWRSVExUZXh0UGx1Z2luKG1hcCAgICAgICAgLCBwbHVnaW5VUkwgICAgICAgICwgY2FsbGJhY2sgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWdsb2JhbFJUTFRleHRQbHVnaW4uYXBwbHlBcmFiaWNTaGFwaW5nICYmICFnbG9iYWxSVExUZXh0UGx1Z2luLnByb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZi5pbXBvcnRTY3JpcHRzKHBsdWdpblVSTCk7XG4gICAgICAgICAgICAgICAgaWYgKCFnbG9iYWxSVExUZXh0UGx1Z2luLmFwcGx5QXJhYmljU2hhcGluZyB8fCAhZ2xvYmFsUlRMVGV4dFBsdWdpbi5wcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKGBSVEwgVGV4dCBQbHVnaW4gZmFpbGVkIHRvIGltcG9ydCBzY3JpcHRzIGZyb20gJHtwbHVnaW5VUkx9YCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRMYXllckluZGV4KG1hcElkICAgICAgICApIHtcbiAgICAgICAgbGV0IGxheWVySW5kZXhlcyA9IHRoaXMubGF5ZXJJbmRleGVzW21hcElkXTtcbiAgICAgICAgaWYgKCFsYXllckluZGV4ZXMpIHtcbiAgICAgICAgICAgIGxheWVySW5kZXhlcyA9IHRoaXMubGF5ZXJJbmRleGVzW21hcElkXSA9IG5ldyBTdHlsZUxheWVySW5kZXgoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF5ZXJJbmRleGVzO1xuICAgIH1cblxuICAgIGdldFdvcmtlclNvdXJjZShtYXBJZCAgICAgICAgLCB0eXBlICAgICAgICApIHtcbiAgICAgICAgaWYgKCF0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdKVxuICAgICAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXSA9IHt9O1xuICAgICAgICBpZiAoIXRoaXMud29ya2VyU291cmNlc1ttYXBJZF1bdHlwZV0pIHtcbiAgICAgICAgICAgIC8vIHVzZSBhIHdyYXBwZWQgYWN0b3Igc28gdGhhdCB3ZSBjYW4gYXR0YWNoIGEgdGFyZ2V0IG1hcElkIHBhcmFtXG4gICAgICAgICAgICAvLyB0byBhbnkgbWVzc2FnZXMgaW52b2tlZCBieSB0aGUgV29ya2VyU291cmNlXG4gICAgICAgICAgICBjb25zdCBhY3RvciA9IHtcbiAgICAgICAgICAgICAgICBzZW5kOiAodHlwZSwgZGF0YSwgY2FsbGJhY2spID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rvci5zZW5kKHR5cGUsIGRhdGEsIGNhbGxiYWNrLCBtYXBJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXVt0eXBlXSA9IG5ldyAodGhpcy53b3JrZXJTb3VyY2VUeXBlc1t0eXBlXSAgICAgKSgoYWN0b3IgICAgICksIHRoaXMuZ2V0TGF5ZXJJbmRleChtYXBJZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMud29ya2VyU291cmNlc1ttYXBJZF1bdHlwZV07XG4gICAgfVxuXG4gICAgZ2V0REVNV29ya2VyU291cmNlKG1hcElkICAgICAgICApIHtcbiAgICAgICAgaWYgKCF0aGlzLmRlbVdvcmtlclNvdXJjZXNbbWFwSWRdKSB7XG4gICAgICAgICAgICB0aGlzLmRlbVdvcmtlclNvdXJjZXNbbWFwSWRdID0gbmV3IFJhc3RlckRFTVRpbGVXb3JrZXJTb3VyY2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmRlbVdvcmtlclNvdXJjZXNbbWFwSWRdO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjcmVhdGVXb3JrZXIoc2VsZiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICByZXR1cm4gbmV3IFdvcmtlcihzZWxmKTtcbn07XG4iLCIvLyAgICAgIFxuXG5jb25zdCBGZWF0dXJlSW5kZXggPSByZXF1aXJlKCcuLi9kYXRhL2ZlYXR1cmVfaW5kZXgnKTtcbmNvbnN0IHtwZXJmb3JtU3ltYm9sTGF5b3V0fSA9IHJlcXVpcmUoJy4uL3N5bWJvbC9zeW1ib2xfbGF5b3V0Jyk7XG5jb25zdCB7Q29sbGlzaW9uQm94QXJyYXl9ID0gcmVxdWlyZSgnLi4vZGF0YS9hcnJheV90eXBlcycpO1xuY29uc3QgRGljdGlvbmFyeUNvZGVyID0gcmVxdWlyZSgnLi4vdXRpbC9kaWN0aW9uYXJ5X2NvZGVyJyk7XG5jb25zdCBTeW1ib2xCdWNrZXQgPSByZXF1aXJlKCcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0Jyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcbmNvbnN0IHttYWtlSW1hZ2VBdGxhc30gPSByZXF1aXJlKCcuLi9yZW5kZXIvaW1hZ2VfYXRsYXMnKTtcbmNvbnN0IHttYWtlR2x5cGhBdGxhc30gPSByZXF1aXJlKCcuLi9yZW5kZXIvZ2x5cGhfYXRsYXMnKTtcbmNvbnN0IEV2YWx1YXRpb25QYXJhbWV0ZXJzID0gcmVxdWlyZSgnLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJyk7XG5jb25zdCB7T3ZlcnNjYWxlZFRpbGVJRH0gPSByZXF1aXJlKCcuL3RpbGVfaWQnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuY2xhc3MgV29ya2VyVGlsZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMudGlsZUlEID0gbmV3IE92ZXJzY2FsZWRUaWxlSUQocGFyYW1zLnRpbGVJRC5vdmVyc2NhbGVkWiwgcGFyYW1zLnRpbGVJRC53cmFwLCBwYXJhbXMudGlsZUlELmNhbm9uaWNhbC56LCBwYXJhbXMudGlsZUlELmNhbm9uaWNhbC54LCBwYXJhbXMudGlsZUlELmNhbm9uaWNhbC55KTtcbiAgICAgICAgdGhpcy51aWQgPSBwYXJhbXMudWlkO1xuICAgICAgICB0aGlzLnpvb20gPSBwYXJhbXMuem9vbTtcbiAgICAgICAgdGhpcy5waXhlbFJhdGlvID0gcGFyYW1zLnBpeGVsUmF0aW87XG4gICAgICAgIHRoaXMudGlsZVNpemUgPSBwYXJhbXMudGlsZVNpemU7XG4gICAgICAgIHRoaXMuc291cmNlID0gcGFyYW1zLnNvdXJjZTtcbiAgICAgICAgdGhpcy5vdmVyc2NhbGluZyA9IHBhcmFtcy5vdmVyc2NhbGluZztcbiAgICAgICAgdGhpcy5zaG93Q29sbGlzaW9uQm94ZXMgPSBwYXJhbXMuc2hvd0NvbGxpc2lvbkJveGVzO1xuICAgICAgICB0aGlzLmNvbGxlY3RSZXNvdXJjZVRpbWluZyA9ICEhcGFyYW1zLmNvbGxlY3RSZXNvdXJjZVRpbWluZztcbiAgICB9XG5cbiAgICBwYXJzZShkYXRhICAgICAgICAgICAgLCBsYXllckluZGV4ICAgICAgICAgICAgICAgICAsIGFjdG9yICAgICAgICwgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLnN0YXR1cyA9ICdwYXJzaW5nJztcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcblxuICAgICAgICB0aGlzLmNvbGxpc2lvbkJveEFycmF5ID0gbmV3IENvbGxpc2lvbkJveEFycmF5KCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUxheWVyQ29kZXIgPSBuZXcgRGljdGlvbmFyeUNvZGVyKE9iamVjdC5rZXlzKGRhdGEubGF5ZXJzKS5zb3J0KCkpO1xuXG4gICAgICAgIGNvbnN0IGZlYXR1cmVJbmRleCA9IG5ldyBGZWF0dXJlSW5kZXgodGhpcy50aWxlSUQsIHRoaXMub3ZlcnNjYWxpbmcpO1xuICAgICAgICBmZWF0dXJlSW5kZXguYnVja2V0TGF5ZXJJRHMgPSBbXTtcblxuICAgICAgICBjb25zdCBidWNrZXRzICAgICAgICAgICAgICAgICAgICAgPSB7fTtcblxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgZmVhdHVyZUluZGV4OiBmZWF0dXJlSW5kZXgsXG4gICAgICAgICAgICBpY29uRGVwZW5kZW5jaWVzOiB7fSxcbiAgICAgICAgICAgIGdseXBoRGVwZW5kZW5jaWVzOiB7fVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGxheWVyRmFtaWxpZXMgPSBsYXllckluZGV4LmZhbWlsaWVzQnlTb3VyY2VbdGhpcy5zb3VyY2VdO1xuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZUxheWVySWQgaW4gbGF5ZXJGYW1pbGllcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSBkYXRhLmxheWVyc1tzb3VyY2VMYXllcklkXTtcbiAgICAgICAgICAgIGlmICghc291cmNlTGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNvdXJjZUxheWVyLnZlcnNpb24gPT09IDEpIHtcbiAgICAgICAgICAgICAgICB1dGlsLndhcm5PbmNlKGBWZWN0b3IgdGlsZSBzb3VyY2UgXCIke3RoaXMuc291cmNlfVwiIGxheWVyIFwiJHtzb3VyY2VMYXllcklkfVwiIGAgK1xuICAgICAgICAgICAgICAgICAgICBgZG9lcyBub3QgdXNlIHZlY3RvciB0aWxlIHNwZWMgdjIgYW5kIHRoZXJlZm9yZSBtYXkgaGF2ZSBzb21lIHJlbmRlcmluZyBlcnJvcnMuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUxheWVySW5kZXggPSBzb3VyY2VMYXllckNvZGVyLmVuY29kZShzb3VyY2VMYXllcklkKTtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc291cmNlTGF5ZXIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IHNvdXJjZUxheWVyLmZlYXR1cmUoaW5kZXgpO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVzLnB1c2goeyBmZWF0dXJlLCBpbmRleCwgc291cmNlTGF5ZXJJbmRleCB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBmYW1pbHkgb2YgbGF5ZXJGYW1pbGllc1tzb3VyY2VMYXllcklkXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxheWVyID0gZmFtaWx5WzBdO1xuXG4gICAgICAgICAgICAgICAgYXNzZXJ0KGxheWVyLnNvdXJjZSA9PT0gdGhpcy5zb3VyY2UpO1xuICAgICAgICAgICAgICAgIGlmIChsYXllci5taW56b29tICYmIHRoaXMuem9vbSA8IE1hdGguZmxvb3IobGF5ZXIubWluem9vbSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChsYXllci5tYXh6b29tICYmIHRoaXMuem9vbSA+PSBsYXllci5tYXh6b29tKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIudmlzaWJpbGl0eSA9PT0gJ25vbmUnKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIHJlY2FsY3VsYXRlTGF5ZXJzKGZhbWlseSwgdGhpcy56b29tKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJ1Y2tldCA9IGJ1Y2tldHNbbGF5ZXIuaWRdID0gbGF5ZXIuY3JlYXRlQnVja2V0KHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGZlYXR1cmVJbmRleC5idWNrZXRMYXllcklEcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGxheWVyczogZmFtaWx5LFxuICAgICAgICAgICAgICAgICAgICB6b29tOiB0aGlzLnpvb20sXG4gICAgICAgICAgICAgICAgICAgIHBpeGVsUmF0aW86IHRoaXMucGl4ZWxSYXRpbyxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcnNjYWxpbmc6IHRoaXMub3ZlcnNjYWxpbmcsXG4gICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkJveEFycmF5OiB0aGlzLmNvbGxpc2lvbkJveEFycmF5XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBidWNrZXQucG9wdWxhdGUoZmVhdHVyZXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleC5idWNrZXRMYXllcklEcy5wdXNoKGZhbWlseS5tYXAoKGwpID0+IGwuaWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlcnJvciAgICAgICAgO1xuICAgICAgICBsZXQgZ2x5cGhNYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgbGV0IGltYWdlTWFwICAgICAgICAgICAgICAgICAgICAgICAgIDtcblxuICAgICAgICBjb25zdCBzdGFja3MgPSB1dGlsLm1hcE9iamVjdChvcHRpb25zLmdseXBoRGVwZW5kZW5jaWVzLCAoZ2x5cGhzKSA9PiBPYmplY3Qua2V5cyhnbHlwaHMpLm1hcChOdW1iZXIpKTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHN0YWNrcykubGVuZ3RoKSB7XG4gICAgICAgICAgICBhY3Rvci5zZW5kKCdnZXRHbHlwaHMnLCB7dWlkOiB0aGlzLnVpZCwgc3RhY2tzfSwgKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGhNYXAgPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIG1heWJlUHJlcGFyZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2x5cGhNYXAgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGljb25zID0gT2JqZWN0LmtleXMob3B0aW9ucy5pY29uRGVwZW5kZW5jaWVzKTtcbiAgICAgICAgaWYgKGljb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgYWN0b3Iuc2VuZCgnZ2V0SW1hZ2VzJywge2ljb25zfSwgKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VNYXAgPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIG1heWJlUHJlcGFyZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW1hZ2VNYXAgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1heWJlUHJlcGFyZS5jYWxsKHRoaXMpO1xuXG4gICAgICAgIGZ1bmN0aW9uIG1heWJlUHJlcGFyZSgpIHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGdseXBoTWFwICYmIGltYWdlTWFwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2x5cGhBdGxhcyA9IG1ha2VHbHlwaEF0bGFzKGdseXBoTWFwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZUF0bGFzID0gbWFrZUltYWdlQXRsYXMoaW1hZ2VNYXApO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYnVja2V0cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidWNrZXQgPSBidWNrZXRzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChidWNrZXQgaW5zdGFuY2VvZiBTeW1ib2xCdWNrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2FsY3VsYXRlTGF5ZXJzKGJ1Y2tldC5sYXllcnMsIHRoaXMuem9vbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtU3ltYm9sTGF5b3V0KGJ1Y2tldCwgZ2x5cGhNYXAsIGdseXBoQXRsYXMucG9zaXRpb25zLCBpbWFnZU1hcCwgaW1hZ2VBdGxhcy5wb3NpdGlvbnMsIHRoaXMuc2hvd0NvbGxpc2lvbkJveGVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ2RvbmUnO1xuXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgICAgICAgICAgICAgICBidWNrZXRzOiB1dGlsLnZhbHVlcyhidWNrZXRzKS5maWx0ZXIoYiA9PiAhYi5pc0VtcHR5KCkpLFxuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkJveEFycmF5OiB0aGlzLmNvbGxpc2lvbkJveEFycmF5LFxuICAgICAgICAgICAgICAgICAgICBnbHlwaEF0bGFzSW1hZ2U6IGdseXBoQXRsYXMuaW1hZ2UsXG4gICAgICAgICAgICAgICAgICAgIGljb25BdGxhc0ltYWdlOiBpbWFnZUF0bGFzLmltYWdlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlY2FsY3VsYXRlTGF5ZXJzKGxheWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHpvb20gICAgICAgICkge1xuICAgIC8vIExheWVycyBhcmUgc2hhcmVkIGFuZCBtYXkgaGF2ZSBiZWVuIHVzZWQgYnkgYSBXb3JrZXJUaWxlIHdpdGggYSBkaWZmZXJlbnQgem9vbS5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gbmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHpvb20pO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICAgIGxheWVyLnJlY2FsY3VsYXRlKHBhcmFtZXRlcnMpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBXb3JrZXJUaWxlO1xuIiwiXG5jb25zdCByZWZQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi91dGlsL3JlZl9wcm9wZXJ0aWVzJyk7XG5cbmZ1bmN0aW9uIGRlcmVmKGxheWVyLCBwYXJlbnQpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcblxuICAgIGZvciAoY29uc3QgayBpbiBsYXllcikge1xuICAgICAgICBpZiAoayAhPT0gJ3JlZicpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrXSA9IGxheWVyW2tdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVmUHJvcGVydGllcy5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgIGlmIChrIGluIHBhcmVudCkge1xuICAgICAgICAgICAgcmVzdWx0W2tdID0gcGFyZW50W2tdO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlcmVmTGF5ZXJzO1xuXG4vKipcbiAqIEdpdmVuIGFuIGFycmF5IG9mIGxheWVycywgc29tZSBvZiB3aGljaCBtYXkgY29udGFpbiBgcmVmYCBwcm9wZXJ0aWVzXG4gKiB3aG9zZSB2YWx1ZSBpcyB0aGUgYGlkYCBvZiBhbm90aGVyIHByb3BlcnR5LCByZXR1cm4gYSBuZXcgYXJyYXkgd2hlcmVcbiAqIHN1Y2ggbGF5ZXJzIGhhdmUgYmVlbiBhdWdtZW50ZWQgd2l0aCB0aGUgJ3R5cGUnLCAnc291cmNlJywgZXRjLiBwcm9wZXJ0aWVzXG4gKiBmcm9tIHRoZSBwYXJlbnQgbGF5ZXIsIGFuZCB0aGUgYHJlZmAgcHJvcGVydHkgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqXG4gKiBUaGUgaW5wdXQgaXMgbm90IG1vZGlmaWVkLiBUaGUgb3V0cHV0IG1heSBjb250YWluIHJlZmVyZW5jZXMgdG8gcG9ydGlvbnNcbiAqIG9mIHRoZSBpbnB1dC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheTxMYXllcj59IGxheWVyc1xuICogQHJldHVybnMge0FycmF5PExheWVyPn1cbiAqL1xuZnVuY3Rpb24gZGVyZWZMYXllcnMobGF5ZXJzKSB7XG4gICAgbGF5ZXJzID0gbGF5ZXJzLnNsaWNlKCk7XG5cbiAgICBjb25zdCBtYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1hcFtsYXllcnNbaV0uaWRdID0gbGF5ZXJzW2ldO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICgncmVmJyBpbiBsYXllcnNbaV0pIHtcbiAgICAgICAgICAgIGxheWVyc1tpXSA9IGRlcmVmKGxheWVyc1tpXSwgbWFwW2xheWVyc1tpXS5yZWZdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsYXllcnM7XG59XG4iLCJcbmNvbnN0IGlzRXF1YWwgPSByZXF1aXJlKCcuL3V0aWwvZGVlcF9lcXVhbCcpO1xuXG5jb25zdCBvcGVyYXRpb25zID0ge1xuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRTdHlsZScsIGFyZ3M6IFtzdHlsZXNoZWV0XSB9XG4gICAgICovXG4gICAgc2V0U3R5bGU6ICdzZXRTdHlsZScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ2FkZExheWVyJywgYXJnczogW2xheWVyLCAnYmVmb3JlTGF5ZXJJZCddIH1cbiAgICAgKi9cbiAgICBhZGRMYXllcjogJ2FkZExheWVyJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAncmVtb3ZlTGF5ZXInLCBhcmdzOiBbJ2xheWVySWQnXSB9XG4gICAgICovXG4gICAgcmVtb3ZlTGF5ZXI6ICdyZW1vdmVMYXllcicsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFBhaW50UHJvcGVydHknLCBhcmdzOiBbJ2xheWVySWQnLCAncHJvcCcsIHZhbHVlXSB9XG4gICAgICovXG4gICAgc2V0UGFpbnRQcm9wZXJ0eTogJ3NldFBhaW50UHJvcGVydHknLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRMYXlvdXRQcm9wZXJ0eScsIGFyZ3M6IFsnbGF5ZXJJZCcsICdwcm9wJywgdmFsdWVdIH1cbiAgICAgKi9cbiAgICBzZXRMYXlvdXRQcm9wZXJ0eTogJ3NldExheW91dFByb3BlcnR5JyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0RmlsdGVyJywgYXJnczogWydsYXllcklkJywgZmlsdGVyXSB9XG4gICAgICovXG4gICAgc2V0RmlsdGVyOiAnc2V0RmlsdGVyJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnYWRkU291cmNlJywgYXJnczogWydzb3VyY2VJZCcsIHNvdXJjZV0gfVxuICAgICAqL1xuICAgIGFkZFNvdXJjZTogJ2FkZFNvdXJjZScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3JlbW92ZVNvdXJjZScsIGFyZ3M6IFsnc291cmNlSWQnXSB9XG4gICAgICovXG4gICAgcmVtb3ZlU291cmNlOiAncmVtb3ZlU291cmNlJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0R2VvSlNPTlNvdXJjZURhdGEnLCBhcmdzOiBbJ3NvdXJjZUlkJywgZGF0YV0gfVxuICAgICAqL1xuICAgIHNldEdlb0pTT05Tb3VyY2VEYXRhOiAnc2V0R2VvSlNPTlNvdXJjZURhdGEnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRMYXllclpvb21SYW5nZScsIGFyZ3M6IFsnbGF5ZXJJZCcsIDAsIDIyXSB9XG4gICAgICovXG4gICAgc2V0TGF5ZXJab29tUmFuZ2U6ICdzZXRMYXllclpvb21SYW5nZScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldExheWVyUHJvcGVydHknLCBhcmdzOiBbJ2xheWVySWQnLCAncHJvcCcsIHZhbHVlXSB9XG4gICAgICovXG4gICAgc2V0TGF5ZXJQcm9wZXJ0eTogJ3NldExheWVyUHJvcGVydHknLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRDZW50ZXInLCBhcmdzOiBbW2xvbiwgbGF0XV0gfVxuICAgICAqL1xuICAgIHNldENlbnRlcjogJ3NldENlbnRlcicsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFpvb20nLCBhcmdzOiBbem9vbV0gfVxuICAgICAqL1xuICAgIHNldFpvb206ICdzZXRab29tJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0QmVhcmluZycsIGFyZ3M6IFtiZWFyaW5nXSB9XG4gICAgICovXG4gICAgc2V0QmVhcmluZzogJ3NldEJlYXJpbmcnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRQaXRjaCcsIGFyZ3M6IFtwaXRjaF0gfVxuICAgICAqL1xuICAgIHNldFBpdGNoOiAnc2V0UGl0Y2gnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRTcHJpdGUnLCBhcmdzOiBbJ3Nwcml0ZVVybCddIH1cbiAgICAgKi9cbiAgICBzZXRTcHJpdGU6ICdzZXRTcHJpdGUnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRHbHlwaHMnLCBhcmdzOiBbJ2dseXBoc1VybCddIH1cbiAgICAgKi9cbiAgICBzZXRHbHlwaHM6ICdzZXRHbHlwaHMnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRUcmFuc2l0aW9uJywgYXJnczogW3RyYW5zaXRpb25dIH1cbiAgICAgKi9cbiAgICBzZXRUcmFuc2l0aW9uOiAnc2V0VHJhbnNpdGlvbicsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldExpZ2h0aW5nJywgYXJnczogW2xpZ2h0UHJvcGVydGllc10gfVxuICAgICAqL1xuICAgIHNldExpZ2h0OiAnc2V0TGlnaHQnXG5cbn07XG5cbmZ1bmN0aW9uIGFkZFNvdXJjZShzb3VyY2VJZCwgYWZ0ZXIsIGNvbW1hbmRzKSB7XG4gICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuYWRkU291cmNlLCBhcmdzOiBbc291cmNlSWQsIGFmdGVyW3NvdXJjZUlkXV0gfSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVNvdXJjZShzb3VyY2VJZCwgY29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKSB7XG4gICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlU291cmNlLCBhcmdzOiBbc291cmNlSWRdIH0pO1xuICAgIHNvdXJjZXNSZW1vdmVkW3NvdXJjZUlkXSA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNvdXJjZShzb3VyY2VJZCwgYWZ0ZXIsIGNvbW1hbmRzLCBzb3VyY2VzUmVtb3ZlZCkge1xuICAgIHJlbW92ZVNvdXJjZShzb3VyY2VJZCwgY29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKTtcbiAgICBhZGRTb3VyY2Uoc291cmNlSWQsIGFmdGVyLCBjb21tYW5kcyk7XG59XG5cbmZ1bmN0aW9uIGNhblVwZGF0ZUdlb0pTT04oYmVmb3JlLCBhZnRlciwgc291cmNlSWQpIHtcbiAgICBsZXQgcHJvcDtcbiAgICBmb3IgKHByb3AgaW4gYmVmb3JlW3NvdXJjZUlkXSkge1xuICAgICAgICBpZiAoIWJlZm9yZVtzb3VyY2VJZF0uaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2RhdGEnICYmICFpc0VxdWFsKGJlZm9yZVtzb3VyY2VJZF1bcHJvcF0sIGFmdGVyW3NvdXJjZUlkXVtwcm9wXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHByb3AgaW4gYWZ0ZXJbc291cmNlSWRdKSB7XG4gICAgICAgIGlmICghYWZ0ZXJbc291cmNlSWRdLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHByb3AgIT09ICdkYXRhJyAmJiAhaXNFcXVhbChiZWZvcmVbc291cmNlSWRdW3Byb3BdLCBhZnRlcltzb3VyY2VJZF1bcHJvcF0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGRpZmZTb3VyY2VzKGJlZm9yZSwgYWZ0ZXIsIGNvbW1hbmRzLCBzb3VyY2VzUmVtb3ZlZCkge1xuICAgIGJlZm9yZSA9IGJlZm9yZSB8fCB7fTtcbiAgICBhZnRlciA9IGFmdGVyIHx8IHt9O1xuXG4gICAgbGV0IHNvdXJjZUlkO1xuXG4gICAgLy8gbG9vayBmb3Igc291cmNlcyB0byByZW1vdmVcbiAgICBmb3IgKHNvdXJjZUlkIGluIGJlZm9yZSkge1xuICAgICAgICBpZiAoIWJlZm9yZS5oYXNPd25Qcm9wZXJ0eShzb3VyY2VJZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWFmdGVyLmhhc093blByb3BlcnR5KHNvdXJjZUlkKSkge1xuICAgICAgICAgICAgcmVtb3ZlU291cmNlKHNvdXJjZUlkLCBjb21tYW5kcywgc291cmNlc1JlbW92ZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gbG9vayBmb3Igc291cmNlcyB0byBhZGQvdXBkYXRlXG4gICAgZm9yIChzb3VyY2VJZCBpbiBhZnRlcikge1xuICAgICAgICBpZiAoIWFmdGVyLmhhc093blByb3BlcnR5KHNvdXJjZUlkKSkgY29udGludWU7XG4gICAgICAgIGlmICghYmVmb3JlLmhhc093blByb3BlcnR5KHNvdXJjZUlkKSkge1xuICAgICAgICAgICAgYWRkU291cmNlKHNvdXJjZUlkLCBhZnRlciwgY29tbWFuZHMpO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0VxdWFsKGJlZm9yZVtzb3VyY2VJZF0sIGFmdGVyW3NvdXJjZUlkXSkpIHtcbiAgICAgICAgICAgIGlmIChiZWZvcmVbc291cmNlSWRdLnR5cGUgPT09ICdnZW9qc29uJyAmJiBhZnRlcltzb3VyY2VJZF0udHlwZSA9PT0gJ2dlb2pzb24nICYmIGNhblVwZGF0ZUdlb0pTT04oYmVmb3JlLCBhZnRlciwgc291cmNlSWQpKSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0R2VvSlNPTlNvdXJjZURhdGEsIGFyZ3M6IFtzb3VyY2VJZCwgYWZ0ZXJbc291cmNlSWRdLmRhdGFdIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBubyB1cGRhdGUgY29tbWFuZCwgbXVzdCByZW1vdmUgdGhlbiBhZGRcbiAgICAgICAgICAgICAgICB1cGRhdGVTb3VyY2Uoc291cmNlSWQsIGFmdGVyLCBjb21tYW5kcywgc291cmNlc1JlbW92ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlLCBhZnRlciwgY29tbWFuZHMsIGxheWVySWQsIGtsYXNzLCBjb21tYW5kKSB7XG4gICAgYmVmb3JlID0gYmVmb3JlIHx8IHt9O1xuICAgIGFmdGVyID0gYWZ0ZXIgfHwge307XG5cbiAgICBsZXQgcHJvcDtcblxuICAgIGZvciAocHJvcCBpbiBiZWZvcmUpIHtcbiAgICAgICAgaWYgKCFiZWZvcmUuaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlW3Byb3BdLCBhZnRlcltwcm9wXSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBjb21tYW5kLCBhcmdzOiBbbGF5ZXJJZCwgcHJvcCwgYWZ0ZXJbcHJvcF0sIGtsYXNzXSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHByb3AgaW4gYWZ0ZXIpIHtcbiAgICAgICAgaWYgKCFhZnRlci5oYXNPd25Qcm9wZXJ0eShwcm9wKSB8fCBiZWZvcmUuaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlW3Byb3BdLCBhZnRlcltwcm9wXSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBjb21tYW5kLCBhcmdzOiBbbGF5ZXJJZCwgcHJvcCwgYWZ0ZXJbcHJvcF0sIGtsYXNzXSB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcGx1Y2tJZChsYXllcikge1xuICAgIHJldHVybiBsYXllci5pZDtcbn1cbmZ1bmN0aW9uIGluZGV4QnlJZChncm91cCwgbGF5ZXIpIHtcbiAgICBncm91cFtsYXllci5pZF0gPSBsYXllcjtcbiAgICByZXR1cm4gZ3JvdXA7XG59XG5cbmZ1bmN0aW9uIGRpZmZMYXllcnMoYmVmb3JlLCBhZnRlciwgY29tbWFuZHMpIHtcbiAgICBiZWZvcmUgPSBiZWZvcmUgfHwgW107XG4gICAgYWZ0ZXIgPSBhZnRlciB8fCBbXTtcblxuICAgIC8vIG9yZGVyIG9mIGxheWVycyBieSBpZFxuICAgIGNvbnN0IGJlZm9yZU9yZGVyID0gYmVmb3JlLm1hcChwbHVja0lkKTtcbiAgICBjb25zdCBhZnRlck9yZGVyID0gYWZ0ZXIubWFwKHBsdWNrSWQpO1xuXG4gICAgLy8gaW5kZXggb2YgbGF5ZXIgYnkgaWRcbiAgICBjb25zdCBiZWZvcmVJbmRleCA9IGJlZm9yZS5yZWR1Y2UoaW5kZXhCeUlkLCB7fSk7XG4gICAgY29uc3QgYWZ0ZXJJbmRleCA9IGFmdGVyLnJlZHVjZShpbmRleEJ5SWQsIHt9KTtcblxuICAgIC8vIHRyYWNrIG9yZGVyIG9mIGxheWVycyBhcyBpZiB0aGV5IGhhdmUgYmVlbiBtdXRhdGVkXG4gICAgY29uc3QgdHJhY2tlciA9IGJlZm9yZU9yZGVyLnNsaWNlKCk7XG5cbiAgICAvLyBsYXllcnMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgZG8gbm90IG5lZWQgdG8gYmUgZGlmZmVkXG4gICAgY29uc3QgY2xlYW4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgbGV0IGksIGQsIGxheWVySWQsIGJlZm9yZUxheWVyLCBhZnRlckxheWVyLCBpbnNlcnRCZWZvcmVMYXllcklkLCBwcm9wO1xuXG4gICAgLy8gcmVtb3ZlIGxheWVyc1xuICAgIGZvciAoaSA9IDAsIGQgPSAwOyBpIDwgYmVmb3JlT3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGF5ZXJJZCA9IGJlZm9yZU9yZGVyW2ldO1xuICAgICAgICBpZiAoIWFmdGVySW5kZXguaGFzT3duUHJvcGVydHkobGF5ZXJJZCkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnJlbW92ZUxheWVyLCBhcmdzOiBbbGF5ZXJJZF0gfSk7XG4gICAgICAgICAgICB0cmFja2VyLnNwbGljZSh0cmFja2VyLmluZGV4T2YobGF5ZXJJZCwgZCksIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbGltaXQgd2hlcmUgaW4gdHJhY2tlciB3ZSBuZWVkIHRvIGxvb2sgZm9yIGEgbWF0Y2hcbiAgICAgICAgICAgIGQrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFkZC9yZW9yZGVyIGxheWVyc1xuICAgIGZvciAoaSA9IDAsIGQgPSAwOyBpIDwgYWZ0ZXJPcmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyB3b3JrIGJhY2t3YXJkcyBhcyBpbnNlcnQgaXMgYmVmb3JlIGFuIGV4aXN0aW5nIGxheWVyXG4gICAgICAgIGxheWVySWQgPSBhZnRlck9yZGVyW2FmdGVyT3JkZXIubGVuZ3RoIC0gMSAtIGldO1xuXG4gICAgICAgIGlmICh0cmFja2VyW3RyYWNrZXIubGVuZ3RoIC0gMSAtIGldID09PSBsYXllcklkKSBjb250aW51ZTtcblxuICAgICAgICBpZiAoYmVmb3JlSW5kZXguaGFzT3duUHJvcGVydHkobGF5ZXJJZCkpIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgbGF5ZXIgYmVmb3JlIHdlIGluc2VydCBhdCB0aGUgY29ycmVjdCBwb3NpdGlvblxuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlTGF5ZXIsIGFyZ3M6IFtsYXllcklkXSB9KTtcbiAgICAgICAgICAgIHRyYWNrZXIuc3BsaWNlKHRyYWNrZXIubGFzdEluZGV4T2YobGF5ZXJJZCwgdHJhY2tlci5sZW5ndGggLSBkKSwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBsaW1pdCB3aGVyZSBpbiB0cmFja2VyIHdlIG5lZWQgdG8gbG9vayBmb3IgYSBtYXRjaFxuICAgICAgICAgICAgZCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIGxheWVyIGF0IGNvcnJlY3QgcG9zaXRpb25cbiAgICAgICAgaW5zZXJ0QmVmb3JlTGF5ZXJJZCA9IHRyYWNrZXJbdHJhY2tlci5sZW5ndGggLSBpXTtcbiAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuYWRkTGF5ZXIsIGFyZ3M6IFthZnRlckluZGV4W2xheWVySWRdLCBpbnNlcnRCZWZvcmVMYXllcklkXSB9KTtcbiAgICAgICAgdHJhY2tlci5zcGxpY2UodHJhY2tlci5sZW5ndGggLSBpLCAwLCBsYXllcklkKTtcbiAgICAgICAgY2xlYW5bbGF5ZXJJZF0gPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBsYXllcnNcbiAgICBmb3IgKGkgPSAwOyBpIDwgYWZ0ZXJPcmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBsYXllcklkID0gYWZ0ZXJPcmRlcltpXTtcbiAgICAgICAgYmVmb3JlTGF5ZXIgPSBiZWZvcmVJbmRleFtsYXllcklkXTtcbiAgICAgICAgYWZ0ZXJMYXllciA9IGFmdGVySW5kZXhbbGF5ZXJJZF07XG5cbiAgICAgICAgLy8gbm8gbmVlZCB0byB1cGRhdGUgaWYgcHJldmlvdXNseSBhZGRlZCAobmV3IG9yIG1vdmVkKVxuICAgICAgICBpZiAoY2xlYW5bbGF5ZXJJZF0gfHwgaXNFcXVhbChiZWZvcmVMYXllciwgYWZ0ZXJMYXllcikpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIElmIHNvdXJjZSwgc291cmNlLWxheWVyLCBvciB0eXBlIGhhdmUgY2hhbmdlcywgdGhlbiByZW1vdmUgdGhlIGxheWVyXG4gICAgICAgIC8vIGFuZCBhZGQgaXQgYmFjayAnZnJvbSBzY3JhdGNoJy5cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZUxheWVyLnNvdXJjZSwgYWZ0ZXJMYXllci5zb3VyY2UpIHx8ICFpc0VxdWFsKGJlZm9yZUxheWVyWydzb3VyY2UtbGF5ZXInXSwgYWZ0ZXJMYXllclsnc291cmNlLWxheWVyJ10pIHx8ICFpc0VxdWFsKGJlZm9yZUxheWVyLnR5cGUsIGFmdGVyTGF5ZXIudHlwZSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnJlbW92ZUxheWVyLCBhcmdzOiBbbGF5ZXJJZF0gfSk7XG4gICAgICAgICAgICAvLyB3ZSBhZGQgdGhlIGxheWVyIGJhY2sgYXQgdGhlIHNhbWUgcG9zaXRpb24gaXQgd2FzIGFscmVhZHkgaW4sIHNvXG4gICAgICAgICAgICAvLyB0aGVyZSdzIG5vIG5lZWQgdG8gdXBkYXRlIHRoZSBgdHJhY2tlcmBcbiAgICAgICAgICAgIGluc2VydEJlZm9yZUxheWVySWQgPSB0cmFja2VyW3RyYWNrZXIubGFzdEluZGV4T2YobGF5ZXJJZCkgKyAxXTtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLmFkZExheWVyLCBhcmdzOiBbYWZ0ZXJMYXllciwgaW5zZXJ0QmVmb3JlTGF5ZXJJZF0gfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxheW91dCwgcGFpbnQsIGZpbHRlciwgbWluem9vbSwgbWF4em9vbVxuICAgICAgICBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlTGF5ZXIubGF5b3V0LCBhZnRlckxheWVyLmxheW91dCwgY29tbWFuZHMsIGxheWVySWQsIG51bGwsIG9wZXJhdGlvbnMuc2V0TGF5b3V0UHJvcGVydHkpO1xuICAgICAgICBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlTGF5ZXIucGFpbnQsIGFmdGVyTGF5ZXIucGFpbnQsIGNvbW1hbmRzLCBsYXllcklkLCBudWxsLCBvcGVyYXRpb25zLnNldFBhaW50UHJvcGVydHkpO1xuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXIuZmlsdGVyLCBhZnRlckxheWVyLmZpbHRlcikpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldEZpbHRlciwgYXJnczogW2xheWVySWQsIGFmdGVyTGF5ZXIuZmlsdGVyXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXIubWluem9vbSwgYWZ0ZXJMYXllci5taW56b29tKSB8fCAhaXNFcXVhbChiZWZvcmVMYXllci5tYXh6b29tLCBhZnRlckxheWVyLm1heHpvb20pKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHsgY29tbWFuZDogb3BlcmF0aW9ucy5zZXRMYXllclpvb21SYW5nZSwgYXJnczogW2xheWVySWQsIGFmdGVyTGF5ZXIubWluem9vbSwgYWZ0ZXJMYXllci5tYXh6b29tXSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhhbmRsZSBhbGwgb3RoZXIgbGF5ZXIgcHJvcHMsIGluY2x1ZGluZyBwYWludC4qXG4gICAgICAgIGZvciAocHJvcCBpbiBiZWZvcmVMYXllcikge1xuICAgICAgICAgICAgaWYgKCFiZWZvcmVMYXllci5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gJ2xheW91dCcgfHwgcHJvcCA9PT0gJ3BhaW50JyB8fCBwcm9wID09PSAnZmlsdGVyJyB8fFxuICAgICAgICAgICAgICAgIHByb3AgPT09ICdtZXRhZGF0YScgfHwgcHJvcCA9PT0gJ21pbnpvb20nIHx8IHByb3AgPT09ICdtYXh6b29tJykgY29udGludWU7XG4gICAgICAgICAgICBpZiAocHJvcC5pbmRleE9mKCdwYWludC4nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRpZmZMYXllclByb3BlcnR5Q2hhbmdlcyhiZWZvcmVMYXllcltwcm9wXSwgYWZ0ZXJMYXllcltwcm9wXSwgY29tbWFuZHMsIGxheWVySWQsIHByb3Auc2xpY2UoNiksIG9wZXJhdGlvbnMuc2V0UGFpbnRQcm9wZXJ0eSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0VxdWFsKGJlZm9yZUxheWVyW3Byb3BdLCBhZnRlckxheWVyW3Byb3BdKSkge1xuICAgICAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldExheWVyUHJvcGVydHksIGFyZ3M6IFtsYXllcklkLCBwcm9wLCBhZnRlckxheWVyW3Byb3BdXSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHByb3AgaW4gYWZ0ZXJMYXllcikge1xuICAgICAgICAgICAgaWYgKCFhZnRlckxheWVyLmhhc093blByb3BlcnR5KHByb3ApIHx8IGJlZm9yZUxheWVyLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnbGF5b3V0JyB8fCBwcm9wID09PSAncGFpbnQnIHx8IHByb3AgPT09ICdmaWx0ZXInIHx8XG4gICAgICAgICAgICAgICAgcHJvcCA9PT0gJ21ldGFkYXRhJyB8fCBwcm9wID09PSAnbWluem9vbScgfHwgcHJvcCA9PT0gJ21heHpvb20nKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wLmluZGV4T2YoJ3BhaW50LicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGlmZkxheWVyUHJvcGVydHlDaGFuZ2VzKGJlZm9yZUxheWVyW3Byb3BdLCBhZnRlckxheWVyW3Byb3BdLCBjb21tYW5kcywgbGF5ZXJJZCwgcHJvcC5zbGljZSg2KSwgb3BlcmF0aW9ucy5zZXRQYWludFByb3BlcnR5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXJbcHJvcF0sIGFmdGVyTGF5ZXJbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0TGF5ZXJQcm9wZXJ0eSwgYXJnczogW2xheWVySWQsIHByb3AsIGFmdGVyTGF5ZXJbcHJvcF1dIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIERpZmYgdHdvIHN0eWxlc2hlZXRcbiAqXG4gKiBDcmVhdGVzIHNlbWFudGljbHkgYXdhcmUgZGlmZnMgdGhhdCBjYW4gZWFzaWx5IGJlIGFwcGxpZWQgYXQgcnVudGltZS5cbiAqIE9wZXJhdGlvbnMgcHJvZHVjZWQgYnkgdGhlIGRpZmYgY2xvc2VseSByZXNlbWJsZSB0aGUgbWFwYm94LWdsLWpzIEFQSS4gQW55XG4gKiBlcnJvciBjcmVhdGluZyB0aGUgZGlmZiB3aWxsIGZhbGwgYmFjayB0byB0aGUgJ3NldFN0eWxlJyBvcGVyYXRpb24uXG4gKlxuICogRXhhbXBsZSBkaWZmOlxuICogW1xuICogICAgIHsgY29tbWFuZDogJ3NldENvbnN0YW50JywgYXJnczogWydAd2F0ZXInLCAnIzAwMDBGRiddIH0sXG4gKiAgICAgeyBjb21tYW5kOiAnc2V0UGFpbnRQcm9wZXJ0eScsIGFyZ3M6IFsnYmFja2dyb3VuZCcsICdiYWNrZ3JvdW5kLWNvbG9yJywgJ2JsYWNrJ10gfVxuICogXVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IFtiZWZvcmVdIHN0eWxlc2hlZXQgdG8gY29tcGFyZSBmcm9tXG4gKiBAcGFyYW0geyp9IGFmdGVyIHN0eWxlc2hlZXQgdG8gY29tcGFyZSB0b1xuICogQHJldHVybnMgQXJyYXkgbGlzdCBvZiBjaGFuZ2VzXG4gKi9cbmZ1bmN0aW9uIGRpZmZTdHlsZXMoYmVmb3JlLCBhZnRlcikge1xuICAgIGlmICghYmVmb3JlKSByZXR1cm4gW3sgY29tbWFuZDogb3BlcmF0aW9ucy5zZXRTdHlsZSwgYXJnczogW2FmdGVyXSB9XTtcblxuICAgIGxldCBjb21tYW5kcyA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgLy8gSGFuZGxlIGNoYW5nZXMgdG8gdG9wLWxldmVsIHByb3BlcnRpZXNcbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS52ZXJzaW9uLCBhZnRlci52ZXJzaW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIFt7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0U3R5bGUsIGFyZ3M6IFthZnRlcl0gfV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS5jZW50ZXIsIGFmdGVyLmNlbnRlcikpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldENlbnRlciwgYXJnczogW2FmdGVyLmNlbnRlcl0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS56b29tLCBhZnRlci56b29tKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0Wm9vbSwgYXJnczogW2FmdGVyLnpvb21dIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUuYmVhcmluZywgYWZ0ZXIuYmVhcmluZykpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldEJlYXJpbmcsIGFyZ3M6IFthZnRlci5iZWFyaW5nXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLnBpdGNoLCBhZnRlci5waXRjaCkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldFBpdGNoLCBhcmdzOiBbYWZ0ZXIucGl0Y2hdIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUuc3ByaXRlLCBhZnRlci5zcHJpdGUpKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHsgY29tbWFuZDogb3BlcmF0aW9ucy5zZXRTcHJpdGUsIGFyZ3M6IFthZnRlci5zcHJpdGVdIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUuZ2x5cGhzLCBhZnRlci5nbHlwaHMpKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHsgY29tbWFuZDogb3BlcmF0aW9ucy5zZXRHbHlwaHMsIGFyZ3M6IFthZnRlci5nbHlwaHNdIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUudHJhbnNpdGlvbiwgYWZ0ZXIudHJhbnNpdGlvbikpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldFRyYW5zaXRpb24sIGFyZ3M6IFthZnRlci50cmFuc2l0aW9uXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmxpZ2h0LCBhZnRlci5saWdodCkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldExpZ2h0LCBhcmdzOiBbYWZ0ZXIubGlnaHRdIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGNoYW5nZXMgdG8gYHNvdXJjZXNgXG4gICAgICAgIC8vIElmIGEgc291cmNlIGlzIHRvIGJlIHJlbW92ZWQsIHdlIGFsc28tLWJlZm9yZSB0aGUgcmVtb3ZlU291cmNlXG4gICAgICAgIC8vIGNvbW1hbmQtLW5lZWQgdG8gcmVtb3ZlIGFsbCB0aGUgc3R5bGUgbGF5ZXJzIHRoYXQgZGVwZW5kIG9uIGl0LlxuICAgICAgICBjb25zdCBzb3VyY2VzUmVtb3ZlZCA9IHt9O1xuXG4gICAgICAgIC8vIEZpcnN0IGNvbGxlY3QgdGhlIHthZGQscmVtb3ZlfVNvdXJjZSBjb21tYW5kc1xuICAgICAgICBjb25zdCByZW1vdmVPckFkZFNvdXJjZUNvbW1hbmRzID0gW107XG4gICAgICAgIGRpZmZTb3VyY2VzKGJlZm9yZS5zb3VyY2VzLCBhZnRlci5zb3VyY2VzLCByZW1vdmVPckFkZFNvdXJjZUNvbW1hbmRzLCBzb3VyY2VzUmVtb3ZlZCk7XG5cbiAgICAgICAgLy8gUHVzaCBhIHJlbW92ZUxheWVyIGNvbW1hbmQgZm9yIGVhY2ggc3R5bGUgbGF5ZXIgdGhhdCBkZXBlbmRzIG9uIGFcbiAgICAgICAgLy8gc291cmNlIHRoYXQncyBiZWluZyByZW1vdmVkLlxuICAgICAgICAvLyBBbHNvLCBleGNsdWRlIGFueSBzdWNoIGxheWVycyB0aGVtIGZyb20gdGhlIGlucHV0IHRvIGBkaWZmTGF5ZXJzYFxuICAgICAgICAvLyBiZWxvdywgc28gdGhhdCBkaWZmTGF5ZXJzIHByb2R1Y2VzIHRoZSBhcHByb3ByaWF0ZSBgYWRkTGF5ZXJzYFxuICAgICAgICAvLyBjb21tYW5kXG4gICAgICAgIGNvbnN0IGJlZm9yZUxheWVycyA9IFtdO1xuICAgICAgICBpZiAoYmVmb3JlLmxheWVycykge1xuICAgICAgICAgICAgYmVmb3JlLmxheWVycy5mb3JFYWNoKChsYXllcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VzUmVtb3ZlZFtsYXllci5zb3VyY2VdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnJlbW92ZUxheWVyLCBhcmdzOiBbbGF5ZXIuaWRdIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZUxheWVycy5wdXNoKGxheWVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb21tYW5kcyA9IGNvbW1hbmRzLmNvbmNhdChyZW1vdmVPckFkZFNvdXJjZUNvbW1hbmRzKTtcblxuICAgICAgICAvLyBIYW5kbGUgY2hhbmdlcyB0byBgbGF5ZXJzYFxuICAgICAgICBkaWZmTGF5ZXJzKGJlZm9yZUxheWVycywgYWZ0ZXIubGF5ZXJzLCBjb21tYW5kcyk7XG5cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGZhbGwgYmFjayB0byBzZXRTdHlsZVxuICAgICAgICBjb25zb2xlLndhcm4oJ1VuYWJsZSB0byBjb21wdXRlIHN0eWxlIGRpZmY6JywgZSk7XG4gICAgICAgIGNvbW1hbmRzID0gW3sgY29tbWFuZDogb3BlcmF0aW9ucy5zZXRTdHlsZSwgYXJnczogW2FmdGVyXSB9XTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tbWFuZHM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGlmZlN0eWxlcztcbm1vZHVsZS5leHBvcnRzLm9wZXJhdGlvbnMgPSBvcGVyYXRpb25zO1xuIiwiXG5mdW5jdGlvbiBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgbWVzc2FnZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IChrZXkgPyBgJHtrZXl9OiBgIDogJycpICsgbWVzc2FnZTtcblxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLl9fbGluZV9fKSB7XG4gICAgICAgIHRoaXMubGluZSA9IHZhbHVlLl9fbGluZV9fO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBWYWxpZGF0aW9uRXJyb3I7XG4iLCIvLyAgICAgIFxuXG5jb25zdCB7IHRvU3RyaW5nIH0gPSByZXF1aXJlKCcuL3R5cGVzJyk7XG5jb25zdCBQYXJzaW5nQ29udGV4dCA9IHJlcXVpcmUoJy4vcGFyc2luZ19jb250ZXh0Jyk7XG5jb25zdCBFdmFsdWF0aW9uQ29udGV4dCA9IHJlcXVpcmUoJy4vZXZhbHVhdGlvbl9jb250ZXh0Jyk7XG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNsYXNzIENvbXBvdW5kRXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKG5hbWUgICAgICAgICwgdHlwZSAgICAgICwgZXZhbHVhdGUgICAgICAgICAgLCBhcmdzICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLl9ldmFsdWF0ZSA9IGV2YWx1YXRlO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eCAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V2YWx1YXRlKGN0eCwgdGhpcy5hcmdzKTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuYXJncy5mb3JFYWNoKGZuKTtcbiAgICB9XG5cbiAgICBwb3NzaWJsZU91dHB1dHMoKSB7XG4gICAgICAgIHJldHVybiBbdW5kZWZpbmVkXTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJncyAgICAgICAgICAgICAgLCBjb250ZXh0ICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgIHtcbiAgICAgICAgY29uc3Qgb3AgICAgICAgICA9IChhcmdzWzBdICAgICApO1xuICAgICAgICBjb25zdCBkZWZpbml0aW9uID0gQ29tcG91bmRFeHByZXNzaW9uLmRlZmluaXRpb25zW29wXTtcbiAgICAgICAgaWYgKCFkZWZpbml0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgVW5rbm93biBleHByZXNzaW9uIFwiJHtvcH1cIi4gSWYgeW91IHdhbnRlZCBhIGxpdGVyYWwgYXJyYXksIHVzZSBbXCJsaXRlcmFsXCIsIFsuLi5dXS5gLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdyBjaGVjayBhcmd1bWVudCB0eXBlcyBhZ2FpbnN0IGVhY2ggc2lnbmF0dXJlXG4gICAgICAgIGNvbnN0IHR5cGUgPSBBcnJheS5pc0FycmF5KGRlZmluaXRpb24pID9cbiAgICAgICAgICAgIGRlZmluaXRpb25bMF0gOiBkZWZpbml0aW9uLnR5cGU7XG5cbiAgICAgICAgY29uc3QgYXZhaWxhYmxlT3ZlcmxvYWRzID0gQXJyYXkuaXNBcnJheShkZWZpbml0aW9uKSA/XG4gICAgICAgICAgICBbW2RlZmluaXRpb25bMV0sIGRlZmluaXRpb25bMl1dXSA6XG4gICAgICAgICAgICBkZWZpbml0aW9uLm92ZXJsb2FkcztcblxuICAgICAgICBjb25zdCBvdmVybG9hZHMgPSBhdmFpbGFibGVPdmVybG9hZHMuZmlsdGVyKChbc2lnbmF0dXJlXSkgPT4gKFxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoc2lnbmF0dXJlKSB8fCAvLyB2YXJhZ3NcbiAgICAgICAgICAgIHNpZ25hdHVyZS5sZW5ndGggPT09IGFyZ3MubGVuZ3RoIC0gMSAvLyBjb3JyZWN0IHBhcmFtIGNvdW50XG4gICAgICAgICkpO1xuXG4gICAgICAgIC8vIEZpcnN0IHBhcnNlIGFsbCB0aGUgYXJnc1xuICAgICAgICBjb25zdCBwYXJzZWRBcmdzICAgICAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGFyZyA9IGFyZ3NbaV07XG4gICAgICAgICAgICBsZXQgZXhwZWN0ZWQ7XG4gICAgICAgICAgICBpZiAob3ZlcmxvYWRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IG92ZXJsb2Fkc1swXVswXTtcbiAgICAgICAgICAgICAgICBleHBlY3RlZCA9IEFycmF5LmlzQXJyYXkocGFyYW1zKSA/XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1tpIC0gMV0gOlxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMudHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IGNvbnRleHQucGFyc2UoYXJnLCAxICsgcGFyc2VkQXJncy5sZW5ndGgsIGV4cGVjdGVkKTtcbiAgICAgICAgICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHBhcnNlZEFyZ3MucHVzaChwYXJzZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNpZ25hdHVyZUNvbnRleHQgICAgICAgICAgICAgICAgID0gKG51bGwgICAgICk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbcGFyYW1zLCBldmFsdWF0ZV0gb2Ygb3ZlcmxvYWRzKSB7XG4gICAgICAgICAgICAvLyBVc2UgYSBmcmVzaCBjb250ZXh0IGZvciBlYWNoIGF0dGVtcHRlZCBzaWduYXR1cmUgc28gdGhhdCwgaWZcbiAgICAgICAgICAgIC8vIHdlIGV2ZW50dWFsbHkgc3VjY2VlZCwgd2UgaGF2ZW4ndCBwb2xsdXRlZCBgY29udGV4dC5lcnJvcnNgLlxuICAgICAgICAgICAgc2lnbmF0dXJlQ29udGV4dCA9IG5ldyBQYXJzaW5nQ29udGV4dChjb250ZXh0LnJlZ2lzdHJ5LCBjb250ZXh0LnBhdGgsIG51bGwsIGNvbnRleHQuc2NvcGUpO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IHBhcnNlZEFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZUNvbnRleHQuZXJyb3IoYEV4cGVjdGVkICR7cGFyYW1zLmxlbmd0aH0gYXJndW1lbnRzLCBidXQgZm91bmQgJHtwYXJzZWRBcmdzLmxlbmd0aH0gaW5zdGVhZC5gKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnNlZEFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHBlY3RlZCA9IEFycmF5LmlzQXJyYXkocGFyYW1zKSA/IHBhcmFtc1tpXSA6IHBhcmFtcy50eXBlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyZyA9IHBhcnNlZEFyZ3NbaV07XG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlQ29udGV4dC5jb25jYXQoaSArIDEpLmNoZWNrU3VidHlwZShleHBlY3RlZCwgYXJnLnR5cGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2lnbmF0dXJlQ29udGV4dC5lcnJvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb3VuZEV4cHJlc3Npb24ob3AsIHR5cGUsIGV2YWx1YXRlLCBwYXJzZWRBcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFzc2VydCghc2lnbmF0dXJlQ29udGV4dCB8fCBzaWduYXR1cmVDb250ZXh0LmVycm9ycy5sZW5ndGggPiAwKTtcblxuICAgICAgICBpZiAob3ZlcmxvYWRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY29udGV4dC5lcnJvcnMucHVzaC5hcHBseShjb250ZXh0LmVycm9ycywgc2lnbmF0dXJlQ29udGV4dC5lcnJvcnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBvdmVybG9hZHMubGVuZ3RoID8gb3ZlcmxvYWRzIDogYXZhaWxhYmxlT3ZlcmxvYWRzO1xuICAgICAgICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGV4cGVjdGVkXG4gICAgICAgICAgICAgICAgLm1hcCgoW3BhcmFtc10pID0+IHN0cmluZ2lmeVNpZ25hdHVyZShwYXJhbXMpKVxuICAgICAgICAgICAgICAgIC5qb2luKCcgfCAnKTtcbiAgICAgICAgICAgIGNvbnN0IGFjdHVhbFR5cGVzID0gcGFyc2VkQXJnc1xuICAgICAgICAgICAgICAgIC5tYXAoYXJnID0+IHRvU3RyaW5nKGFyZy50eXBlKSlcbiAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFyZ3VtZW50cyBvZiB0eXBlICR7c2lnbmF0dXJlc30sIGJ1dCBmb3VuZCAoJHthY3R1YWxUeXBlc30pIGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmVnaXN0ZXIoXG4gICAgICAgIHJlZ2lzdHJ5ICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICApIHtcbiAgICAgICAgYXNzZXJ0KCFDb21wb3VuZEV4cHJlc3Npb24uZGVmaW5pdGlvbnMpO1xuICAgICAgICBDb21wb3VuZEV4cHJlc3Npb24uZGVmaW5pdGlvbnMgPSBkZWZpbml0aW9ucztcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGRlZmluaXRpb25zKSB7XG4gICAgICAgICAgICByZWdpc3RyeVtuYW1lXSA9IENvbXBvdW5kRXhwcmVzc2lvbjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gdmFyYXJncyh0eXBlICAgICAgKSAgICAgICAgICB7XG4gICAgcmV0dXJuIHsgdHlwZSB9O1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlTaWduYXR1cmUoc2lnbmF0dXJlICAgICAgICAgICApICAgICAgICAge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHNpZ25hdHVyZSkpIHtcbiAgICAgICAgcmV0dXJuIGAoJHtzaWduYXR1cmUubWFwKHRvU3RyaW5nKS5qb2luKCcsICcpfSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBgKCR7dG9TdHJpbmcoc2lnbmF0dXJlLnR5cGUpfS4uLilgO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgQ29tcG91bmRFeHByZXNzaW9uLFxuICAgIHZhcmFyZ3Ncbn07XG5cbiIsIi8vICAgICAgXG5cbmNvbnN0IHtcbiAgICB0b1N0cmluZyxcbiAgICBhcnJheSxcbiAgICBWYWx1ZVR5cGUsXG4gICAgU3RyaW5nVHlwZSxcbiAgICBOdW1iZXJUeXBlLFxuICAgIEJvb2xlYW5UeXBlLFxuICAgIGNoZWNrU3VidHlwZVxufSA9IHJlcXVpcmUoJy4uL3R5cGVzJyk7XG5cbmNvbnN0IHt0eXBlT2Z9ID0gcmVxdWlyZSgnLi4vdmFsdWVzJyk7XG5jb25zdCBSdW50aW1lRXJyb3IgPSByZXF1aXJlKCcuLi9ydW50aW1lX2Vycm9yJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuY29uc3QgdHlwZXMgPSB7XG4gICAgc3RyaW5nOiBTdHJpbmdUeXBlLFxuICAgIG51bWJlcjogTnVtYmVyVHlwZSxcbiAgICBib29sZWFuOiBCb29sZWFuVHlwZVxufTtcblxuY2xhc3MgQXJyYXlBc3NlcnRpb24gICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlICAgICAgICAgICAsIGlucHV0ICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJncyAgICAgICAgICAgICAgLCBjb250ZXh0ICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMiB8fCBhcmdzLmxlbmd0aCA+IDQpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgMSwgMiwgb3IgMyBhcmd1bWVudHMsIGJ1dCBmb3VuZCAke2FyZ3MubGVuZ3RoIC0gMX0gaW5zdGVhZC5gKTtcblxuICAgICAgICBsZXQgaXRlbVR5cGU7XG4gICAgICAgIGxldCBOO1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gYXJnc1sxXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycgfHwgISh0eXBlIGluIHR5cGVzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcignVGhlIGl0ZW0gdHlwZSBhcmd1bWVudCBvZiBcImFycmF5XCIgbXVzdCBiZSBvbmUgb2Ygc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4nLCAxKTtcbiAgICAgICAgICAgIGl0ZW1UeXBlID0gdHlwZXNbdHlwZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdGVtVHlwZSA9IFZhbHVlVHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0eXBlb2YgYXJnc1syXSAhPT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgICAgICBhcmdzWzJdIDwgMCB8fFxuICAgICAgICAgICAgICAgIGFyZ3NbMl0gIT09IE1hdGguZmxvb3IoYXJnc1syXSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKCdUaGUgbGVuZ3RoIGFyZ3VtZW50IHRvIFwiYXJyYXlcIiBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBsaXRlcmFsJywgMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBOID0gYXJnc1syXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHR5cGUgPSBhcnJheShpdGVtVHlwZSwgTik7XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbYXJncy5sZW5ndGggLSAxXSwgYXJncy5sZW5ndGggLSAxLCBWYWx1ZVR5cGUpO1xuICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gbmV3IEFycmF5QXNzZXJ0aW9uKHR5cGUsIGlucHV0KTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHggICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpO1xuICAgICAgICBjb25zdCBlcnJvciA9IGNoZWNrU3VidHlwZSh0aGlzLnR5cGUsIHR5cGVPZih2YWx1ZSkpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEV4cGVjdGVkIHZhbHVlIHRvIGJlIG9mIHR5cGUgJHt0b1N0cmluZyh0aGlzLnR5cGUpfSwgYnV0IGZvdW5kICR7dG9TdHJpbmcodHlwZU9mKHZhbHVlKSl9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgfVxuXG4gICAgcG9zc2libGVPdXRwdXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnB1dC5wb3NzaWJsZU91dHB1dHMoKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXlBc3NlcnRpb247XG4iLCIvLyAgICAgIFxuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcbmNvbnN0IHtcbiAgICBPYmplY3RUeXBlLFxuICAgIFZhbHVlVHlwZSxcbiAgICBTdHJpbmdUeXBlLFxuICAgIE51bWJlclR5cGUsXG4gICAgQm9vbGVhblR5cGVcbn0gPSByZXF1aXJlKCcuLi90eXBlcycpO1xuXG5jb25zdCBSdW50aW1lRXJyb3IgPSByZXF1aXJlKCcuLi9ydW50aW1lX2Vycm9yJyk7XG5jb25zdCB7Y2hlY2tTdWJ0eXBlLCB0b1N0cmluZ30gPSByZXF1aXJlKCcuLi90eXBlcycpO1xuY29uc3Qge3R5cGVPZn0gPSByZXF1aXJlKCcuLi92YWx1ZXMnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuY29uc3QgdHlwZXMgPSB7XG4gICAgc3RyaW5nOiBTdHJpbmdUeXBlLFxuICAgIG51bWJlcjogTnVtYmVyVHlwZSxcbiAgICBib29sZWFuOiBCb29sZWFuVHlwZSxcbiAgICBvYmplY3Q6IE9iamVjdFR5cGVcbn07XG5cbmNsYXNzIEFzc2VydGlvbiAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlICAgICAgLCBhcmdzICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzICAgICAgICAgICAgICAsIGNvbnRleHQgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudC5gKTtcblxuICAgICAgICBjb25zdCBuYW1lICAgICAgICAgPSAoYXJnc1swXSAgICAgKTtcbiAgICAgICAgYXNzZXJ0KHR5cGVzW25hbWVdLCBuYW1lKTtcblxuICAgICAgICBjb25zdCB0eXBlID0gdHlwZXNbbmFtZV07XG5cbiAgICAgICAgY29uc3QgcGFyc2VkID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaV0sIGksIFZhbHVlVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKHR5cGUsIHBhcnNlZCk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4ICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmFyZ3NbaV0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gY2hlY2tTdWJ0eXBlKHRoaXMudHlwZSwgdHlwZU9mKHZhbHVlKSk7XG4gICAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpID09PSB0aGlzLmFyZ3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEV4cGVjdGVkIHZhbHVlIHRvIGJlIG9mIHR5cGUgJHt0b1N0cmluZyh0aGlzLnR5cGUpfSwgYnV0IGZvdW5kICR7dG9TdHJpbmcodHlwZU9mKHZhbHVlKSl9IGluc3RlYWQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhc3NlcnQoZmFsc2UpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuYXJncy5mb3JFYWNoKGZuKTtcbiAgICB9XG5cbiAgICBwb3NzaWJsZU91dHB1dHMoKSB7XG4gICAgICAgIHJldHVybiBbXS5jb25jYXQoLi4udGhpcy5hcmdzLm1hcCgoYXJnKSA9PiBhcmcucG9zc2libGVPdXRwdXRzKCkpKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQXNzZXJ0aW9uO1xuIiwiLy8gICAgICBcblxuY29uc3Qge1xuICAgIGFycmF5LFxuICAgIFZhbHVlVHlwZSxcbiAgICBOdW1iZXJUeXBlXG59ID0gcmVxdWlyZSgnLi4vdHlwZXMnKTtcblxuY29uc3QgUnVudGltZUVycm9yID0gcmVxdWlyZSgnLi4vcnVudGltZV9lcnJvcicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuY2xhc3MgQXQgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IodHlwZSAgICAgICwgaW5kZXggICAgICAgICAgICAsIGlucHV0ICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzICAgICAgICAgICAgICAsIGNvbnRleHQgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMylcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCAyIGFyZ3VtZW50cywgYnV0IGZvdW5kICR7YXJncy5sZW5ndGggLSAxfSBpbnN0ZWFkLmApO1xuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gY29udGV4dC5wYXJzZShhcmdzWzFdLCAxLCBOdW1iZXJUeXBlKTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMl0sIDIsIGFycmF5KGNvbnRleHQuZXhwZWN0ZWRUeXBlIHx8IFZhbHVlVHlwZSkpO1xuXG4gICAgICAgIGlmICghaW5kZXggfHwgIWlucHV0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB0ICAgICAgICAgICAgPSAoaW5wdXQudHlwZSAgICAgKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBdCh0Lml0ZW1UeXBlLCBpbmRleCwgaW5wdXQpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eCAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSAoKHRoaXMuaW5kZXguZXZhbHVhdGUoY3R4KSAgICAgKSAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYXJyYXkgPSAoKHRoaXMuaW5wdXQuZXZhbHVhdGUoY3R4KSAgICAgKSAgICAgICAgICAgICAgKTtcblxuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgQXJyYXkgaW5kZXggb3V0IG9mIGJvdW5kczogJHtpbmRleH0gPiAke2FycmF5Lmxlbmd0aH0uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5kZXggIT09IE1hdGguZmxvb3IoaW5kZXgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBBcnJheSBpbmRleCBtdXN0IGJlIGFuIGludGVnZXIsIGJ1dCBmb3VuZCAke2luZGV4fSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFycmF5W2luZGV4XTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGZuKHRoaXMuaW5kZXgpO1xuICAgICAgICBmbih0aGlzLmlucHV0KTtcbiAgICB9XG5cbiAgICBwb3NzaWJsZU91dHB1dHMoKSB7XG4gICAgICAgIHJldHVybiBbdW5kZWZpbmVkXTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQXQ7XG4iLCIvLyAgICAgIFxuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcbmNvbnN0IHsgQm9vbGVhblR5cGUgfSA9IHJlcXVpcmUoJy4uL3R5cGVzJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jbGFzcyBDYXNlICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlICAgICAgLCBicmFuY2hlcyAgICAgICAgICAsIG90aGVyd2lzZSAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmJyYW5jaGVzID0gYnJhbmNoZXM7XG4gICAgICAgIHRoaXMub3RoZXJ3aXNlID0gb3RoZXJ3aXNlO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzICAgICAgICAgICAgICAsIGNvbnRleHQgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDQpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgMyBhcmd1bWVudHMsIGJ1dCBmb3VuZCBvbmx5ICR7YXJncy5sZW5ndGggLSAxfS5gKTtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICUgMiAhPT0gMClcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhbiBvZGQgbnVtYmVyIG9mIGFyZ3VtZW50cy5gKTtcblxuICAgICAgICBsZXQgb3V0cHV0VHlwZSAgICAgICA7XG4gICAgICAgIGlmIChjb250ZXh0LmV4cGVjdGVkVHlwZSAmJiBjb250ZXh0LmV4cGVjdGVkVHlwZS5raW5kICE9PSAndmFsdWUnKSB7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gY29udGV4dC5leHBlY3RlZFR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBicmFuY2hlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoIC0gMTsgaSArPSAyKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0ID0gY29udGV4dC5wYXJzZShhcmdzW2ldLCBpLCBCb29sZWFuVHlwZSk7XG4gICAgICAgICAgICBpZiAoIXRlc3QpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaSArIDFdLCBpICsgMSwgb3V0cHV0VHlwZSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIGJyYW5jaGVzLnB1c2goW3Rlc3QsIHJlc3VsdF0pO1xuXG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gb3V0cHV0VHlwZSB8fCByZXN1bHQudHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG90aGVyd2lzZSA9IGNvbnRleHQucGFyc2UoYXJnc1thcmdzLmxlbmd0aCAtIDFdLCBhcmdzLmxlbmd0aCAtIDEsIG91dHB1dFR5cGUpO1xuICAgICAgICBpZiAoIW90aGVyd2lzZSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgYXNzZXJ0KG91dHB1dFR5cGUpO1xuICAgICAgICByZXR1cm4gbmV3IENhc2UoKG91dHB1dFR5cGUgICAgICksIGJyYW5jaGVzLCBvdGhlcndpc2UpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eCAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgZm9yIChjb25zdCBbdGVzdCwgZXhwcmVzc2lvbl0gb2YgdGhpcy5icmFuY2hlcykge1xuICAgICAgICAgICAgaWYgKHRlc3QuZXZhbHVhdGUoY3R4KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMub3RoZXJ3aXNlLmV2YWx1YXRlKGN0eCk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBmb3IgKGNvbnN0IFt0ZXN0LCBleHByZXNzaW9uXSBvZiB0aGlzLmJyYW5jaGVzKSB7XG4gICAgICAgICAgICBmbih0ZXN0KTtcbiAgICAgICAgICAgIGZuKGV4cHJlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIGZuKHRoaXMub3RoZXJ3aXNlKTtcbiAgICB9XG5cbiAgICBwb3NzaWJsZU91dHB1dHMoKSB7XG4gICAgICAgIHJldHVybiBbXVxuICAgICAgICAgICAgLmNvbmNhdCguLi50aGlzLmJyYW5jaGVzLm1hcCgoW18sIG91dF0pID0+IG91dC5wb3NzaWJsZU91dHB1dHMoKSkpXG4gICAgICAgICAgICAuY29uY2F0KHRoaXMub3RoZXJ3aXNlLnBvc3NpYmxlT3V0cHV0cygpKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ2FzZTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuY29uc3Qge2NoZWNrU3VidHlwZSwgVmFsdWVUeXBlfSA9IHJlcXVpcmUoJy4uL3R5cGVzJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNsYXNzIENvYWxlc2NlICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKHR5cGUgICAgICAsIGFyZ3MgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3MgICAgICAgICAgICAgICwgY29udGV4dCAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoXCJFeHBlY3RlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvdXRwdXRUeXBlICAgICAgID0gKG51bGwgICAgICk7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IGNvbnRleHQuZXhwZWN0ZWRUeXBlO1xuICAgICAgICBpZiAoZXhwZWN0ZWRUeXBlICYmIGV4cGVjdGVkVHlwZS5raW5kICE9PSAndmFsdWUnKSB7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gZXhwZWN0ZWRUeXBlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzLnNsaWNlKDEpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBjb250ZXh0LnBhcnNlKGFyZywgMSArIHBhcnNlZEFyZ3MubGVuZ3RoLCBvdXRwdXRUeXBlLCB1bmRlZmluZWQsIHtvbWl0VHlwZUFubm90YXRpb25zOiB0cnVlfSk7XG4gICAgICAgICAgICBpZiAoIXBhcnNlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gb3V0cHV0VHlwZSB8fCBwYXJzZWQudHlwZTtcbiAgICAgICAgICAgIHBhcnNlZEFyZ3MucHVzaChwYXJzZWQpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChvdXRwdXRUeXBlKTtcblxuICAgICAgICAvLyBBYm92ZSwgd2UgcGFyc2UgYXJndW1lbnRzIHdpdGhvdXQgaW5mZXJyZWQgdHlwZSBhbm5vdGF0aW9uIHNvIHRoYXRcbiAgICAgICAgLy8gdGhleSBkb24ndCBwcm9kdWNlIGEgcnVudGltZSBlcnJvciBmb3IgYG51bGxgIGlucHV0LCB3aGljaCB3b3VsZFxuICAgICAgICAvLyBwcmVlbXB0IHRoZSBkZXNpcmVkIG51bGwtY29hbGVzY2luZyBiZWhhdmlvci5cbiAgICAgICAgLy8gVGh1cywgaWYgYW55IG9mIG91ciBhcmd1bWVudHMgd291bGQgaGF2ZSBuZWVkZWQgYW4gYW5ub3RhdGlvbiwgd2VcbiAgICAgICAgLy8gbmVlZCB0byB3cmFwIHRoZSBlbmNsb3NpbmcgY29hbGVzY2UgZXhwcmVzc2lvbiB3aXRoIGl0IGluc3RlYWQuXG4gICAgICAgIGNvbnN0IG5lZWRzQW5ub3RhdGlvbiA9IGV4cGVjdGVkVHlwZSAmJlxuICAgICAgICAgICAgcGFyc2VkQXJncy5zb21lKGFyZyA9PiBjaGVja1N1YnR5cGUoZXhwZWN0ZWRUeXBlLCBhcmcudHlwZSkpO1xuXG4gICAgICAgIHJldHVybiBuZWVkc0Fubm90YXRpb24gP1xuICAgICAgICAgICAgbmV3IENvYWxlc2NlKFZhbHVlVHlwZSwgcGFyc2VkQXJncykgOlxuICAgICAgICAgICAgbmV3IENvYWxlc2NlKChvdXRwdXRUeXBlICAgICApLCBwYXJzZWRBcmdzKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHggICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiB0aGlzLmFyZ3MpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGFyZy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuYXJncy5mb3JFYWNoKGZuKTtcbiAgICB9XG5cbiAgICBwb3NzaWJsZU91dHB1dHMoKSB7XG4gICAgICAgIHJldHVybiBbXS5jb25jYXQoLi4udGhpcy5hcmdzLm1hcCgoYXJnKSA9PiBhcmcucG9zc2libGVPdXRwdXRzKCkpKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29hbGVzY2U7XG4iLCIvLyAgICAgIFxuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcbmNvbnN0IHtcbiAgICBDb2xvclR5cGUsXG4gICAgVmFsdWVUeXBlLFxuICAgIE51bWJlclR5cGUsXG59ID0gcmVxdWlyZSgnLi4vdHlwZXMnKTtcblxuY29uc3QgeyBDb2xvciwgdmFsaWRhdGVSR0JBIH0gPSByZXF1aXJlKCcuLi92YWx1ZXMnKTtcbmNvbnN0IFJ1bnRpbWVFcnJvciA9IHJlcXVpcmUoJy4uL3J1bnRpbWVfZXJyb3InKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuY29uc3QgdHlwZXMgPSB7XG4gICAgJ3RvLW51bWJlcic6IE51bWJlclR5cGUsXG4gICAgJ3RvLWNvbG9yJzogQ29sb3JUeXBlXG59O1xuXG4vKipcbiAqIFNwZWNpYWwgZm9ybSBmb3IgZXJyb3ItY29hbGVzY2luZyBjb2VyY2lvbiBleHByZXNzaW9ucyBcInRvLW51bWJlclwiLFxuICogXCJ0by1jb2xvclwiLiAgU2luY2UgdGhlc2UgY29lcmNpb25zIGNhbiBmYWlsIGF0IHJ1bnRpbWUsIHRoZXkgYWNjZXB0IG11bHRpcGxlXG4gKiBhcmd1bWVudHMsIG9ubHkgZXZhbHVhdGluZyBvbmUgYXQgYSB0aW1lIHVudGlsIG9uZSBzdWNjZWVkcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBDb2VyY2lvbiAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlICAgICAgLCBhcmdzICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzICAgICAgICAgICAgICAsIGNvbnRleHQgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudC5gKTtcblxuICAgICAgICBjb25zdCBuYW1lICAgICAgICAgPSAoYXJnc1swXSAgICAgKTtcbiAgICAgICAgYXNzZXJ0KHR5cGVzW25hbWVdLCBuYW1lKTtcblxuICAgICAgICBjb25zdCB0eXBlID0gdHlwZXNbbmFtZV07XG5cbiAgICAgICAgY29uc3QgcGFyc2VkID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaV0sIGksIFZhbHVlVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQ29lcmNpb24odHlwZSwgcGFyc2VkKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHggICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUua2luZCA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgbGV0IGlucHV0O1xuICAgICAgICAgICAgbGV0IGVycm9yO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgdGhpcy5hcmdzKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBhcmcuZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgICAgICBlcnJvciA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGN0eC5wYXJzZUNvbG9yKGlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMpIHJldHVybiBjO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA8IDMgfHwgaW5wdXQubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBgSW52YWxpZCByYmdhIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkoaW5wdXQpfTogZXhwZWN0ZWQgYW4gYXJyYXkgY29udGFpbmluZyBlaXRoZXIgdGhyZWUgb3IgZm91ciBudW1lcmljIHZhbHVlcy5gO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSB2YWxpZGF0ZVJHQkEoaW5wdXRbMF0sIGlucHV0WzFdLCBpbnB1dFsyXSwgaW5wdXRbM10pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3IoKGlucHV0WzBdICAgICApIC8gMjU1LCAoaW5wdXRbMV0gICAgICkgLyAyNTUsIChpbnB1dFsyXSAgICAgKSAvIDI1NSwgKGlucHV0WzNdICAgICApKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoZXJyb3IgfHwgYENvdWxkIG5vdCBwYXJzZSBjb2xvciBmcm9tIHZhbHVlICcke3R5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgPyBpbnB1dCA6IEpTT04uc3RyaW5naWZ5KGlucHV0KX0nYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgdGhpcy5hcmdzKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBhcmcuZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKG51bSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBudW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBDb3VsZCBub3QgY29udmVydCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0gdG8gbnVtYmVyLmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLmFyZ3MuZm9yRWFjaChmbik7XG4gICAgfVxuXG4gICAgcG9zc2libGVPdXRwdXRzKCkge1xuICAgICAgICByZXR1cm4gW10uY29uY2F0KC4uLnRoaXMuYXJncy5tYXAoKGFyZykgPT4gYXJnLnBvc3NpYmxlT3V0cHV0cygpKSk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvZXJjaW9uO1xuIiwiLy8gICAgICBcblxuY29uc3Qge1xuICAgIFZhbHVlVHlwZSxcbiAgICBCb29sZWFuVHlwZSxcbn0gPSByZXF1aXJlKCcuLi90eXBlcycpO1xuY29uc3Qge3RvU3RyaW5nfSA9IHJlcXVpcmUoJy4uL3R5cGVzJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmZ1bmN0aW9uIGlzQ29tcGFyYWJsZVR5cGUodHlwZSAgICAgICkge1xuICAgIHJldHVybiB0eXBlLmtpbmQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIHR5cGUua2luZCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgdHlwZS5raW5kID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgdHlwZS5raW5kID09PSAnbnVsbCc7XG59XG5cbi8qKlxuICogU3BlY2lhbCBmb3JtIGZvciA9PSwgIT0sIGltcGxlbWVudGluZyB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZXM6XG4gKiAtIChUMTogQ29tcGFyYWJsZSwgVDI6IENvbXBhcmFibGUpID0+IGJvb2xlYW4geyBUMSA9PSBUMiB9XG4gKiAtIChDb21wYXJhYmxlLCB2YWx1ZSkgPT4gYm9vbGVhblxuICogLSAodmFsdWUsIENvbXBhcmFibGUpID0+IGJvb2xlYW5cbiAqXG4gKiBXaGVyZSBDb21wYXJhYmxlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwuXG4gKlxuICogRXZhbHVhdGlvbiBzZW1hbnRpY3MgZm9yIHRoZSB2YWx1ZSBjYXNlcyBhcmUgZXF1aXZhbGVudCB0byBKYXZhc2NyaXB0J3NcbiAqIHN0cmljdCBlcXVhbGl0eSAoPT09LyE9PSkgLS0gaS5lLiwgd2hlbiB0aGUgdmFsdWUgYXJndW1lbnQncyB0eXBlIGRvZXNuJ3RcbiAqIG1hdGNoIHRoYXQgb2YgdGhlIENvbXBhcmFibGUgYXJndW1lbnQsID09IGV2YWx1YXRlcyB0byBmYWxzZSwgIT0gdG8gdHJ1ZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBtYWtlQ29tcGFyaXNvbihjb21wYXJlKSB7XG4gICAgcmV0dXJuIGNsYXNzIENvbXBhcmlzb24gICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgY29uc3RydWN0b3IobGhzICAgICAgICAgICAgLCByaHMgICAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IEJvb2xlYW5UeXBlO1xuICAgICAgICAgICAgdGhpcy5saHMgPSBsaHM7XG4gICAgICAgICAgICB0aGlzLnJocyA9IHJocztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRpYyBwYXJzZShhcmdzICAgICAgICAgICAgICAsIGNvbnRleHQgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAge1xuICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAzKVxuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCB0d28gYXJndW1lbnRzLmApO1xuXG4gICAgICAgICAgICBjb25zdCBsaHMgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEsIFZhbHVlVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWxocykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByaHMgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMl0sIDIsIFZhbHVlVHlwZSk7XG4gICAgICAgICAgICBpZiAoIXJocykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIGlmICghaXNDb21wYXJhYmxlVHlwZShsaHMudHlwZSkgJiYgIWlzQ29tcGFyYWJsZVR5cGUocmhzLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudCB0byBiZSBhIHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBvciBudWxsLCBidXQgZm91bmQgKCR7dG9TdHJpbmcobGhzLnR5cGUpfSwgJHt0b1N0cmluZyhyaHMudHlwZSl9KSBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGhzLnR5cGUua2luZCAhPT0gcmhzLnR5cGUua2luZCAmJiBsaHMudHlwZS5raW5kICE9PSAndmFsdWUnICYmIHJocy50eXBlLmtpbmQgIT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgQ2Fubm90IGNvbXBhcmUgJHt0b1N0cmluZyhsaHMudHlwZSl9IGFuZCAke3RvU3RyaW5nKHJocy50eXBlKX0uYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFyaXNvbihsaHMsIHJocyk7XG4gICAgICAgIH1cblxuICAgICAgICBldmFsdWF0ZShjdHggICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcGFyZSh0aGlzLmxocy5ldmFsdWF0ZShjdHgpLCB0aGlzLnJocy5ldmFsdWF0ZShjdHgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVhY2hDaGlsZChmbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgIGZuKHRoaXMubGhzKTtcbiAgICAgICAgICAgIGZuKHRoaXMucmhzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvc3NpYmxlT3V0cHV0cygpIHtcbiAgICAgICAgICAgIHJldHVybiBbdHJ1ZSwgZmFsc2VdO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgRXF1YWxzOiBtYWtlQ29tcGFyaXNvbigobGhzLCByaHMpID0+IGxocyA9PT0gcmhzKSxcbiAgICBOb3RFcXVhbHM6IG1ha2VDb21wYXJpc29uKChsaHMsIHJocykgPT4gbGhzICE9PSByaHMpXG59O1xuIiwiLy8gICAgICBcblxuY29uc3Qge1xuICAgIE51bWJlclR5cGUsXG4gICAgU3RyaW5nVHlwZSxcbiAgICBCb29sZWFuVHlwZSxcbiAgICBDb2xvclR5cGUsXG4gICAgT2JqZWN0VHlwZSxcbiAgICBWYWx1ZVR5cGUsXG4gICAgRXJyb3JUeXBlLFxuICAgIGFycmF5LFxuICAgIHRvU3RyaW5nXG59ID0gcmVxdWlyZSgnLi4vdHlwZXMnKTtcblxuY29uc3QgeyB0eXBlT2YsIENvbG9yLCB2YWxpZGF0ZVJHQkEgfSA9IHJlcXVpcmUoJy4uL3ZhbHVlcycpO1xuY29uc3QgeyBDb21wb3VuZEV4cHJlc3Npb24sIHZhcmFyZ3MgfSA9IHJlcXVpcmUoJy4uL2NvbXBvdW5kX2V4cHJlc3Npb24nKTtcbmNvbnN0IFJ1bnRpbWVFcnJvciA9IHJlcXVpcmUoJy4uL3J1bnRpbWVfZXJyb3InKTtcbmNvbnN0IExldCA9IHJlcXVpcmUoJy4vbGV0Jyk7XG5jb25zdCBWYXIgPSByZXF1aXJlKCcuL3ZhcicpO1xuY29uc3QgTGl0ZXJhbCA9IHJlcXVpcmUoJy4vbGl0ZXJhbCcpO1xuY29uc3QgQXNzZXJ0aW9uID0gcmVxdWlyZSgnLi9hc3NlcnRpb24nKTtcbmNvbnN0IEFycmF5QXNzZXJ0aW9uID0gcmVxdWlyZSgnLi9hcnJheScpO1xuY29uc3QgQ29lcmNpb24gPSByZXF1aXJlKCcuL2NvZXJjaW9uJyk7XG5jb25zdCBBdCA9IHJlcXVpcmUoJy4vYXQnKTtcbmNvbnN0IE1hdGNoID0gcmVxdWlyZSgnLi9tYXRjaCcpO1xuY29uc3QgQ2FzZSA9IHJlcXVpcmUoJy4vY2FzZScpO1xuY29uc3QgU3RlcCA9IHJlcXVpcmUoJy4vc3RlcCcpO1xuY29uc3QgSW50ZXJwb2xhdGUgPSByZXF1aXJlKCcuL2ludGVycG9sYXRlJyk7XG5jb25zdCBDb2FsZXNjZSA9IHJlcXVpcmUoJy4vY29hbGVzY2UnKTtcbmNvbnN0IHtFcXVhbHMsIE5vdEVxdWFsc30gPSByZXF1aXJlKCcuL2VxdWFscycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jb25zdCBleHByZXNzaW9ucyAgICAgICAgICAgICAgICAgICAgID0ge1xuICAgIC8vIHNwZWNpYWwgZm9ybXNcbiAgICAnPT0nOiBFcXVhbHMsXG4gICAgJyE9JzogTm90RXF1YWxzLFxuICAgICdhcnJheSc6IEFycmF5QXNzZXJ0aW9uLFxuICAgICdhdCc6IEF0LFxuICAgICdib29sZWFuJzogQXNzZXJ0aW9uLFxuICAgICdjYXNlJzogQ2FzZSxcbiAgICAnY29hbGVzY2UnOiBDb2FsZXNjZSxcbiAgICAnaW50ZXJwb2xhdGUnOiBJbnRlcnBvbGF0ZSxcbiAgICAnbGV0JzogTGV0LFxuICAgICdsaXRlcmFsJzogTGl0ZXJhbCxcbiAgICAnbWF0Y2gnOiBNYXRjaCxcbiAgICAnbnVtYmVyJzogQXNzZXJ0aW9uLFxuICAgICdvYmplY3QnOiBBc3NlcnRpb24sXG4gICAgJ3N0ZXAnOiBTdGVwLFxuICAgICdzdHJpbmcnOiBBc3NlcnRpb24sXG4gICAgJ3RvLWNvbG9yJzogQ29lcmNpb24sXG4gICAgJ3RvLW51bWJlcic6IENvZXJjaW9uLFxuICAgICd2YXInOiBWYXJcbn07XG5cbmZ1bmN0aW9uIHJnYmEoY3R4LCBbciwgZywgYiwgYV0pIHtcbiAgICByID0gci5ldmFsdWF0ZShjdHgpO1xuICAgIGcgPSBnLmV2YWx1YXRlKGN0eCk7XG4gICAgYiA9IGIuZXZhbHVhdGUoY3R4KTtcbiAgICBjb25zdCBhbHBoYSA9IGEgPyBhLmV2YWx1YXRlKGN0eCkgOiAxO1xuICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGVSR0JBKHIsIGcsIGIsIGFscGhhKTtcbiAgICBpZiAoZXJyb3IpIHRocm93IG5ldyBSdW50aW1lRXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiBuZXcgQ29sb3IociAvIDI1NSAqIGFscGhhLCBnIC8gMjU1ICogYWxwaGEsIGIgLyAyNTUgKiBhbHBoYSwgYWxwaGEpO1xufVxuXG5mdW5jdGlvbiBoYXMoa2V5LCBvYmopIHtcbiAgICByZXR1cm4ga2V5IGluIG9iajtcbn1cblxuZnVuY3Rpb24gZ2V0KGtleSwgb2JqKSB7XG4gICAgY29uc3QgdiA9IG9ialtrZXldO1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogdjtcbn1cblxuZnVuY3Rpb24gbGVuZ3RoKGN0eCwgW3ZdKSB7XG4gICAgcmV0dXJuIHYuZXZhbHVhdGUoY3R4KS5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIGx0KGN0eCwgW2EsIGJdKSB7IHJldHVybiBhLmV2YWx1YXRlKGN0eCkgPCBiLmV2YWx1YXRlKGN0eCk7IH1cbmZ1bmN0aW9uIGd0KGN0eCwgW2EsIGJdKSB7IHJldHVybiBhLmV2YWx1YXRlKGN0eCkgPiBiLmV2YWx1YXRlKGN0eCk7IH1cbmZ1bmN0aW9uIGx0ZXEoY3R4LCBbYSwgYl0pIHsgcmV0dXJuIGEuZXZhbHVhdGUoY3R4KSA8PSBiLmV2YWx1YXRlKGN0eCk7IH1cbmZ1bmN0aW9uIGd0ZXEoY3R4LCBbYSwgYl0pIHsgcmV0dXJuIGEuZXZhbHVhdGUoY3R4KSA+PSBiLmV2YWx1YXRlKGN0eCk7IH1cblxuZnVuY3Rpb24gYmluYXJ5U2VhcmNoKHYsIGEsIGksIGopIHtcbiAgICB3aGlsZSAoaSA8PSBqKSB7XG4gICAgICAgIGNvbnN0IG0gPSAoaSArIGopID4+IDE7XG4gICAgICAgIGlmIChhW21dID09PSB2KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChhW21dID4gdilcbiAgICAgICAgICAgIGogPSBtIC0gMTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgaSA9IG0gKyAxO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cblxuQ29tcG91bmRFeHByZXNzaW9uLnJlZ2lzdGVyKGV4cHJlc3Npb25zLCB7XG4gICAgJ2Vycm9yJzogW1xuICAgICAgICBFcnJvclR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7IHRocm93IG5ldyBSdW50aW1lRXJyb3Iodi5ldmFsdWF0ZShjdHgpKTsgfVxuICAgIF0sXG4gICAgJ3R5cGVvZic6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFt2XSkgPT4gdG9TdHJpbmcodHlwZU9mKHYuZXZhbHVhdGUoY3R4KSkpXG4gICAgXSxcbiAgICAndG8tc3RyaW5nJzogW1xuICAgICAgICBTdHJpbmdUeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICB2ID0gdi5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiB2O1xuICAgICAgICAgICAgaWYgKHYgPT09IG51bGwgfHwgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodiBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgXSxcbiAgICAndG8tYm9vbGVhbic6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtWYWx1ZVR5cGVdLFxuICAgICAgICAoY3R4LCBbdl0pID0+IEJvb2xlYW4odi5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ3RvLXJnYmEnOiBbXG4gICAgICAgIGFycmF5KE51bWJlclR5cGUsIDQpLFxuICAgICAgICBbQ29sb3JUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7ciwgZywgYiwgYX0gPSB2LmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICByZXR1cm4gWzI1NSAqIHIgLyBhLCAyNTUgKiBnIC8gYSwgMjU1ICogYiAvIGEsIGFdO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAncmdiJzogW1xuICAgICAgICBDb2xvclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlLCBOdW1iZXJUeXBlLCBOdW1iZXJUeXBlXSxcbiAgICAgICAgcmdiYVxuICAgIF0sXG4gICAgJ3JnYmEnOiBbXG4gICAgICAgIENvbG9yVHlwZSxcbiAgICAgICAgW051bWJlclR5cGUsIE51bWJlclR5cGUsIE51bWJlclR5cGUsIE51bWJlclR5cGVdLFxuICAgICAgICByZ2JhXG4gICAgXSxcbiAgICAnbGVuZ3RoJzoge1xuICAgICAgICB0eXBlOiBOdW1iZXJUeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbU3RyaW5nVHlwZV0sXG4gICAgICAgICAgICAgICAgbGVuZ3RoXG4gICAgICAgICAgICBdLCBbXG4gICAgICAgICAgICAgICAgW2FycmF5KFZhbHVlVHlwZSldLFxuICAgICAgICAgICAgICAgIGxlbmd0aFxuICAgICAgICAgICAgXVxuICAgICAgICBdXG4gICAgfSxcbiAgICAnaGFzJzoge1xuICAgICAgICB0eXBlOiBCb29sZWFuVHlwZSxcbiAgICAgICAgb3ZlcmxvYWRzOiBbXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFtrZXldKSA9PiBoYXMoa2V5LmV2YWx1YXRlKGN0eCksIGN0eC5wcm9wZXJ0aWVzKCkpXG4gICAgICAgICAgICBdLCBbXG4gICAgICAgICAgICAgICAgW1N0cmluZ1R5cGUsIE9iamVjdFR5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFtrZXksIG9ial0pID0+IGhhcyhrZXkuZXZhbHVhdGUoY3R4KSwgb2JqLmV2YWx1YXRlKGN0eCkpXG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICdnZXQnOiB7XG4gICAgICAgIHR5cGU6IFZhbHVlVHlwZSxcbiAgICAgICAgb3ZlcmxvYWRzOiBbXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFtrZXldKSA9PiBnZXQoa2V5LmV2YWx1YXRlKGN0eCksIGN0eC5wcm9wZXJ0aWVzKCkpXG4gICAgICAgICAgICBdLCBbXG4gICAgICAgICAgICAgICAgW1N0cmluZ1R5cGUsIE9iamVjdFR5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFtrZXksIG9ial0pID0+IGdldChrZXkuZXZhbHVhdGUoY3R4KSwgb2JqLmV2YWx1YXRlKGN0eCkpXG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICdwcm9wZXJ0aWVzJzogW1xuICAgICAgICBPYmplY3RUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4LnByb3BlcnRpZXMoKVxuICAgIF0sXG4gICAgJ2dlb21ldHJ5LXR5cGUnOiBbXG4gICAgICAgIFN0cmluZ1R5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoY3R4KSA9PiBjdHguZ2VvbWV0cnlUeXBlKClcbiAgICBdLFxuICAgICdpZCc6IFtcbiAgICAgICAgVmFsdWVUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4LmlkKClcbiAgICBdLFxuICAgICd6b29tJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4Lmdsb2JhbHMuem9vbVxuICAgIF0sXG4gICAgJ2hlYXRtYXAtZGVuc2l0eSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5nbG9iYWxzLmhlYXRtYXBEZW5zaXR5IHx8IDBcbiAgICBdLFxuICAgICcrJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICB2YXJhcmdzKE51bWJlclR5cGUpLFxuICAgICAgICAoY3R4LCBhcmdzKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gYXJnLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnKic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgdmFyYXJncyhOdW1iZXJUeXBlKSxcbiAgICAgICAgKGN0eCwgYXJncykgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IDE7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICo9IGFyZy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJy0nOiB7XG4gICAgICAgIHR5cGU6IE51bWJlclR5cGUsXG4gICAgICAgIG92ZXJsb2FkczogW1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFtOdW1iZXJUeXBlLCBOdW1iZXJUeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSAtIGIuZXZhbHVhdGUoY3R4KVxuICAgICAgICAgICAgXSwgW1xuICAgICAgICAgICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBbYV0pID0+IC1hLmV2YWx1YXRlKGN0eClcbiAgICAgICAgICAgIF1cbiAgICAgICAgXVxuICAgIH0sXG4gICAgJy8nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlLCBOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW2EsIGJdKSA9PiBhLmV2YWx1YXRlKGN0eCkgLyBiLmV2YWx1YXRlKGN0eClcbiAgICBdLFxuICAgICclJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZSwgTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFthLCBiXSkgPT4gYS5ldmFsdWF0ZShjdHgpICUgYi5ldmFsdWF0ZShjdHgpXG4gICAgXSxcbiAgICAnbG4yJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKCkgPT4gTWF0aC5MTjJcbiAgICBdLFxuICAgICdwaSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgICgpID0+IE1hdGguUElcbiAgICBdLFxuICAgICdlJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKCkgPT4gTWF0aC5FXG4gICAgXSxcbiAgICAnXic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGUsIE51bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbYiwgZV0pID0+IE1hdGgucG93KGIuZXZhbHVhdGUoY3R4KSwgZS5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ3NxcnQnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW3hdKSA9PiBNYXRoLnNxcnQoeC5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ2xvZzEwJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5sb2cxMChuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnbG4nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLmxvZyhuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnbG9nMic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGgubG9nMihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnc2luJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5zaW4obi5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ2Nvcyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguY29zKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICd0YW4nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLnRhbihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnYXNpbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguYXNpbihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnYWNvcyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguYWNvcyhuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnYXRhbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguYXRhbihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnbWluJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICB2YXJhcmdzKE51bWJlclR5cGUpLFxuICAgICAgICAoY3R4LCBhcmdzKSA9PiBNYXRoLm1pbiguLi5hcmdzLm1hcChhcmcgPT4gYXJnLmV2YWx1YXRlKGN0eCkpKVxuICAgIF0sXG4gICAgJ21heCc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgdmFyYXJncyhOdW1iZXJUeXBlKSxcbiAgICAgICAgKGN0eCwgYXJncykgPT4gTWF0aC5tYXgoLi4uYXJncy5tYXAoYXJnID0+IGFyZy5ldmFsdWF0ZShjdHgpKSlcbiAgICBdLFxuICAgICdmaWx0ZXItPT0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiBjdHgucHJvcGVydGllcygpWyhrICAgICApLnZhbHVlXSA9PT0gKHYgICAgICkudmFsdWVcbiAgICBdLFxuICAgICdmaWx0ZXItaWQtPT0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiBjdHguaWQoKSA9PT0gKHYgICAgICkudmFsdWVcbiAgICBdLFxuICAgICdmaWx0ZXItdHlwZS09PSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiBjdHguZ2VvbWV0cnlUeXBlKCkgPT09ICh2ICAgICApLnZhbHVlXG4gICAgXSxcbiAgICAnZmlsdGVyLTwnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LnByb3BlcnRpZXMoKVsoayAgICAgKS52YWx1ZV07XG4gICAgICAgICAgICBjb25zdCBiID0gKHYgICAgICkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPCBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLTwnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LmlkKCk7XG4gICAgICAgICAgICBjb25zdCBiID0gKHYgICAgICkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPCBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLT4nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LnByb3BlcnRpZXMoKVsoayAgICAgKS52YWx1ZV07XG4gICAgICAgICAgICBjb25zdCBiID0gKHYgICAgICkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPiBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLT4nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LmlkKCk7XG4gICAgICAgICAgICBjb25zdCBiID0gKHYgICAgICkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPiBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLTw9JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGUsIFZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IGN0eC5wcm9wZXJ0aWVzKClbKGsgICAgICkudmFsdWVdO1xuICAgICAgICAgICAgY29uc3QgYiA9ICh2ICAgICApLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBhIDw9IGI7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdmaWx0ZXItaWQtPD0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LmlkKCk7XG4gICAgICAgICAgICBjb25zdCBiID0gKHYgICAgICkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPD0gYjtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ2ZpbHRlci0+PSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlLCBWYWx1ZVR5cGVdLFxuICAgICAgICAoY3R4LCBbaywgdl0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBjdHgucHJvcGVydGllcygpWyhrICAgICApLnZhbHVlXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSAodiAgICAgKS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYSA9PT0gdHlwZW9mIGIgJiYgYSA+PSBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLT49JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFt2XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IGN0eC5pZCgpO1xuICAgICAgICAgICAgY29uc3QgYiA9ICh2ICAgICApLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBhID49IGI7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdmaWx0ZXItaGFzJzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFtrXSkgPT4gKGsgICAgICkudmFsdWUgaW4gY3R4LnByb3BlcnRpZXMoKVxuICAgIF0sXG4gICAgJ2ZpbHRlci1oYXMtaWQnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4LmlkKCkgIT09IG51bGxcbiAgICBdLFxuICAgICdmaWx0ZXItdHlwZS1pbic6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFthcnJheShTdHJpbmdUeXBlKV0sXG4gICAgICAgIChjdHgsIFt2XSkgPT4gKHYgICAgICkudmFsdWUuaW5kZXhPZihjdHguZ2VvbWV0cnlUeXBlKCkpID49IDBcbiAgICBdLFxuICAgICdmaWx0ZXItaWQtaW4nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbYXJyYXkoVmFsdWVUeXBlKV0sXG4gICAgICAgIChjdHgsIFt2XSkgPT4gKHYgICAgICkudmFsdWUuaW5kZXhPZihjdHguaWQoKSkgPj0gMFxuICAgIF0sXG4gICAgJ2ZpbHRlci1pbi1zbWFsbCc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlLCBhcnJheShWYWx1ZVR5cGUpXSxcbiAgICAgICAgLy8gYXNzdW1lcyB2IGlzIGFuIGFycmF5IGxpdGVyYWxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiAodiAgICAgKS52YWx1ZS5pbmRleE9mKGN0eC5wcm9wZXJ0aWVzKClbKGsgICAgICkudmFsdWVdKSA+PSAwXG4gICAgXSxcbiAgICAnZmlsdGVyLWluLWxhcmdlJzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGUsIGFycmF5KFZhbHVlVHlwZSldLFxuICAgICAgICAvLyBhc3N1bWVzIHYgaXMgYSBhcnJheSBsaXRlcmFsIHdpdGggdmFsdWVzIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYW5kIG9mIGEgc2luZ2xlIHR5cGVcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiBiaW5hcnlTZWFyY2goY3R4LnByb3BlcnRpZXMoKVsoayAgICAgKS52YWx1ZV0sICh2ICAgICApLnZhbHVlLCAwLCAodiAgICAgKS52YWx1ZS5sZW5ndGggLSAxKVxuICAgIF0sXG4gICAgJz4nOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW5UeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtbTnVtYmVyVHlwZSwgTnVtYmVyVHlwZV0sIGd0XSxcbiAgICAgICAgICAgIFtbU3RyaW5nVHlwZSwgU3RyaW5nVHlwZV0sIGd0XVxuICAgICAgICBdXG4gICAgfSxcbiAgICAnPCc6IHtcbiAgICAgICAgdHlwZTogQm9vbGVhblR5cGUsXG4gICAgICAgIG92ZXJsb2FkczogW1xuICAgICAgICAgICAgW1tOdW1iZXJUeXBlLCBOdW1iZXJUeXBlXSwgbHRdLFxuICAgICAgICAgICAgW1tTdHJpbmdUeXBlLCBTdHJpbmdUeXBlXSwgbHRdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICc+PSc6IHtcbiAgICAgICAgdHlwZTogQm9vbGVhblR5cGUsXG4gICAgICAgIG92ZXJsb2FkczogW1xuICAgICAgICAgICAgW1tOdW1iZXJUeXBlLCBOdW1iZXJUeXBlXSwgZ3RlcV0sXG4gICAgICAgICAgICBbW1N0cmluZ1R5cGUsIFN0cmluZ1R5cGVdLCBndGVxXVxuICAgICAgICBdXG4gICAgfSxcbiAgICAnPD0nOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW5UeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtbTnVtYmVyVHlwZSwgTnVtYmVyVHlwZV0sIGx0ZXFdLFxuICAgICAgICAgICAgW1tTdHJpbmdUeXBlLCBTdHJpbmdUeXBlXSwgbHRlcV1cbiAgICAgICAgXVxuICAgIH0sXG4gICAgJ2FsbCc6IHtcbiAgICAgICAgdHlwZTogQm9vbGVhblR5cGUsXG4gICAgICAgIG92ZXJsb2FkczogW1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFtCb29sZWFuVHlwZSwgQm9vbGVhblR5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFthLCBiXSkgPT4gYS5ldmFsdWF0ZShjdHgpICYmIGIuZXZhbHVhdGUoY3R4KVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB2YXJhcmdzKEJvb2xlYW5UeXBlKSxcbiAgICAgICAgICAgICAgICAoY3R4LCBhcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJnLmV2YWx1YXRlKGN0eCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgXVxuICAgIH0sXG4gICAgJ2FueSc6IHtcbiAgICAgICAgdHlwZTogQm9vbGVhblR5cGUsXG4gICAgICAgIG92ZXJsb2FkczogW1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFtCb29sZWFuVHlwZSwgQm9vbGVhblR5cGVdLFxuICAgICAgICAgICAgICAgIChjdHgsIFthLCBiXSkgPT4gYS5ldmFsdWF0ZShjdHgpIHx8IGIuZXZhbHVhdGUoY3R4KVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB2YXJhcmdzKEJvb2xlYW5UeXBlKSxcbiAgICAgICAgICAgICAgICAoY3R4LCBhcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmcuZXZhbHVhdGUoY3R4KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICBdXG4gICAgfSxcbiAgICAnISc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtCb29sZWFuVHlwZV0sXG4gICAgICAgIChjdHgsIFtiXSkgPT4gIWIuZXZhbHVhdGUoY3R4KVxuICAgIF0sXG4gICAgJ3VwY2FzZSc6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAoY3R4LCBbc10pID0+IHMuZXZhbHVhdGUoY3R4KS50b1VwcGVyQ2FzZSgpXG4gICAgXSxcbiAgICAnZG93bmNhc2UnOiBbXG4gICAgICAgIFN0cmluZ1R5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW3NdKSA9PiBzLmV2YWx1YXRlKGN0eCkudG9Mb3dlckNhc2UoKVxuICAgIF0sXG4gICAgJ2NvbmNhdCc6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgdmFyYXJncyhTdHJpbmdUeXBlKSxcbiAgICAgICAgKGN0eCwgYXJncykgPT4gYXJncy5tYXAoYXJnID0+IGFyZy5ldmFsdWF0ZShjdHgpKS5qb2luKCcnKVxuICAgIF1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cHJlc3Npb25zO1xuIiwiLy8gICAgICBcblxuY29uc3QgVW5pdEJlemllciA9IHJlcXVpcmUoJ0BtYXBib3gvdW5pdGJlemllcicpO1xuY29uc3QgaW50ZXJwb2xhdGUgPSByZXF1aXJlKCcuLi8uLi91dGlsL2ludGVycG9sYXRlJyk7XG5jb25zdCB7IHRvU3RyaW5nLCBOdW1iZXJUeXBlIH0gPSByZXF1aXJlKCcuLi90eXBlcycpO1xuY29uc3QgeyBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvIH0gPSByZXF1aXJlKFwiLi4vc3RvcHNcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jbGFzcyBJbnRlcnBvbGF0ZSAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlICAgICAgLCBpbnRlcnBvbGF0aW9uICAgICAgICAgICAgICAgICAgICwgaW5wdXQgICAgICAgICAgICAsIHN0b3BzICAgICAgICkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmludGVycG9sYXRpb24gPSBpbnRlcnBvbGF0aW9uO1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG5cbiAgICAgICAgdGhpcy5sYWJlbHMgPSBbXTtcbiAgICAgICAgdGhpcy5vdXRwdXRzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgW2xhYmVsLCBleHByZXNzaW9uXSBvZiBzdG9wcykge1xuICAgICAgICAgICAgdGhpcy5sYWJlbHMucHVzaChsYWJlbCk7XG4gICAgICAgICAgICB0aGlzLm91dHB1dHMucHVzaChleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcnBvbGF0aW9uRmFjdG9yKGludGVycG9sYXRpb24gICAgICAgICAgICAgICAgICAgLCBpbnB1dCAgICAgICAgLCBsb3dlciAgICAgICAgLCB1cHBlciAgICAgICAgKSB7XG4gICAgICAgIGxldCB0ID0gMDtcbiAgICAgICAgaWYgKGludGVycG9sYXRpb24ubmFtZSA9PT0gJ2V4cG9uZW50aWFsJykge1xuICAgICAgICAgICAgdCA9IGV4cG9uZW50aWFsSW50ZXJwb2xhdGlvbihpbnB1dCwgaW50ZXJwb2xhdGlvbi5iYXNlLCBsb3dlciwgdXBwZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKGludGVycG9sYXRpb24ubmFtZSA9PT0gJ2xpbmVhcicpIHtcbiAgICAgICAgICAgIHQgPSBleHBvbmVudGlhbEludGVycG9sYXRpb24oaW5wdXQsIDEsIGxvd2VyLCB1cHBlcik7XG4gICAgICAgIH0gZWxzZSBpZiAoaW50ZXJwb2xhdGlvbi5uYW1lID09PSAnY3ViaWMtYmV6aWVyJykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGludGVycG9sYXRpb24uY29udHJvbFBvaW50cztcbiAgICAgICAgICAgIGNvbnN0IHViID0gbmV3IFVuaXRCZXppZXIoY1swXSwgY1sxXSwgY1syXSwgY1szXSk7XG4gICAgICAgICAgICB0ID0gdWIuc29sdmUoZXhwb25lbnRpYWxJbnRlcnBvbGF0aW9uKGlucHV0LCAxLCBsb3dlciwgdXBwZXIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJncyAgICAgICAgICAgICAgLCBjb250ZXh0ICAgICAgICAgICAgICAgICkge1xuICAgICAgICBsZXQgWyAsIGludGVycG9sYXRpb24sIGlucHV0LCAuLi5yZXN0XSA9IGFyZ3M7XG5cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGludGVycG9sYXRpb24pIHx8IGludGVycG9sYXRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYW4gaW50ZXJwb2xhdGlvbiB0eXBlIGV4cHJlc3Npb24uYCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW50ZXJwb2xhdGlvblswXSA9PT0gJ2xpbmVhcicpIHtcbiAgICAgICAgICAgIGludGVycG9sYXRpb24gPSB7IG5hbWU6ICdsaW5lYXInIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaW50ZXJwb2xhdGlvblswXSA9PT0gJ2V4cG9uZW50aWFsJykge1xuICAgICAgICAgICAgY29uc3QgYmFzZSA9IGludGVycG9sYXRpb25bMV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGJhc2UgIT09ICdudW1iZXInKVxuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBvbmVudGlhbCBpbnRlcnBvbGF0aW9uIHJlcXVpcmVzIGEgbnVtZXJpYyBiYXNlLmAsIDEsIDEpO1xuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZXhwb25lbnRpYWwnLFxuICAgICAgICAgICAgICAgIGJhc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaW50ZXJwb2xhdGlvblswXSA9PT0gJ2N1YmljLWJlemllcicpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xQb2ludHMgPSBpbnRlcnBvbGF0aW9uLnNsaWNlKDEpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGNvbnRyb2xQb2ludHMubGVuZ3RoICE9PSA0IHx8XG4gICAgICAgICAgICAgICAgY29udHJvbFBvaW50cy5zb21lKHQgPT4gdHlwZW9mIHQgIT09ICdudW1iZXInIHx8IHQgPCAwIHx8IHQgPiAxKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ0N1YmljIGJlemllciBpbnRlcnBvbGF0aW9uIHJlcXVpcmVzIGZvdXIgbnVtZXJpYyBhcmd1bWVudHMgd2l0aCB2YWx1ZXMgYmV0d2VlbiAwIGFuZCAxLicsIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdjdWJpYy1iZXppZXInLFxuICAgICAgICAgICAgICAgIGNvbnRyb2xQb2ludHM6IChjb250cm9sUG9pbnRzICAgICApXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYFVua25vd24gaW50ZXJwb2xhdGlvbiB0eXBlICR7U3RyaW5nKGludGVycG9sYXRpb25bMF0pfWAsIDEsIDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIC0gMSA8IDQpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCA0IGFyZ3VtZW50cywgYnV0IGZvdW5kIG9ubHkgJHthcmdzLmxlbmd0aCAtIDF9LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChhcmdzLmxlbmd0aCAtIDEpICUgMiAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFuIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cy5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0ID0gY29udGV4dC5wYXJzZShpbnB1dCwgMiwgTnVtYmVyVHlwZSk7XG4gICAgICAgIGlmICghaW5wdXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHN0b3BzICAgICAgICA9IFtdO1xuXG4gICAgICAgIGxldCBvdXRwdXRUeXBlICAgICAgID0gKG51bGwgICAgICk7XG4gICAgICAgIGlmIChjb250ZXh0LmV4cGVjdGVkVHlwZSAmJiBjb250ZXh0LmV4cGVjdGVkVHlwZS5raW5kICE9PSAndmFsdWUnKSB7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gY29udGV4dC5leHBlY3RlZFR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3QubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gcmVzdFtpXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVzdFtpICsgMV07XG5cbiAgICAgICAgICAgIGNvbnN0IGxhYmVsS2V5ID0gaSArIDM7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZUtleSA9IGkgKyA0O1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGxhYmVsICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKCdJbnB1dC9vdXRwdXQgcGFpcnMgZm9yIFwiaW50ZXJwb2xhdGVcIiBleHByZXNzaW9ucyBtdXN0IGJlIGRlZmluZWQgdXNpbmcgbGl0ZXJhbCBudW1lcmljIHZhbHVlcyAobm90IGNvbXB1dGVkIGV4cHJlc3Npb25zKSBmb3IgdGhlIGlucHV0IHZhbHVlcy4nLCBsYWJlbEtleSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdG9wcy5sZW5ndGggJiYgc3RvcHNbc3RvcHMubGVuZ3RoIC0gMV1bMF0gPj0gbGFiZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcignSW5wdXQvb3V0cHV0IHBhaXJzIGZvciBcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbnMgbXVzdCBiZSBhcnJhbmdlZCB3aXRoIGlucHV0IHZhbHVlcyBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIuJywgbGFiZWxLZXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBjb250ZXh0LnBhcnNlKHZhbHVlLCB2YWx1ZUtleSwgb3V0cHV0VHlwZSk7XG4gICAgICAgICAgICBpZiAoIXBhcnNlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gb3V0cHV0VHlwZSB8fCBwYXJzZWQudHlwZTtcbiAgICAgICAgICAgIHN0b3BzLnB1c2goW2xhYmVsLCBwYXJzZWRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvdXRwdXRUeXBlLmtpbmQgIT09ICdudW1iZXInICYmXG4gICAgICAgICAgICBvdXRwdXRUeXBlLmtpbmQgIT09ICdjb2xvcicgJiZcbiAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgb3V0cHV0VHlwZS5raW5kID09PSAnYXJyYXknICYmXG4gICAgICAgICAgICAgICAgb3V0cHV0VHlwZS5pdGVtVHlwZS5raW5kID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBvdXRwdXRUeXBlLk4gPT09ICdudW1iZXInXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYFR5cGUgJHt0b1N0cmluZyhvdXRwdXRUeXBlKX0gaXMgbm90IGludGVycG9sYXRhYmxlLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcnBvbGF0ZShvdXRwdXRUeXBlLCBpbnRlcnBvbGF0aW9uLCBpbnB1dCwgc3RvcHMpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eCAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgY29uc3QgbGFiZWxzID0gdGhpcy5sYWJlbHM7XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSB0aGlzLm91dHB1dHM7XG5cbiAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXRzWzBdLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9ICgodGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpICAgICApICAgICAgICApO1xuICAgICAgICBpZiAodmFsdWUgPD0gbGFiZWxzWzBdKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0c1swXS5ldmFsdWF0ZShjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RvcENvdW50ID0gbGFiZWxzLmxlbmd0aDtcbiAgICAgICAgaWYgKHZhbHVlID49IGxhYmVsc1tzdG9wQ291bnQgLSAxXSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dHNbc3RvcENvdW50IC0gMV0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUbyhsYWJlbHMsIHZhbHVlKTtcbiAgICAgICAgY29uc3QgbG93ZXIgPSBsYWJlbHNbaW5kZXhdO1xuICAgICAgICBjb25zdCB1cHBlciA9IGxhYmVsc1tpbmRleCArIDFdO1xuICAgICAgICBjb25zdCB0ID0gSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3Rvcih0aGlzLmludGVycG9sYXRpb24sIHZhbHVlLCBsb3dlciwgdXBwZXIpO1xuXG4gICAgICAgIGNvbnN0IG91dHB1dExvd2VyID0gb3V0cHV0c1tpbmRleF0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgY29uc3Qgb3V0cHV0VXBwZXIgPSBvdXRwdXRzW2luZGV4ICsgMV0uZXZhbHVhdGUoY3R4KTtcblxuICAgICAgICByZXR1cm4gKGludGVycG9sYXRlW3RoaXMudHlwZS5raW5kLnRvTG93ZXJDYXNlKCldICAgICApKG91dHB1dExvd2VyLCBvdXRwdXRVcHBlciwgdCk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBmbih0aGlzLmlucHV0KTtcbiAgICAgICAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIHRoaXMub3V0cHV0cykge1xuICAgICAgICAgICAgZm4oZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwb3NzaWJsZU91dHB1dHMoKSB7XG4gICAgICAgIHJldHVybiBbXS5jb25jYXQoLi4udGhpcy5vdXRwdXRzLm1hcCgob3V0cHV0KSA9PiBvdXRwdXQucG9zc2libGVPdXRwdXRzKCkpKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHJhdGlvIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiBleHBvbmVudGlhbCBmdW5jdGlvblxuICogc3RvcHMuXG4gKiBIb3cgaXQgd29ya3M6IFR3byBjb25zZWN1dGl2ZSBzdG9wIHZhbHVlcyBkZWZpbmUgYSAoc2NhbGVkIGFuZCBzaGlmdGVkKSBleHBvbmVudGlhbCBmdW5jdGlvbiBgZih4KSA9IGEgKiBiYXNlXnggKyBiYCwgd2hlcmUgYGJhc2VgIGlzIHRoZSB1c2VyLXNwZWNpZmllZCBiYXNlLFxuICogYW5kIGBhYCBhbmQgYGJgIGFyZSBjb25zdGFudHMgYWZmb3JkaW5nIHN1ZmZpY2llbnQgZGVncmVlcyBvZiBmcmVlZG9tIHRvIGZpdFxuICogdGhlIGZ1bmN0aW9uIHRvIHRoZSBnaXZlbiBzdG9wcy5cbiAqXG4gKiBIZXJlJ3MgYSBiaXQgb2YgYWxnZWJyYSB0aGF0IGxldHMgdXMgY29tcHV0ZSBgZih4KWAgZGlyZWN0bHkgZnJvbSB0aGUgc3RvcFxuICogdmFsdWVzIHdpdGhvdXQgZXhwbGljaXRseSBzb2x2aW5nIGZvciBgYWAgYW5kIGBiYDpcbiAqXG4gKiBGaXJzdCBzdG9wIHZhbHVlOiBgZih4MCkgPSB5MCA9IGEgKiBiYXNlXngwICsgYmBcbiAqIFNlY29uZCBzdG9wIHZhbHVlOiBgZih4MSkgPSB5MSA9IGEgKiBiYXNlXngxICsgYmBcbiAqID0+IGB5MSAtIHkwID0gYShiYXNlXngxIC0gYmFzZV54MClgXG4gKiA9PiBgYSA9ICh5MSAtIHkwKS8oYmFzZV54MSAtIGJhc2VeeDApYFxuICpcbiAqIERlc2lyZWQgdmFsdWU6IGBmKHgpID0geSA9IGEgKiBiYXNlXnggKyBiYFxuICogPT4gYGYoeCkgPSB5MCArIGEgKiAoYmFzZV54IC0gYmFzZV54MClgXG4gKlxuICogRnJvbSB0aGUgYWJvdmUsIHdlIGNhbiByZXBsYWNlIHRoZSBgYWAgaW4gYGEgKiAoYmFzZV54IC0gYmFzZV54MClgIGFuZCBkbyBhXG4gKiBsaXR0bGUgYWxnZWJyYTpcbiAqIGBgYFxuICogYSAqIChiYXNlXnggLSBiYXNlXngwKSA9ICh5MSAtIHkwKS8oYmFzZV54MSAtIGJhc2VeeDApICogKGJhc2VeeCAtIGJhc2VeeDApXG4gKiAgICAgICAgICAgICAgICAgICAgID0gKHkxIC0geTApICogKGJhc2VeeCAtIGJhc2VeeDApIC8gKGJhc2VeeDEgLSBiYXNlXngwKVxuICogYGBgXG4gKlxuICogSWYgd2UgbGV0IGAoYmFzZV54IC0gYmFzZV54MCkgLyAoYmFzZV54MSBiYXNlXngwKWAsIHRoZW4gd2UgaGF2ZVxuICogYGYoeCkgPSB5MCArICh5MSAtIHkwKSAqIHJhdGlvYC4gIEluIG90aGVyIHdvcmRzLCBgcmF0aW9gIG1heSBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbnRlcnBvbGF0aW9uIGZhY3RvciBiZXR3ZWVuIHRoZSB0d28gc3RvcHMnIG91dHB1dCB2YWx1ZXMuXG4gKlxuICogKE5vdGU6IGEgc2xpZ2h0bHkgZGlmZmVyZW50IGZvcm0gZm9yIGByYXRpb2AsXG4gKiBgKGJhc2VeKHgteDApIC0gMSkgLyAoYmFzZV4oeDEteDApIC0gMSkgYCwgaXMgZXF1aXZhbGVudCwgYnV0IHJlcXVpcmVzIGZld2VyXG4gKiBleHBlbnNpdmUgYE1hdGgucG93KClgIG9wZXJhdGlvbnMuKVxuICpcbiAqIEBwcml2YXRlXG4qL1xuZnVuY3Rpb24gZXhwb25lbnRpYWxJbnRlcnBvbGF0aW9uKGlucHV0LCBiYXNlLCBsb3dlclZhbHVlLCB1cHBlclZhbHVlKSB7XG4gICAgY29uc3QgZGlmZmVyZW5jZSA9IHVwcGVyVmFsdWUgLSBsb3dlclZhbHVlO1xuICAgIGNvbnN0IHByb2dyZXNzID0gaW5wdXQgLSBsb3dlclZhbHVlO1xuXG4gICAgaWYgKGRpZmZlcmVuY2UgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIGlmIChiYXNlID09PSAxKSB7XG4gICAgICAgIHJldHVybiBwcm9ncmVzcyAvIGRpZmZlcmVuY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChNYXRoLnBvdyhiYXNlLCBwcm9ncmVzcykgLSAxKSAvIChNYXRoLnBvdyhiYXNlLCBkaWZmZXJlbmNlKSAtIDEpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBJbnRlcnBvbGF0ZTtcbiIsIi8vICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jbGFzcyBMZXQgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoYmluZGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgcmVzdWx0ICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHJlc3VsdC50eXBlO1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0gW10uY29uY2F0KGJpbmRpbmdzKTtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4ICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBjdHgucHVzaFNjb3BlKHRoaXMuYmluZGluZ3MpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnJlc3VsdC5ldmFsdWF0ZShjdHgpO1xuICAgICAgICBjdHgucG9wU2NvcGUoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGZvciAoY29uc3QgYmluZGluZyBvZiB0aGlzLmJpbmRpbmdzKSB7XG4gICAgICAgICAgICBmbihiaW5kaW5nWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBmbih0aGlzLnJlc3VsdCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3MgICAgICAgICAgICAgICwgY29udGV4dCAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgNClcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCAzIGFyZ3VtZW50cywgYnV0IGZvdW5kICR7YXJncy5sZW5ndGggLSAxfSBpbnN0ZWFkLmApO1xuXG4gICAgICAgIGNvbnN0IGJpbmRpbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aCAtIDE7IGkgKz0gMikge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGFyZ3NbaV07XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgc3RyaW5nLCBidXQgZm91bmQgJHt0eXBlb2YgbmFtZX0gaW5zdGVhZC5gLCBpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKC9bXmEtekEtWjAtOV9dLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYFZhcmlhYmxlIG5hbWVzIG11c3QgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9yICdfJy5gLCBpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaSArIDFdLCBpICsgMSk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgYmluZGluZ3MucHVzaChbbmFtZSwgdmFsdWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQucGFyc2UoYXJnc1thcmdzLmxlbmd0aCAtIDFdLCBhcmdzLmxlbmd0aCAtIDEsIHVuZGVmaW5lZCwgYmluZGluZ3MpO1xuICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMZXQoYmluZGluZ3MsIHJlc3VsdCk7XG4gICAgfVxuXG4gICAgcG9zc2libGVPdXRwdXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHQucG9zc2libGVPdXRwdXRzKCk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IExldDtcbiIsIi8vICAgICAgXG5cbmNvbnN0IHsgaXNWYWx1ZSwgdHlwZU9mIH0gPSByZXF1aXJlKCcuLi92YWx1ZXMnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jbGFzcyBMaXRlcmFsICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlICAgICAgLCB2YWx1ZSAgICAgICApIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzICAgICAgICAgICAgICAsIGNvbnRleHQgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMilcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGAnbGl0ZXJhbCcgZXhwcmVzc2lvbiByZXF1aXJlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgYnV0IGZvdW5kICR7YXJncy5sZW5ndGggLSAxfSBpbnN0ZWFkLmApO1xuXG4gICAgICAgIGlmICghaXNWYWx1ZShhcmdzWzFdKSlcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBpbnZhbGlkIHZhbHVlYCk7XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSAoYXJnc1sxXSAgICAgKTtcbiAgICAgICAgbGV0IHR5cGUgPSB0eXBlT2YodmFsdWUpO1xuXG4gICAgICAgIC8vIHNwZWNpYWwgY2FzZTogaW5mZXIgdGhlIGl0ZW0gdHlwZSBpZiBwb3NzaWJsZSBmb3IgemVyby1sZW5ndGggYXJyYXlzXG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0gY29udGV4dC5leHBlY3RlZFR5cGU7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGUua2luZCA9PT0gJ2FycmF5JyAmJlxuICAgICAgICAgICAgdHlwZS5OID09PSAwICYmXG4gICAgICAgICAgICBleHBlY3RlZCAmJlxuICAgICAgICAgICAgZXhwZWN0ZWQua2luZCA9PT0gJ2FycmF5JyAmJlxuICAgICAgICAgICAgKHR5cGVvZiBleHBlY3RlZC5OICE9PSAnbnVtYmVyJyB8fCBleHBlY3RlZC5OID09PSAwKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHR5cGUgPSBleHBlY3RlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbCh0eXBlLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZCgpIHt9XG5cbiAgICBwb3NzaWJsZU91dHB1dHMoKSB7XG4gICAgICAgIHJldHVybiBbdGhpcy52YWx1ZV07XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IExpdGVyYWw7XG4iLCIvLyAgICAgIFxuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcbmNvbnN0IHsgdHlwZU9mIH0gPSByZXF1aXJlKCcuLi92YWx1ZXMnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuLy8gTWFwIGlucHV0IGxhYmVsIHZhbHVlcyB0byBvdXRwdXQgZXhwcmVzc2lvbiBpbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuY2xhc3MgTWF0Y2ggICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dFR5cGUgICAgICAsIG91dHB1dFR5cGUgICAgICAsIGlucHV0ICAgICAgICAgICAgLCBjYXNlcyAgICAgICAsIG91dHB1dHMgICAgICAgICAgICAgICAgICAgLCBvdGhlcndpc2UgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSBpbnB1dFR5cGU7XG4gICAgICAgIHRoaXMudHlwZSA9IG91dHB1dFR5cGU7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5jYXNlcyA9IGNhc2VzO1xuICAgICAgICB0aGlzLm91dHB1dHMgPSBvdXRwdXRzO1xuICAgICAgICB0aGlzLm90aGVyd2lzZSA9IG90aGVyd2lzZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJncyAgICAgICAgICAgICAgLCBjb250ZXh0ICAgICAgICAgICAgICAgICkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCA1KVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IDQgYXJndW1lbnRzLCBidXQgZm91bmQgb25seSAke2FyZ3MubGVuZ3RoIC0gMX0uYCk7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAlIDIgIT09IDEpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYW4gZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzLmApO1xuXG4gICAgICAgIGxldCBpbnB1dFR5cGU7XG4gICAgICAgIGxldCBvdXRwdXRUeXBlO1xuICAgICAgICBpZiAoY29udGV4dC5leHBlY3RlZFR5cGUgJiYgY29udGV4dC5leHBlY3RlZFR5cGUua2luZCAhPT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IGNvbnRleHQuZXhwZWN0ZWRUeXBlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhc2VzID0ge307XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCBhcmdzLmxlbmd0aCAtIDE7IGkgKz0gMikge1xuICAgICAgICAgICAgbGV0IGxhYmVscyA9IGFyZ3NbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGFyZ3NbaSArIDFdO1xuXG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGFiZWxzKSkge1xuICAgICAgICAgICAgICAgIGxhYmVscyA9IFtsYWJlbHNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsYWJlbENvbnRleHQgPSBjb250ZXh0LmNvbmNhdChpKTtcbiAgICAgICAgICAgIGlmIChsYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsQ29udGV4dC5lcnJvcignRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIGJyYW5jaCBsYWJlbC4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBsYWJlbCBvZiBsYWJlbHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxhYmVsICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgbGFiZWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbENvbnRleHQuZXJyb3IoYEJyYW5jaCBsYWJlbHMgbXVzdCBiZSBudW1iZXJzIG9yIHN0cmluZ3MuYCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGFiZWwgPT09ICdudW1iZXInICYmIE1hdGguYWJzKGxhYmVsKSA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbENvbnRleHQuZXJyb3IoYEJyYW5jaCBsYWJlbHMgbXVzdCBiZSBpbnRlZ2VycyBubyBsYXJnZXIgdGhhbiAke051bWJlci5NQVhfU0FGRV9JTlRFR0VSfS5gKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxhYmVsID09PSAnbnVtYmVyJyAmJiBNYXRoLmZsb29yKGxhYmVsKSAhPT0gbGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsQ29udGV4dC5lcnJvcihgTnVtZXJpYyBicmFuY2ggbGFiZWxzIG11c3QgYmUgaW50ZWdlciB2YWx1ZXMuYCk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpbnB1dFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRUeXBlID0gdHlwZU9mKGxhYmVsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhYmVsQ29udGV4dC5jaGVja1N1YnR5cGUoaW5wdXRUeXBlLCB0eXBlT2YobGFiZWwpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhc2VzW1N0cmluZyhsYWJlbCldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxDb250ZXh0LmVycm9yKCdCcmFuY2ggbGFiZWxzIG11c3QgYmUgdW5pcXVlLicpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNhc2VzW1N0cmluZyhsYWJlbCldID0gb3V0cHV0cy5sZW5ndGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQucGFyc2UodmFsdWUsIGksIG91dHB1dFR5cGUpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IG91dHB1dFR5cGUgfHwgcmVzdWx0LnR5cGU7XG4gICAgICAgICAgICBvdXRwdXRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlucHV0ID0gY29udGV4dC5wYXJzZShhcmdzWzFdLCAxLCBpbnB1dFR5cGUpO1xuICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBvdGhlcndpc2UgPSBjb250ZXh0LnBhcnNlKGFyZ3NbYXJncy5sZW5ndGggLSAxXSwgYXJncy5sZW5ndGggLSAxLCBvdXRwdXRUeXBlKTtcbiAgICAgICAgaWYgKCFvdGhlcndpc2UpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGFzc2VydChpbnB1dFR5cGUgJiYgb3V0cHV0VHlwZSk7XG4gICAgICAgIHJldHVybiBuZXcgTWF0Y2goKGlucHV0VHlwZSAgICAgKSwgKG91dHB1dFR5cGUgICAgICksIGlucHV0LCBjYXNlcywgb3V0cHV0cywgb3RoZXJ3aXNlKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHggICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gKHRoaXMuaW5wdXQuZXZhbHVhdGUoY3R4KSAgICAgKTtcbiAgICAgICAgcmV0dXJuICh0aGlzLm91dHB1dHNbdGhpcy5jYXNlc1tpbnB1dF1dIHx8IHRoaXMub3RoZXJ3aXNlKS5ldmFsdWF0ZShjdHgpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgICAgIHRoaXMub3V0cHV0cy5mb3JFYWNoKGZuKTtcbiAgICAgICAgZm4odGhpcy5vdGhlcndpc2UpO1xuICAgIH1cblxuICAgIHBvc3NpYmxlT3V0cHV0cygpIHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgICAgICAuY29uY2F0KC4uLnRoaXMub3V0cHV0cy5tYXAoKG91dCkgPT4gb3V0LnBvc3NpYmxlT3V0cHV0cygpKSlcbiAgICAgICAgICAgIC5jb25jYXQodGhpcy5vdGhlcndpc2UucG9zc2libGVPdXRwdXRzKCkpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNYXRjaDtcbiIsIi8vICAgICAgXG5cbmNvbnN0IHsgTnVtYmVyVHlwZSB9ID0gcmVxdWlyZSgnLi4vdHlwZXMnKTtcbmNvbnN0IHsgZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUbyB9ID0gcmVxdWlyZShcIi4uL3N0b3BzXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuY2xhc3MgU3RlcCAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlICAgICAgLCBpbnB1dCAgICAgICAgICAgICwgc3RvcHMgICAgICAgKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcblxuICAgICAgICB0aGlzLmxhYmVscyA9IFtdO1xuICAgICAgICB0aGlzLm91dHB1dHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBbbGFiZWwsIGV4cHJlc3Npb25dIG9mIHN0b3BzKSB7XG4gICAgICAgICAgICB0aGlzLmxhYmVscy5wdXNoKGxhYmVsKTtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0cy5wdXNoKGV4cHJlc3Npb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3MgICAgICAgICAgICAgICwgY29udGV4dCAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgbGV0IFsgLCBpbnB1dCwgLi4ucmVzdF0gPSBhcmdzO1xuXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAtIDEgPCA0KSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgNCBhcmd1bWVudHMsIGJ1dCBmb3VuZCBvbmx5ICR7YXJncy5sZW5ndGggLSAxfS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoYXJncy5sZW5ndGggLSAxKSAlIDIgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhbiBldmVuIG51bWJlciBvZiBhcmd1bWVudHMuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dCA9IGNvbnRleHQucGFyc2UoaW5wdXQsIDEsIE51bWJlclR5cGUpO1xuICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBzdG9wcyAgICAgICAgPSBbXTtcblxuICAgICAgICBsZXQgb3V0cHV0VHlwZSAgICAgICA9IChudWxsICAgICApO1xuICAgICAgICBpZiAoY29udGV4dC5leHBlY3RlZFR5cGUgJiYgY29udGV4dC5leHBlY3RlZFR5cGUua2luZCAhPT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IGNvbnRleHQuZXhwZWN0ZWRUeXBlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdC51bnNoaWZ0KC1JbmZpbml0eSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN0Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IHJlc3RbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlc3RbaSArIDFdO1xuXG4gICAgICAgICAgICBjb25zdCBsYWJlbEtleSA9IGkgKyAxO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVLZXkgPSBpICsgMjtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBsYWJlbCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcignSW5wdXQvb3V0cHV0IHBhaXJzIGZvciBcInN0ZXBcIiBleHByZXNzaW9ucyBtdXN0IGJlIGRlZmluZWQgdXNpbmcgbGl0ZXJhbCBudW1lcmljIHZhbHVlcyAobm90IGNvbXB1dGVkIGV4cHJlc3Npb25zKSBmb3IgdGhlIGlucHV0IHZhbHVlcy4nLCBsYWJlbEtleSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdG9wcy5sZW5ndGggJiYgc3RvcHNbc3RvcHMubGVuZ3RoIC0gMV1bMF0gPj0gbGFiZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcignSW5wdXQvb3V0cHV0IHBhaXJzIGZvciBcInN0ZXBcIiBleHByZXNzaW9ucyBtdXN0IGJlIGFycmFuZ2VkIHdpdGggaW5wdXQgdmFsdWVzIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlci4nLCBsYWJlbEtleSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IGNvbnRleHQucGFyc2UodmFsdWUsIHZhbHVlS2V5LCBvdXRwdXRUeXBlKTtcbiAgICAgICAgICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBvdXRwdXRUeXBlIHx8IHBhcnNlZC50eXBlO1xuICAgICAgICAgICAgc3RvcHMucHVzaChbbGFiZWwsIHBhcnNlZF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTdGVwKG91dHB1dFR5cGUsIGlucHV0LCBzdG9wcyk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4ICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmxhYmVscztcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IHRoaXMub3V0cHV0cztcblxuICAgICAgICBpZiAobGFiZWxzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dHNbMF0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gKCh0aGlzLmlucHV0LmV2YWx1YXRlKGN0eCkgICAgICkgICAgICAgICk7XG4gICAgICAgIGlmICh2YWx1ZSA8PSBsYWJlbHNbMF0pIHtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXRzWzBdLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdG9wQ291bnQgPSBsYWJlbHMubGVuZ3RoO1xuICAgICAgICBpZiAodmFsdWUgPj0gbGFiZWxzW3N0b3BDb3VudCAtIDFdKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0c1tzdG9wQ291bnQgLSAxXS5ldmFsdWF0ZShjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKGxhYmVscywgdmFsdWUpO1xuICAgICAgICByZXR1cm4gb3V0cHV0c1tpbmRleF0uZXZhbHVhdGUoY3R4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGZuKHRoaXMuaW5wdXQpO1xuICAgICAgICBmb3IgKGNvbnN0IGV4cHJlc3Npb24gb2YgdGhpcy5vdXRwdXRzKSB7XG4gICAgICAgICAgICBmbihleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBvc3NpYmxlT3V0cHV0cygpIHtcbiAgICAgICAgcmV0dXJuIFtdLmNvbmNhdCguLi50aGlzLm91dHB1dHMubWFwKChvdXRwdXQpID0+IG91dHB1dC5wb3NzaWJsZU91dHB1dHMoKSkpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTdGVwO1xuIiwiLy8gICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNsYXNzIFZhciAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IobmFtZSAgICAgICAgLCB0eXBlICAgICAgKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3MgICAgICAgICAgICAgICwgY29udGV4dCAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyIHx8IHR5cGVvZiBhcmdzWzFdICE9PSAnc3RyaW5nJylcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGAndmFyJyBleHByZXNzaW9uIHJlcXVpcmVzIGV4YWN0bHkgb25lIHN0cmluZyBsaXRlcmFsIGFyZ3VtZW50LmApO1xuXG4gICAgICAgIGNvbnN0IG5hbWUgPSBhcmdzWzFdO1xuICAgICAgICBpZiAoIWNvbnRleHQuc2NvcGUuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgVW5rbm93biB2YXJpYWJsZSBcIiR7bmFtZX1cIi4gTWFrZSBzdXJlIFwiJHtuYW1lfVwiIGhhcyBiZWVuIGJvdW5kIGluIGFuIGVuY2xvc2luZyBcImxldFwiIGV4cHJlc3Npb24gYmVmb3JlIHVzaW5nIGl0LmAsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBWYXIobmFtZSwgY29udGV4dC5zY29wZS5nZXQobmFtZSkudHlwZSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4ICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICByZXR1cm4gY3R4LnNjb3BlLmdldCh0aGlzLm5hbWUpLmV2YWx1YXRlKGN0eCk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKCkge31cblxuICAgIHBvc3NpYmxlT3V0cHV0cygpIHtcbiAgICAgICAgcmV0dXJuIFt1bmRlZmluZWRdO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBWYXI7XG4iLCIvLyAgICAgIFxuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcbmNvbnN0IFNjb3BlID0gcmVxdWlyZSgnLi9zY29wZScpO1xuY29uc3Qge0NvbG9yfSA9IHJlcXVpcmUoJy4vdmFsdWVzJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuY29uc3QgZ2VvbWV0cnlUeXBlcyA9IFsnVW5rbm93bicsICdQb2ludCcsICdMaW5lU3RyaW5nJywgJ1BvbHlnb24nXTtcblxuY2xhc3MgRXZhbHVhdGlvbkNvbnRleHQge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc2NvcGUgPSBuZXcgU2NvcGUoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VDb2xvckNhY2hlID0ge307XG4gICAgfVxuXG4gICAgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmUgJiYgJ2lkJyBpbiB0aGlzLmZlYXR1cmUgPyB0aGlzLmZlYXR1cmUuaWQgOiBudWxsO1xuICAgIH1cblxuICAgIGdlb21ldHJ5VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmVhdHVyZSA/IHR5cGVvZiB0aGlzLmZlYXR1cmUudHlwZSA9PT0gJ251bWJlcicgPyBnZW9tZXRyeVR5cGVzW3RoaXMuZmVhdHVyZS50eXBlXSA6IHRoaXMuZmVhdHVyZS50eXBlIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcm9wZXJ0aWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZWF0dXJlICYmIHRoaXMuZmVhdHVyZS5wcm9wZXJ0aWVzIHx8IHt9O1xuICAgIH1cblxuICAgIHB1c2hTY29wZShiaW5kaW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuc2NvcGUgPSB0aGlzLnNjb3BlLmNvbmNhdChiaW5kaW5ncyk7XG4gICAgfVxuXG4gICAgcG9wU2NvcGUoKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLnNjb3BlLnBhcmVudCk7XG4gICAgICAgIHRoaXMuc2NvcGUgPSAodGhpcy5zY29wZS5wYXJlbnQgICAgICk7XG4gICAgfVxuXG4gICAgcGFyc2VDb2xvcihpbnB1dCAgICAgICAgKSAgICAgICAgIHtcbiAgICAgICAgbGV0IGNhY2hlZCA9IHRoaXMuX3BhcnNlQ29sb3JDYWNoZVtpbnB1dF07XG4gICAgICAgIGlmICghY2FjaGVkKSB7XG4gICAgICAgICAgICBjYWNoZWQgPSB0aGlzLl9wYXJzZUNvbG9yQ2FjaGVbaW5wdXRdID0gQ29sb3IucGFyc2UoaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEV2YWx1YXRpb25Db250ZXh0O1xuIiwiLy8gICAgICBcblxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG5jb25zdCBleHRlbmQgPSByZXF1aXJlKCcuLi91dGlsL2V4dGVuZCcpO1xuY29uc3QgUGFyc2luZ0Vycm9yID0gcmVxdWlyZSgnLi9wYXJzaW5nX2Vycm9yJyk7XG5jb25zdCBQYXJzaW5nQ29udGV4dCA9IHJlcXVpcmUoJy4vcGFyc2luZ19jb250ZXh0Jyk7XG5jb25zdCBFdmFsdWF0aW9uQ29udGV4dCA9IHJlcXVpcmUoJy4vZXZhbHVhdGlvbl9jb250ZXh0Jyk7XG5jb25zdCB7Q29tcG91bmRFeHByZXNzaW9ufSA9IHJlcXVpcmUoJy4vY29tcG91bmRfZXhwcmVzc2lvbicpO1xuY29uc3QgU3RlcCA9IHJlcXVpcmUoJy4vZGVmaW5pdGlvbnMvc3RlcCcpO1xuY29uc3QgSW50ZXJwb2xhdGUgPSByZXF1aXJlKCcuL2RlZmluaXRpb25zL2ludGVycG9sYXRlJyk7XG5jb25zdCBDb2FsZXNjZSA9IHJlcXVpcmUoJy4vZGVmaW5pdGlvbnMvY29hbGVzY2UnKTtcbmNvbnN0IExldCA9IHJlcXVpcmUoJy4vZGVmaW5pdGlvbnMvbGV0Jyk7XG5jb25zdCBkZWZpbml0aW9ucyA9IHJlcXVpcmUoJy4vZGVmaW5pdGlvbnMnKTtcbmNvbnN0IGlzQ29uc3RhbnQgPSByZXF1aXJlKCcuL2lzX2NvbnN0YW50Jyk7XG5jb25zdCBSdW50aW1lRXJyb3IgPSByZXF1aXJlKCcuL3J1bnRpbWVfZXJyb3InKTtcbmNvbnN0IHtzdWNjZXNzLCBlcnJvcn0gPSByZXF1aXJlKCcuLi91dGlsL3Jlc3VsdCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBcblxuY2xhc3MgU3R5bGVFeHByZXNzaW9uIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihleHByZXNzaW9uICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoZ2xvYmFscyAgICAgICAgICAgICAgICAgICwgZmVhdHVyZSAgICAgICAgICApICAgICAge1xuICAgICAgICBpZiAoIXRoaXMuX2V2YWx1YXRvcikge1xuICAgICAgICAgICAgdGhpcy5fZXZhbHVhdG9yID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuZ2xvYmFscyA9IGdsb2JhbHM7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5mZWF0dXJlID0gZmVhdHVyZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZSh0aGlzLl9ldmFsdWF0b3IpO1xuICAgIH1cbn1cblxuY2xhc3MgU3R5bGVFeHByZXNzaW9uV2l0aEVycm9ySGFuZGxpbmcgZXh0ZW5kcyBTdHlsZUV4cHJlc3Npb24ge1xuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGV4cHJlc3Npb24gICAgICAgICAgICAsIHByb3BlcnR5U3BlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgc3VwZXIoZXhwcmVzc2lvbik7XG4gICAgICAgIHRoaXMuX3dhcm5pbmdIaXN0b3J5ID0ge307XG4gICAgICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IGdldERlZmF1bHRWYWx1ZShwcm9wZXJ0eVNwZWMpO1xuICAgICAgICBpZiAocHJvcGVydHlTcGVjLnR5cGUgPT09ICdlbnVtJykge1xuICAgICAgICAgICAgdGhpcy5fZW51bVZhbHVlcyA9IHByb3BlcnR5U3BlYy52YWx1ZXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmFsdWF0ZShnbG9iYWxzICAgICAgICAgICAgICAgICAgLCBmZWF0dXJlICAgICAgICAgICkge1xuICAgICAgICBpZiAoIXRoaXMuX2V2YWx1YXRvcikge1xuICAgICAgICAgICAgdGhpcy5fZXZhbHVhdG9yID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuZ2xvYmFscyA9IGdsb2JhbHM7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5mZWF0dXJlID0gZmVhdHVyZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKHRoaXMuX2V2YWx1YXRvcik7XG4gICAgICAgICAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9lbnVtVmFsdWVzICYmICEodmFsIGluIHRoaXMuX2VudW1WYWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgRXhwZWN0ZWQgdmFsdWUgdG8gYmUgb25lIG9mICR7T2JqZWN0LmtleXModGhpcy5fZW51bVZhbHVlcykubWFwKHYgPT4gSlNPTi5zdHJpbmdpZnkodikpLmpvaW4oJywgJyl9LCBidXQgZm91bmQgJHtKU09OLnN0cmluZ2lmeSh2YWwpfSBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl93YXJuaW5nSGlzdG9yeVtlLm1lc3NhZ2VdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2FybmluZ0hpc3RvcnlbZS5tZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc0V4cHJlc3Npb24oZXhwcmVzc2lvbiAgICAgICApIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShleHByZXNzaW9uKSAmJiBleHByZXNzaW9uLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgdHlwZW9mIGV4cHJlc3Npb25bMF0gPT09ICdzdHJpbmcnICYmIGV4cHJlc3Npb25bMF0gaW4gZGVmaW5pdGlvbnM7XG59XG5cbi8qKlxuICogUGFyc2UgYW5kIHR5cGVjaGVjayB0aGUgZ2l2ZW4gc3R5bGUgc3BlYyBKU09OIGV4cHJlc3Npb24uICBJZlxuICogb3B0aW9ucy5kZWZhdWx0VmFsdWUgaXMgcHJvdmlkZWQsIHRoZW4gdGhlIHJlc3VsdGluZyBTdHlsZUV4cHJlc3Npb24nc1xuICogYGV2YWx1YXRlKClgIG1ldGhvZCB3aWxsIGhhbmRsZSBlcnJvcnMgYnkgbG9nZ2luZyBhIHdhcm5pbmcgKG9uY2UgcGVyXG4gKiBtZXNzYWdlKSBhbmQgcmV0dXJuaW5nIHRoZSBkZWZhdWx0IHZhbHVlLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIHRocm93XG4gKiBldmFsdWF0aW9uIGVycm9ycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjcmVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb24gICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVNwZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2luZ0NvbnRleHQoZGVmaW5pdGlvbnMsIFtdLCBnZXRFeHBlY3RlZFR5cGUocHJvcGVydHlTcGVjKSk7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VyLnBhcnNlKGV4cHJlc3Npb24pO1xuICAgIGlmICghcGFyc2VkKSB7XG4gICAgICAgIGFzc2VydChwYXJzZXIuZXJyb3JzLmxlbmd0aCA+IDApO1xuICAgICAgICByZXR1cm4gZXJyb3IocGFyc2VyLmVycm9ycyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaGFuZGxlRXJyb3JzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gc3VjY2VzcyhuZXcgU3R5bGVFeHByZXNzaW9uKHBhcnNlZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzdWNjZXNzKG5ldyBTdHlsZUV4cHJlc3Npb25XaXRoRXJyb3JIYW5kbGluZyhwYXJzZWQsIHByb3BlcnR5U3BlYykpO1xuICAgIH1cbn1cblxuY2xhc3MgWm9vbUNvbnN0YW50RXhwcmVzc2lvbiAgICAgICB7XG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgY29uc3RydWN0b3Ioa2luZCAgICAgICwgZXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMua2luZCA9IGtpbmQ7XG4gICAgICAgIHRoaXMuX3N0eWxlRXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgfVxuICAgIGV2YWx1YXRlKGdsb2JhbHMgICAgICAgICAgICAgICAgICAsIGZlYXR1cmUgICAgICAgICAgKSAgICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZShnbG9iYWxzLCBmZWF0dXJlKTtcbiAgICB9XG59XG5cbmNsYXNzIFpvb21EZXBlbmRlbnRFeHByZXNzaW9uICAgICAgIHtcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGtpbmQgICAgICAsIGV4cHJlc3Npb24gICAgICAgICAgICAgICAgICwgem9vbUN1cnZlICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5raW5kID0ga2luZDtcbiAgICAgICAgdGhpcy56b29tU3RvcHMgPSB6b29tQ3VydmUubGFiZWxzO1xuICAgICAgICB0aGlzLl9zdHlsZUV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICBpZiAoem9vbUN1cnZlIGluc3RhbmNlb2YgSW50ZXJwb2xhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2ludGVycG9sYXRpb25UeXBlID0gem9vbUN1cnZlLmludGVycG9sYXRpb247XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmFsdWF0ZShnbG9iYWxzICAgICAgICAgICAgICAgICAgLCBmZWF0dXJlICAgICAgICAgICkgICAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHlsZUV4cHJlc3Npb24uZXZhbHVhdGUoZ2xvYmFscywgZmVhdHVyZSk7XG4gICAgfVxuXG4gICAgaW50ZXJwb2xhdGlvbkZhY3RvcihpbnB1dCAgICAgICAgLCBsb3dlciAgICAgICAgLCB1cHBlciAgICAgICAgKSAgICAgICAgIHtcbiAgICAgICAgaWYgKHRoaXMuX2ludGVycG9sYXRpb25UeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3Rvcih0aGlzLl9pbnRlcnBvbGF0aW9uVHlwZSwgaW5wdXQsIGxvd2VyLCB1cHBlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5mdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eUV4cHJlc3Npb24oZXhwcmVzc2lvbiAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlTcGVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB7fSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgIGV4cHJlc3Npb24gPSBjcmVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb24sIHByb3BlcnR5U3BlYywgb3B0aW9ucyk7XG4gICAgaWYgKGV4cHJlc3Npb24ucmVzdWx0ID09PSAnZXJyb3InKSB7XG4gICAgICAgIHJldHVybiBleHByZXNzaW9uO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IGV4cHJlc3Npb24udmFsdWUuZXhwcmVzc2lvbjtcblxuICAgIGNvbnN0IGlzRmVhdHVyZUNvbnN0YW50ID0gaXNDb25zdGFudC5pc0ZlYXR1cmVDb25zdGFudChwYXJzZWQpO1xuICAgIGlmICghaXNGZWF0dXJlQ29uc3RhbnQgJiYgIXByb3BlcnR5U3BlY1sncHJvcGVydHktZnVuY3Rpb24nXSkge1xuICAgICAgICByZXR1cm4gZXJyb3IoW25ldyBQYXJzaW5nRXJyb3IoJycsICdwcm9wZXJ0eSBleHByZXNzaW9ucyBub3Qgc3VwcG9ydGVkJyldKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc1pvb21Db25zdGFudCA9IGlzQ29uc3RhbnQuaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50KHBhcnNlZCwgWyd6b29tJ10pO1xuICAgIGlmICghaXNab29tQ29uc3RhbnQgJiYgcHJvcGVydHlTcGVjWyd6b29tLWZ1bmN0aW9uJ10gPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBlcnJvcihbbmV3IFBhcnNpbmdFcnJvcignJywgJ3pvb20gZXhwcmVzc2lvbnMgbm90IHN1cHBvcnRlZCcpXSk7XG4gICAgfVxuXG4gICAgY29uc3Qgem9vbUN1cnZlID0gZmluZFpvb21DdXJ2ZShwYXJzZWQpO1xuICAgIGlmICghem9vbUN1cnZlICYmICFpc1pvb21Db25zdGFudCkge1xuICAgICAgICByZXR1cm4gZXJyb3IoW25ldyBQYXJzaW5nRXJyb3IoJycsICdcInpvb21cIiBleHByZXNzaW9uIG1heSBvbmx5IGJlIHVzZWQgYXMgaW5wdXQgdG8gYSB0b3AtbGV2ZWwgXCJzdGVwXCIgb3IgXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb24uJyldKTtcbiAgICB9IGVsc2UgaWYgKHpvb21DdXJ2ZSBpbnN0YW5jZW9mIFBhcnNpbmdFcnJvcikge1xuICAgICAgICByZXR1cm4gZXJyb3IoW3pvb21DdXJ2ZV0pO1xuICAgIH0gZWxzZSBpZiAoem9vbUN1cnZlIGluc3RhbmNlb2YgSW50ZXJwb2xhdGUgJiYgcHJvcGVydHlTcGVjWydmdW5jdGlvbiddID09PSAncGllY2V3aXNlLWNvbnN0YW50Jykge1xuICAgICAgICByZXR1cm4gZXJyb3IoW25ldyBQYXJzaW5nRXJyb3IoJycsICdcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbnMgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGlzIHByb3BlcnR5JyldKTtcbiAgICB9XG5cbiAgICBpZiAoIXpvb21DdXJ2ZSkge1xuICAgICAgICByZXR1cm4gc3VjY2Vzcyhpc0ZlYXR1cmVDb25zdGFudCA/XG4gICAgICAgICAgICAobmV3IFpvb21Db25zdGFudEV4cHJlc3Npb24oJ2NvbnN0YW50JywgZXhwcmVzc2lvbi52YWx1ZSkgICAgICAgICAgICAgICAgICAgICkgOlxuICAgICAgICAgICAgKG5ldyBab29tQ29uc3RhbnRFeHByZXNzaW9uKCdzb3VyY2UnLCBleHByZXNzaW9uLnZhbHVlKSAgICAgICAgICAgICAgICAgICkpO1xuICAgIH1cblxuICAgIHJldHVybiBzdWNjZXNzKGlzRmVhdHVyZUNvbnN0YW50ID9cbiAgICAgICAgKG5ldyBab29tRGVwZW5kZW50RXhwcmVzc2lvbignY2FtZXJhJywgZXhwcmVzc2lvbi52YWx1ZSwgem9vbUN1cnZlKSAgICAgICAgICAgICAgICAgICkgOlxuICAgICAgICAobmV3IFpvb21EZXBlbmRlbnRFeHByZXNzaW9uKCdjb21wb3NpdGUnLCBleHByZXNzaW9uLnZhbHVlLCB6b29tQ3VydmUpICAgICAgICAgICAgICAgICAgICAgKSk7XG59XG5cbmNvbnN0IHtpc0Z1bmN0aW9uLCBjcmVhdGVGdW5jdGlvbn0gPSByZXF1aXJlKCcuLi9mdW5jdGlvbicpO1xuY29uc3Qge0NvbG9yfSA9IHJlcXVpcmUoJy4vdmFsdWVzJyk7XG5cbi8vIHNlcmlhbGl6YXRpb24gd3JhcHBlciBmb3Igb2xkLXN0eWxlIHN0b3AgZnVuY3Rpb25zIG5vcm1hbGl6ZWQgdG8gdGhlXG4vLyBleHByZXNzaW9uIGludGVyZmFjZVxuY2xhc3MgU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBzcGVjaWZpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLl9wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcbiAgICAgICAgdGhpcy5fc3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb247XG4gICAgICAgIGV4dGVuZCh0aGlzLCBjcmVhdGVGdW5jdGlvbih0aGlzLl9wYXJhbWV0ZXJzLCB0aGlzLl9zcGVjaWZpY2F0aW9uKSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGRlc2VyaWFsaXplKHNlcmlhbGl6ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuICgobmV3IFN0eWxlUHJvcGVydHlGdW5jdGlvbihzZXJpYWxpemVkLl9wYXJhbWV0ZXJzLCBzZXJpYWxpemVkLl9zcGVjaWZpY2F0aW9uKSkgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIHNlcmlhbGl6ZShpbnB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBfcGFyYW1ldGVyczogaW5wdXQuX3BhcmFtZXRlcnMsXG4gICAgICAgICAgICBfc3BlY2lmaWNhdGlvbjogaW5wdXQuX3NwZWNpZmljYXRpb25cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BlcnR5RXhwcmVzc2lvbiAgICh2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHNwZWNpZmljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gKG5ldyBTdHlsZVByb3BlcnR5RnVuY3Rpb24odmFsdWUsIHNwZWNpZmljYXRpb24pICAgICApO1xuXG4gICAgfSBlbHNlIGlmIChpc0V4cHJlc3Npb24odmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBjcmVhdGVQcm9wZXJ0eUV4cHJlc3Npb24odmFsdWUsIHNwZWNpZmljYXRpb24pO1xuICAgICAgICBpZiAoZXhwcmVzc2lvbi5yZXN1bHQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIGhhdmUgYmVlbiBjYXVnaHQgaW4gdmFsaWRhdGlvblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGV4cHJlc3Npb24udmFsdWUubWFwKGVyciA9PiBgJHtlcnIua2V5fTogJHtlcnIubWVzc2FnZX1gKS5qb2luKCcsICcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi52YWx1ZTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjb25zdGFudCAgICAgID0gdmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHNwZWNpZmljYXRpb24udHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgY29uc3RhbnQgPSBDb2xvci5wYXJzZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6ICdjb25zdGFudCcsXG4gICAgICAgICAgICBldmFsdWF0ZTogKCkgPT4gY29uc3RhbnRcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIFN0eWxlRXhwcmVzc2lvbixcbiAgICBTdHlsZUV4cHJlc3Npb25XaXRoRXJyb3JIYW5kbGluZyxcbiAgICBpc0V4cHJlc3Npb24sXG4gICAgY3JlYXRlRXhwcmVzc2lvbixcbiAgICBjcmVhdGVQcm9wZXJ0eUV4cHJlc3Npb24sXG4gICAgbm9ybWFsaXplUHJvcGVydHlFeHByZXNzaW9uLFxuICAgIFpvb21Db25zdGFudEV4cHJlc3Npb24sXG4gICAgWm9vbURlcGVuZGVudEV4cHJlc3Npb24sXG4gICAgU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uXG59O1xuXG4vLyBab29tLWRlcGVuZGVudCBleHByZXNzaW9ucyBtYXkgb25seSB1c2UgW1wiem9vbVwiXSBhcyB0aGUgaW5wdXQgdG8gYSB0b3AtbGV2ZWwgXCJzdGVwXCIgb3IgXCJpbnRlcnBvbGF0ZVwiXG4vLyBleHByZXNzaW9uIChjb2xsZWN0aXZlbHkgcmVmZXJyZWQgdG8gYXMgYSBcImN1cnZlXCIpLiBUaGUgY3VydmUgbWF5IGJlIHdyYXBwZWQgaW4gb25lIG9yIG1vcmUgXCJsZXRcIiBvclxuLy8gXCJjb2FsZXNjZVwiIGV4cHJlc3Npb25zLlxuZnVuY3Rpb24gZmluZFpvb21DdXJ2ZShleHByZXNzaW9uICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBMZXQpIHtcbiAgICAgICAgcmVzdWx0ID0gZmluZFpvb21DdXJ2ZShleHByZXNzaW9uLnJlc3VsdCk7XG5cbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb2FsZXNjZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBleHByZXNzaW9uLmFyZ3MpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRab29tQ3VydmUoYXJnKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICgoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFN0ZXAgfHwgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEludGVycG9sYXRlKSAmJlxuICAgICAgICBleHByZXNzaW9uLmlucHV0IGluc3RhbmNlb2YgQ29tcG91bmRFeHByZXNzaW9uICYmXG4gICAgICAgIGV4cHJlc3Npb24uaW5wdXQubmFtZSA9PT0gJ3pvb20nKSB7XG5cbiAgICAgICAgcmVzdWx0ID0gZXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUGFyc2luZ0Vycm9yKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZXhwcmVzc2lvbi5lYWNoQ2hpbGQoKGNoaWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gZmluZFpvb21DdXJ2ZShjaGlsZCk7XG4gICAgICAgIGlmIChjaGlsZFJlc3VsdCBpbnN0YW5jZW9mIFBhcnNpbmdFcnJvcikge1xuICAgICAgICAgICAgcmVzdWx0ID0gY2hpbGRSZXN1bHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoIXJlc3VsdCAmJiBjaGlsZFJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBhcnNpbmdFcnJvcignJywgJ1wiem9vbVwiIGV4cHJlc3Npb24gbWF5IG9ubHkgYmUgdXNlZCBhcyBpbnB1dCB0byBhIHRvcC1sZXZlbCBcInN0ZXBcIiBvciBcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbi4nKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgJiYgY2hpbGRSZXN1bHQgJiYgcmVzdWx0ICE9PSBjaGlsZFJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBhcnNpbmdFcnJvcignJywgJ09ubHkgb25lIHpvb20tYmFzZWQgXCJzdGVwXCIgb3IgXCJpbnRlcnBvbGF0ZVwiIHN1YmV4cHJlc3Npb24gbWF5IGJlIHVzZWQgaW4gYW4gZXhwcmVzc2lvbi4nKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3Qge1xuICAgIENvbG9yVHlwZSxcbiAgICBTdHJpbmdUeXBlLFxuICAgIE51bWJlclR5cGUsXG4gICAgQm9vbGVhblR5cGUsXG4gICAgVmFsdWVUeXBlLFxuICAgIGFycmF5XG59ID0gcmVxdWlyZSgnLi90eXBlcycpO1xuXG5mdW5jdGlvbiBnZXRFeHBlY3RlZFR5cGUoc3BlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICB7XG4gICAgY29uc3QgdHlwZXMgPSB7XG4gICAgICAgIGNvbG9yOiBDb2xvclR5cGUsXG4gICAgICAgIHN0cmluZzogU3RyaW5nVHlwZSxcbiAgICAgICAgbnVtYmVyOiBOdW1iZXJUeXBlLFxuICAgICAgICBlbnVtOiBTdHJpbmdUeXBlLFxuICAgICAgICBib29sZWFuOiBCb29sZWFuVHlwZVxuICAgIH07XG5cbiAgICBpZiAoc3BlYy50eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgIHJldHVybiBhcnJheSh0eXBlc1tzcGVjLnZhbHVlXSB8fCBWYWx1ZVR5cGUsIHNwZWMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZXNbc3BlYy50eXBlXSB8fCBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0VmFsdWUoc3BlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICB7XG4gICAgaWYgKHNwZWMudHlwZSA9PT0gJ2NvbG9yJyAmJiBpc0Z1bmN0aW9uKHNwZWMuZGVmYXVsdCkpIHtcbiAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBoZWF0bWFwLWNvbG9yOiBpdCB1c2VzIHRoZSAnZGVmYXVsdDonIHRvIGRlZmluZSBhXG4gICAgICAgIC8vIGRlZmF1bHQgY29sb3IgcmFtcCwgYnV0IGNyZWF0ZUV4cHJlc3Npb24gZXhwZWN0cyBhIHNpbXBsZSB2YWx1ZSB0byBmYWxsXG4gICAgICAgIC8vIGJhY2sgdG8gaW4gY2FzZSBvZiBydW50aW1lIGVycm9yc1xuICAgICAgICByZXR1cm4gbmV3IENvbG9yKDAsIDAsIDAsIDApO1xuICAgIH0gZWxzZSBpZiAoc3BlYy50eXBlID09PSAnY29sb3InKSB7XG4gICAgICAgIHJldHVybiBDb2xvci5wYXJzZShzcGVjLmRlZmF1bHQpIHx8IG51bGw7XG4gICAgfSBlbHNlIGlmIChzcGVjLmRlZmF1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3BlYy5kZWZhdWx0O1xuICAgIH1cbn1cbiIsIi8vICAgICAgXG5cbmNvbnN0IHsgQ29tcG91bmRFeHByZXNzaW9uIH0gPSByZXF1aXJlKCcuL2NvbXBvdW5kX2V4cHJlc3Npb24nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuZnVuY3Rpb24gaXNGZWF0dXJlQ29uc3RhbnQoZSAgICAgICAgICAgICkge1xuICAgIGlmIChlIGluc3RhbmNlb2YgQ29tcG91bmRFeHByZXNzaW9uKSB7XG4gICAgICAgIGlmIChlLm5hbWUgPT09ICdnZXQnICYmIGUuYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChlLm5hbWUgPT09ICdoYXMnICYmIGUuYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGUubmFtZSA9PT0gJ3Byb3BlcnRpZXMnIHx8XG4gICAgICAgICAgICBlLm5hbWUgPT09ICdnZW9tZXRyeS10eXBlJyB8fFxuICAgICAgICAgICAgZS5uYW1lID09PSAnaWQnXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKC9eZmlsdGVyLS8udGVzdChlLm5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0ID0gdHJ1ZTtcbiAgICBlLmVhY2hDaGlsZChhcmcgPT4ge1xuICAgICAgICBpZiAocmVzdWx0ICYmICFpc0ZlYXR1cmVDb25zdGFudChhcmcpKSB7IHJlc3VsdCA9IGZhbHNlOyB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50KGUgICAgICAgICAgICAsIHByb3BlcnRpZXMgICAgICAgICAgICAgICApIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIENvbXBvdW5kRXhwcmVzc2lvbiAmJiBwcm9wZXJ0aWVzLmluZGV4T2YoZS5uYW1lKSA+PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGxldCByZXN1bHQgPSB0cnVlO1xuICAgIGUuZWFjaENoaWxkKChhcmcpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiAhaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50KGFyZywgcHJvcGVydGllcykpIHsgcmVzdWx0ID0gZmFsc2U7IH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBpc0ZlYXR1cmVDb25zdGFudCxcbiAgICBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQsXG59O1xuIiwiLy8gICAgICBcblxuY29uc3QgU2NvcGUgPSByZXF1aXJlKCcuL3Njb3BlJyk7XG5jb25zdCB7Y2hlY2tTdWJ0eXBlfSA9IHJlcXVpcmUoJy4vdHlwZXMnKTtcbmNvbnN0IFBhcnNpbmdFcnJvciA9IHJlcXVpcmUoJy4vcGFyc2luZ19lcnJvcicpO1xuY29uc3QgTGl0ZXJhbCA9IHJlcXVpcmUoJy4vZGVmaW5pdGlvbnMvbGl0ZXJhbCcpO1xuY29uc3QgQXNzZXJ0aW9uID0gcmVxdWlyZSgnLi9kZWZpbml0aW9ucy9hc3NlcnRpb24nKTtcbmNvbnN0IEFycmF5QXNzZXJ0aW9uID0gcmVxdWlyZSgnLi9kZWZpbml0aW9ucy9hcnJheScpO1xuY29uc3QgQ29lcmNpb24gPSByZXF1aXJlKCcuL2RlZmluaXRpb25zL2NvZXJjaW9uJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbi8qKlxuICogU3RhdGUgYXNzb2NpYXRlZCBwYXJzaW5nIGF0IGEgZ2l2ZW4gcG9pbnQgaW4gYW4gZXhwcmVzc2lvbiB0cmVlLlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgUGFyc2luZ0NvbnRleHQge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgLy8gVGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhpcyBleHByZXNzaW9uLiBQcm92aWRlZCBvbmx5IHRvIGFsbG93IEV4cHJlc3Npb25cbiAgICAvLyBpbXBsZW1lbnRhdGlvbnMgdG8gaW5mZXIgYXJndW1lbnQgdHlwZXM6IEV4cHJlc3Npb24jcGFyc2UoKSBuZWVkIG5vdFxuICAgIC8vIGNoZWNrIHRoYXQgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBwYXJzZWQgZXhwcmVzc2lvbiBtYXRjaGVzXG4gICAgLy8gYGV4cGVjdGVkVHlwZWAuXG4gICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICByZWdpc3RyeSAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICBwYXRoICAgICAgICAgICAgICAgID0gW10sXG4gICAgICAgIGV4cGVjdGVkVHlwZSAgICAgICAsXG4gICAgICAgIHNjb3BlICAgICAgICA9IG5ldyBTY29wZSgpLFxuICAgICAgICBlcnJvcnMgICAgICAgICAgICAgICAgICAgICAgPSBbXVxuICAgICkge1xuICAgICAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMua2V5ID0gcGF0aC5tYXAocGFydCA9PiBgWyR7cGFydH1dYCkuam9pbignJyk7XG4gICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgICAgIHRoaXMuZXhwZWN0ZWRUeXBlID0gZXhwZWN0ZWRUeXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBleHByIHRoZSBKU09OIGV4cHJlc3Npb24gdG8gcGFyc2VcbiAgICAgKiBAcGFyYW0gaW5kZXggdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGluZGV4IGlmIHRoaXMgZXhwcmVzc2lvbiBpcyBhbiBhcmd1bWVudCBvZiBhIHBhcmVudCBleHByZXNzaW9uIHRoYXQncyBiZWluZyBwYXJzZWRcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSBvcHRpb25zLm9taXRUeXBlQW5ub3RhdGlvbnMgc2V0IHRydWUgdG8gb21pdCBpbmZlcnJlZCB0eXBlIGFubm90YXRpb25zLiAgQ2FsbGVyIGJld2FyZTogd2l0aCB0aGlzIG9wdGlvbiBzZXQsIHRoZSBwYXJzZWQgZXhwcmVzc2lvbidzIHR5cGUgd2lsbCBOT1Qgc2F0aXNmeSBgZXhwZWN0ZWRUeXBlYCBpZiBpdCB3b3VsZCBub3JtYWxseSBiZSB3cmFwcGVkIGluIGFuIGluZmVycmVkIGFubm90YXRpb24uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwYXJzZShcbiAgICAgICAgZXhwciAgICAgICAsXG4gICAgICAgIGluZGV4ICAgICAgICAgLFxuICAgICAgICBleHBlY3RlZFR5cGUgICAgICAgICxcbiAgICAgICAgYmluZGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgIG9wdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB7fVxuICAgICkgICAgICAgICAgICAgIHtcbiAgICAgICAgbGV0IGNvbnRleHQgPSB0aGlzO1xuICAgICAgICBpZiAoaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNvbmNhdChpbmRleCwgZXhwZWN0ZWRUeXBlLCBiaW5kaW5ncyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhwciA9PT0gbnVsbCB8fCB0eXBlb2YgZXhwciA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGV4cHIgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgZXhwciA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGV4cHIgPSBbJ2xpdGVyYWwnLCBleHByXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4cHIpKSB7XG4gICAgICAgICAgICBpZiAoZXhwci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYW4gYXJyYXkgd2l0aCBhdCBsZWFzdCBvbmUgZWxlbWVudC4gSWYgeW91IHdhbnRlZCBhIGxpdGVyYWwgYXJyYXksIHVzZSBbXCJsaXRlcmFsXCIsIFtdXS5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgb3AgPSBleHByWzBdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVycm9yKGBFeHByZXNzaW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgYnV0IGZvdW5kICR7dHlwZW9mIG9wfSBpbnN0ZWFkLiBJZiB5b3Ugd2FudGVkIGEgbGl0ZXJhbCBhcnJheSwgdXNlIFtcImxpdGVyYWxcIiwgWy4uLl1dLmAsIDApO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBFeHByID0gY29udGV4dC5yZWdpc3RyeVtvcF07XG4gICAgICAgICAgICBpZiAoRXhwcikge1xuICAgICAgICAgICAgICAgIGxldCBwYXJzZWQgPSBFeHByLnBhcnNlKGV4cHIsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmV4cGVjdGVkVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBlY3RlZCA9IGNvbnRleHQuZXhwZWN0ZWRUeXBlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWwgPSBwYXJzZWQudHlwZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHdlIGV4cGVjdCBhIG51bWJlciwgc3RyaW5nLCBib29sZWFuLCBvciBhcnJheSBidXRcbiAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSBhIFZhbHVlLCB3ZSBjYW4gd3JhcCBpdCBpbiBhIHJlZmluaW5nIGFzc2VydGlvbi5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB3ZSBleHBlY3QgYSBDb2xvciBidXQgaGF2ZSBhIFN0cmluZyBvciBWYWx1ZSwgd2VcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FuIHdyYXAgaXQgaW4gXCJ0by1jb2xvclwiIGNvZXJjaW9uLlxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGRvIHN0YXRpYyB0eXBlLWNoZWNraW5nLlxuICAgICAgICAgICAgICAgICAgICBpZiAoKGV4cGVjdGVkLmtpbmQgPT09ICdzdHJpbmcnIHx8IGV4cGVjdGVkLmtpbmQgPT09ICdudW1iZXInIHx8IGV4cGVjdGVkLmtpbmQgPT09ICdib29sZWFuJykgJiYgYWN0dWFsLmtpbmQgPT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5vbWl0VHlwZUFubm90YXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkID0gbmV3IEFzc2VydGlvbihleHBlY3RlZCwgW3BhcnNlZF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4cGVjdGVkLmtpbmQgPT09ICdhcnJheScgJiYgYWN0dWFsLmtpbmQgPT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5vbWl0VHlwZUFubm90YXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkID0gbmV3IEFycmF5QXNzZXJ0aW9uKGV4cGVjdGVkLCBwYXJzZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4cGVjdGVkLmtpbmQgPT09ICdjb2xvcicgJiYgKGFjdHVhbC5raW5kID09PSAndmFsdWUnIHx8IGFjdHVhbC5raW5kID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5vbWl0VHlwZUFubm90YXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkID0gbmV3IENvZXJjaW9uKGV4cGVjdGVkLCBbcGFyc2VkXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5jaGVja1N1YnR5cGUoY29udGV4dC5leHBlY3RlZFR5cGUsIHBhcnNlZC50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBhbiBleHByZXNzaW9uJ3MgYXJndW1lbnRzIGFyZSBhbGwgbGl0ZXJhbHMsIHdlIGNhbiBldmFsdWF0ZVxuICAgICAgICAgICAgICAgIC8vIGl0IGltbWVkaWF0ZWx5IGFuZCByZXBsYWNlIGl0IHdpdGggYSBsaXRlcmFsIHZhbHVlIGluIHRoZVxuICAgICAgICAgICAgICAgIC8vIHBhcnNlZC9jb21waWxlZCByZXN1bHQuXG4gICAgICAgICAgICAgICAgaWYgKCEocGFyc2VkIGluc3RhbmNlb2YgTGl0ZXJhbCkgJiYgaXNDb25zdGFudChwYXJzZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVjID0gbmV3IChyZXF1aXJlKCcuL2V2YWx1YXRpb25fY29udGV4dCcpKSgpO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkID0gbmV3IExpdGVyYWwocGFyc2VkLnR5cGUsIHBhcnNlZC5ldmFsdWF0ZShlYykpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVycm9yKGUubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBVbmtub3duIGV4cHJlc3Npb24gXCIke29wfVwiLiBJZiB5b3Ugd2FudGVkIGEgbGl0ZXJhbCBhcnJheSwgdXNlIFtcImxpdGVyYWxcIiwgWy4uLl1dLmAsIDApO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHByID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYCd1bmRlZmluZWQnIHZhbHVlIGludmFsaWQuIFVzZSBudWxsIGluc3RlYWQuYCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cHIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgQmFyZSBvYmplY3RzIGludmFsaWQuIFVzZSBbXCJsaXRlcmFsXCIsIHsuLi59XSBpbnN0ZWFkLmApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFuIGFycmF5LCBidXQgZm91bmQgJHt0eXBlb2YgZXhwcn0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgY29udGV4dCBzdWl0YWJsZSBmb3IgcGFyc2luZyB0aGUgc3ViZXhwcmVzc2lvbiBhdFxuICAgICAqIGluZGV4IGBpbmRleGAsIG9wdGlvbmFsbHkgYXBwZW5kaW5nIHRvICdsZXQnIGJpbmRpbmcgbWFwLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IGBlcnJvcnNgIHByb3BlcnR5LCBpbnRlbmRlZCBmb3IgY29sbGVjdGluZyBlcnJvcnMgd2hpbGVcbiAgICAgKiBwYXJzaW5nLCBpcyBjb3BpZWQgYnkgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGNsb25lZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbmNhdChpbmRleCAgICAgICAgLCBleHBlY3RlZFR5cGUgICAgICAgICwgYmluZGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHR5cGVvZiBpbmRleCA9PT0gJ251bWJlcicgPyB0aGlzLnBhdGguY29uY2F0KGluZGV4KSA6IHRoaXMucGF0aDtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBiaW5kaW5ncyA/IHRoaXMuc2NvcGUuY29uY2F0KGJpbmRpbmdzKSA6IHRoaXMuc2NvcGU7XG4gICAgICAgIHJldHVybiBuZXcgUGFyc2luZ0NvbnRleHQoXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdHJ5LFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIGV4cGVjdGVkVHlwZSB8fCBudWxsLFxuICAgICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgICB0aGlzLmVycm9yc1xuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1c2ggYSBwYXJzaW5nIChvciB0eXBlIGNoZWNraW5nKSBlcnJvciBpbnRvIHRoZSBgdGhpcy5lcnJvcnNgXG4gICAgICogQHBhcmFtIGVycm9yIFRoZSBtZXNzYWdlXG4gICAgICogQHBhcmFtIGtleXMgT3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBzb3VyY2Ugb2YgdGhlIGVycm9yIGF0IGEgY2hpbGRcbiAgICAgKiBvZiB0aGUgY3VycmVudCBleHByZXNzaW9uIGF0IGB0aGlzLmtleWAuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBlcnJvcihlcnJvciAgICAgICAgLCAuLi5rZXlzICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGAke3RoaXMua2V5fSR7a2V5cy5tYXAoayA9PiBgWyR7a31dYCkuam9pbignJyl9YDtcbiAgICAgICAgdGhpcy5lcnJvcnMucHVzaChuZXcgUGFyc2luZ0Vycm9yKGtleSwgZXJyb3IpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIG51bGwgaWYgYHRgIGlzIGEgc3VidHlwZSBvZiBgZXhwZWN0ZWRgOyBvdGhlcndpc2UgcmV0dXJucyBhblxuICAgICAqIGVycm9yIG1lc3NhZ2UgYW5kIGFsc28gcHVzaGVzIGl0IHRvIGB0aGlzLmVycm9yc2AuXG4gICAgICovXG4gICAgY2hlY2tTdWJ0eXBlKGV4cGVjdGVkICAgICAgLCB0ICAgICAgKSAgICAgICAgICB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gY2hlY2tTdWJ0eXBlKGV4cGVjdGVkLCB0KTtcbiAgICAgICAgaWYgKGVycm9yKSB0aGlzLmVycm9yKGVycm9yKTtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBQYXJzaW5nQ29udGV4dDtcblxuZnVuY3Rpb24gaXNDb25zdGFudChleHByZXNzaW9uICAgICAgICAgICAgKSB7XG4gICAgLy8gcmVxdWlyZXMgd2l0aGluIGZ1bmN0aW9uIGJvZHkgdG8gd29ya2Fyb3VuZCBjaXJjdWxhciBkZXBlbmRlbmN5XG4gICAgY29uc3Qge0NvbXBvdW5kRXhwcmVzc2lvbn0gPSByZXF1aXJlKCcuL2NvbXBvdW5kX2V4cHJlc3Npb24nKTtcbiAgICBjb25zdCB7aXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50LCBpc0ZlYXR1cmVDb25zdGFudH0gPSByZXF1aXJlKCcuL2lzX2NvbnN0YW50Jyk7XG4gICAgY29uc3QgVmFyID0gcmVxdWlyZSgnLi9kZWZpbml0aW9ucy92YXInKTtcblxuICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgVmFyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb21wb3VuZEV4cHJlc3Npb24gJiYgZXhwcmVzc2lvbi5uYW1lID09PSAnZXJyb3InKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgbGl0ZXJhbEFyZ3MgPSB0cnVlO1xuICAgIGV4cHJlc3Npb24uZWFjaENoaWxkKGFyZyA9PiB7XG4gICAgICAgIGlmICghKGFyZyBpbnN0YW5jZW9mIExpdGVyYWwpKSB7IGxpdGVyYWxBcmdzID0gZmFsc2U7IH1cbiAgICB9KTtcbiAgICBpZiAoIWxpdGVyYWxBcmdzKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNGZWF0dXJlQ29uc3RhbnQoZXhwcmVzc2lvbikgJiZcbiAgICAgICAgaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50KGV4cHJlc3Npb24sIFsnem9vbScsICdoZWF0bWFwLWRlbnNpdHknXSk7XG59XG4iLCIvLyAgICAgIFxuXG5jbGFzcyBQYXJzaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgIGNvbnN0cnVjdG9yKGtleSAgICAgICAgLCBtZXNzYWdlICAgICAgICApIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBQYXJzaW5nRXJyb3I7XG4iLCIvLyAgICAgIFxuXG5jbGFzcyBSdW50aW1lRXJyb3Ige1xuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlICAgICAgICApIHtcbiAgICAgICAgdGhpcy5uYW1lID0gJ0V4cHJlc3Npb25FdmFsdWF0aW9uRXJyb3InO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUnVudGltZUVycm9yO1xuIiwiLy8gICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbi8qKlxuICogVHJhY2tzIGBsZXRgIGJpbmRpbmdzIGR1cmluZyBleHByZXNzaW9uIHBhcnNpbmcuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTY29wZSB7XG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgY29uc3RydWN0b3IocGFyZW50ICAgICAgICAsIGJpbmRpbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBbXSkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5iaW5kaW5ncyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBleHByZXNzaW9uXSBvZiBiaW5kaW5ncykge1xuICAgICAgICAgICAgdGhpcy5iaW5kaW5nc1tuYW1lXSA9IGV4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25jYXQoYmluZGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICByZXR1cm4gbmV3IFNjb3BlKHRoaXMsIGJpbmRpbmdzKTtcbiAgICB9XG5cbiAgICBnZXQobmFtZSAgICAgICAgKSAgICAgICAgICAgICB7XG4gICAgICAgIGlmICh0aGlzLmJpbmRpbmdzW25hbWVdKSB7IHJldHVybiB0aGlzLmJpbmRpbmdzW25hbWVdOyB9XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkgeyByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0KG5hbWUpOyB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lfSBub3QgZm91bmQgaW4gc2NvcGUuYCk7XG4gICAgfVxuXG4gICAgaGFzKG5hbWUgICAgICAgICkgICAgICAgICAge1xuICAgICAgICBpZiAodGhpcy5iaW5kaW5nc1tuYW1lXSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LmhhcyhuYW1lKSA6IGZhbHNlO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTY29wZTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IFJ1bnRpbWVFcnJvciA9IHJlcXVpcmUoJy4vcnVudGltZV9lcnJvcicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzdG9wIDw9IGlucHV0LCBvciAwIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKHN0b3BzICAgICAgICAgICAgICAgLCBpbnB1dCAgICAgICAgKSB7XG4gICAgY29uc3QgbiA9IHN0b3BzLmxlbmd0aDtcbiAgICBsZXQgbG93ZXJJbmRleCA9IDA7XG4gICAgbGV0IHVwcGVySW5kZXggPSBuIC0gMTtcbiAgICBsZXQgY3VycmVudEluZGV4ID0gMDtcbiAgICBsZXQgY3VycmVudFZhbHVlLCB1cHBlclZhbHVlO1xuXG4gICAgd2hpbGUgKGxvd2VySW5kZXggPD0gdXBwZXJJbmRleCkge1xuICAgICAgICBjdXJyZW50SW5kZXggPSBNYXRoLmZsb29yKChsb3dlckluZGV4ICsgdXBwZXJJbmRleCkgLyAyKTtcbiAgICAgICAgY3VycmVudFZhbHVlID0gc3RvcHNbY3VycmVudEluZGV4XTtcbiAgICAgICAgdXBwZXJWYWx1ZSA9IHN0b3BzW2N1cnJlbnRJbmRleCArIDFdO1xuICAgICAgICBpZiAoaW5wdXQgPT09IGN1cnJlbnRWYWx1ZSB8fCBpbnB1dCA+IGN1cnJlbnRWYWx1ZSAmJiBpbnB1dCA8IHVwcGVyVmFsdWUpIHsgLy8gU2VhcmNoIGNvbXBsZXRlXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudEluZGV4O1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZSA8IGlucHV0KSB7XG4gICAgICAgICAgICBsb3dlckluZGV4ID0gY3VycmVudEluZGV4ICsgMTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VmFsdWUgPiBpbnB1dCkge1xuICAgICAgICAgICAgdXBwZXJJbmRleCA9IGN1cnJlbnRJbmRleCAtIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKCdJbnB1dCBpcyBub3QgYSBudW1iZXIuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gTWF0aC5tYXgoY3VycmVudEluZGV4IC0gMSwgMCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge2ZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG99O1xuIiwiLy8gICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgXG4gXG5cbmNvbnN0IE51bGxUeXBlID0geyBraW5kOiAnbnVsbCcgfTtcbmNvbnN0IE51bWJlclR5cGUgPSB7IGtpbmQ6ICdudW1iZXInIH07XG5jb25zdCBTdHJpbmdUeXBlID0geyBraW5kOiAnc3RyaW5nJyB9O1xuY29uc3QgQm9vbGVhblR5cGUgPSB7IGtpbmQ6ICdib29sZWFuJyB9O1xuY29uc3QgQ29sb3JUeXBlID0geyBraW5kOiAnY29sb3InIH07XG5jb25zdCBPYmplY3RUeXBlID0geyBraW5kOiAnb2JqZWN0JyB9O1xuY29uc3QgVmFsdWVUeXBlID0geyBraW5kOiAndmFsdWUnIH07XG5jb25zdCBFcnJvclR5cGUgPSB7IGtpbmQ6ICdlcnJvcicgfTtcblxuZnVuY3Rpb24gYXJyYXkoaXRlbVR5cGUgICAgICAsIE4gICAgICAgICApICAgICAgICAgICAge1xuICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6ICdhcnJheScsXG4gICAgICAgIGl0ZW1UeXBlLFxuICAgICAgICBOXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gdG9TdHJpbmcodHlwZSAgICAgICkgICAgICAgICB7XG4gICAgaWYgKHR5cGUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgICAgICBjb25zdCBpdGVtVHlwZSA9IHRvU3RyaW5nKHR5cGUuaXRlbVR5cGUpO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHR5cGUuTiA9PT0gJ251bWJlcicgP1xuICAgICAgICAgICAgYGFycmF5PCR7aXRlbVR5cGV9LCAke3R5cGUuTn0+YCA6XG4gICAgICAgICAgICB0eXBlLml0ZW1UeXBlLmtpbmQgPT09ICd2YWx1ZScgPyAnYXJyYXknIDogYGFycmF5PCR7aXRlbVR5cGV9PmA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHR5cGUua2luZDtcbiAgICB9XG59XG5cbmNvbnN0IHZhbHVlTWVtYmVyVHlwZXMgPSBbXG4gICAgTnVsbFR5cGUsXG4gICAgTnVtYmVyVHlwZSxcbiAgICBTdHJpbmdUeXBlLFxuICAgIEJvb2xlYW5UeXBlLFxuICAgIENvbG9yVHlwZSxcbiAgICBPYmplY3RUeXBlLFxuICAgIGFycmF5KFZhbHVlVHlwZSlcbl07XG5cbi8qKlxuICogUmV0dXJucyBudWxsIGlmIGB0YCBpcyBhIHN1YnR5cGUgb2YgYGV4cGVjdGVkYDsgb3RoZXJ3aXNlIHJldHVybnMgYW5cbiAqIGVycm9yIG1lc3NhZ2UuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja1N1YnR5cGUoZXhwZWN0ZWQgICAgICAsIHQgICAgICApICAgICAgICAgIHtcbiAgICBpZiAodC5raW5kID09PSAnZXJyb3InKSB7XG4gICAgICAgIC8vIEVycm9yIGlzIGEgc3VidHlwZSBvZiBldmVyeSB0eXBlXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWQua2luZCA9PT0gJ2FycmF5Jykge1xuICAgICAgICBpZiAodC5raW5kID09PSAnYXJyYXknICYmXG4gICAgICAgICAgICAhY2hlY2tTdWJ0eXBlKGV4cGVjdGVkLml0ZW1UeXBlLCB0Lml0ZW1UeXBlKSAmJlxuICAgICAgICAgICAgKHR5cGVvZiBleHBlY3RlZC5OICE9PSAnbnVtYmVyJyB8fCBleHBlY3RlZC5OID09PSB0Lk4pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWQua2luZCA9PT0gdC5raW5kKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWQua2luZCA9PT0gJ3ZhbHVlJykge1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlclR5cGUgb2YgdmFsdWVNZW1iZXJUeXBlcykge1xuICAgICAgICAgICAgaWYgKCFjaGVja1N1YnR5cGUobWVtYmVyVHlwZSwgdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBgRXhwZWN0ZWQgJHt0b1N0cmluZyhleHBlY3RlZCl9IGJ1dCBmb3VuZCAke3RvU3RyaW5nKHQpfSBpbnN0ZWFkLmA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIE51bGxUeXBlLFxuICAgIE51bWJlclR5cGUsXG4gICAgU3RyaW5nVHlwZSxcbiAgICBCb29sZWFuVHlwZSxcbiAgICBDb2xvclR5cGUsXG4gICAgT2JqZWN0VHlwZSxcbiAgICBWYWx1ZVR5cGUsXG4gICAgYXJyYXksXG4gICAgRXJyb3JUeXBlLFxuICAgIHRvU3RyaW5nLFxuICAgIGNoZWNrU3VidHlwZVxufTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuY29uc3QgQ29sb3IgPSByZXF1aXJlKCcuLi91dGlsL2NvbG9yJyk7XG5cbmNvbnN0IHtcbiAgICBOdWxsVHlwZSxcbiAgICBOdW1iZXJUeXBlLFxuICAgIFN0cmluZ1R5cGUsXG4gICAgQm9vbGVhblR5cGUsXG4gICAgQ29sb3JUeXBlLFxuICAgIE9iamVjdFR5cGUsXG4gICAgVmFsdWVUeXBlLFxuICAgIGFycmF5XG59ID0gcmVxdWlyZSgnLi90eXBlcycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuZnVuY3Rpb24gdmFsaWRhdGVSR0JBKHIgICAgICAgLCBnICAgICAgICwgYiAgICAgICAsIGEgICAgICAgICkgICAgICAgICAge1xuICAgIGlmICghKFxuICAgICAgICB0eXBlb2YgciA9PT0gJ251bWJlcicgJiYgciA+PSAwICYmIHIgPD0gMjU1ICYmXG4gICAgICAgIHR5cGVvZiBnID09PSAnbnVtYmVyJyAmJiBnID49IDAgJiYgZyA8PSAyNTUgJiZcbiAgICAgICAgdHlwZW9mIGIgPT09ICdudW1iZXInICYmIGIgPj0gMCAmJiBiIDw9IDI1NVxuICAgICkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgYSA9PT0gJ251bWJlcicgPyBbciwgZywgYiwgYV0gOiBbciwgZywgYl07XG4gICAgICAgIHJldHVybiBgSW52YWxpZCByZ2JhIHZhbHVlIFske3ZhbHVlLmpvaW4oJywgJyl9XTogJ3InLCAnZycsIGFuZCAnYicgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NS5gO1xuICAgIH1cblxuICAgIGlmICghKFxuICAgICAgICB0eXBlb2YgYSA9PT0gJ3VuZGVmaW5lZCcgfHwgKHR5cGVvZiBhID09PSAnbnVtYmVyJyAmJiBhID49IDAgJiYgYSA8PSAxKVxuICAgICkpIHtcbiAgICAgICAgcmV0dXJuIGBJbnZhbGlkIHJnYmEgdmFsdWUgWyR7W3IsIGcsIGIsIGFdLmpvaW4oJywgJyl9XTogJ2EnIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxLmA7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmZ1bmN0aW9uIGlzVmFsdWUobWl4ZWQgICAgICAgKSAgICAgICAgICB7XG4gICAgaWYgKG1peGVkID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1peGVkID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtaXhlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1peGVkID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG1peGVkIGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1peGVkKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbWl4ZWQpIHtcbiAgICAgICAgICAgIGlmICghaXNWYWx1ZShpdGVtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtaXhlZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWl4ZWQpIHtcbiAgICAgICAgICAgIGlmICghaXNWYWx1ZShtaXhlZFtrZXldKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0eXBlT2YodmFsdWUgICAgICAgKSAgICAgICB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBOdWxsVHlwZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZ1R5cGU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gQm9vbGVhblR5cGU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBOdW1iZXJUeXBlO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBDb2xvcikge1xuICAgICAgICByZXR1cm4gQ29sb3JUeXBlO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICBsZXQgaXRlbVR5cGUgICAgICAgO1xuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IHR5cGVPZihpdGVtKTtcbiAgICAgICAgICAgIGlmICghaXRlbVR5cGUpIHtcbiAgICAgICAgICAgICAgICBpdGVtVHlwZSA9IHQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW1UeXBlID09PSB0KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZW1UeXBlID0gVmFsdWVUeXBlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFycmF5KGl0ZW1UeXBlIHx8IFZhbHVlVHlwZSwgbGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jyk7XG4gICAgICAgIHJldHVybiBPYmplY3RUeXBlO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgQ29sb3IsXG4gICAgdmFsaWRhdGVSR0JBLFxuICAgIGlzVmFsdWUsXG4gICAgdHlwZU9mXG59O1xuIiwiLy8gICAgICBcblxuY29uc3Qge2NyZWF0ZUV4cHJlc3Npb259ID0gcmVxdWlyZSgnLi4vZXhwcmVzc2lvbicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUZpbHRlcjtcbm1vZHVsZS5leHBvcnRzLmlzRXhwcmVzc2lvbkZpbHRlciA9IGlzRXhwcmVzc2lvbkZpbHRlcjtcblxuZnVuY3Rpb24gaXNFeHByZXNzaW9uRmlsdGVyKGZpbHRlcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXIpIHx8IGZpbHRlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzd2l0Y2ggKGZpbHRlclswXSkge1xuICAgIGNhc2UgJ2hhcyc6XG4gICAgICAgIHJldHVybiBmaWx0ZXIubGVuZ3RoID49IDIgJiYgZmlsdGVyWzFdICE9PSAnJGlkJyAmJiBmaWx0ZXJbMV0gIT09ICckdHlwZSc7XG5cbiAgICBjYXNlICdpbic6XG4gICAgY2FzZSAnIWluJzpcbiAgICBjYXNlICchaGFzJzpcbiAgICBjYXNlICdub25lJzpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgY2FzZSAnPT0nOlxuICAgIGNhc2UgJyE9JzpcbiAgICBjYXNlICc+JzpcbiAgICBjYXNlICc+PSc6XG4gICAgY2FzZSAnPCc6XG4gICAgY2FzZSAnPD0nOlxuICAgICAgICByZXR1cm4gZmlsdGVyLmxlbmd0aCA9PT0gMyAmJiAoQXJyYXkuaXNBcnJheShmaWx0ZXJbMV0pIHx8IEFycmF5LmlzQXJyYXkoZmlsdGVyWzJdKSk7XG5cbiAgICBjYXNlICdhbnknOlxuICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBmaWx0ZXIuc2xpY2UoMSkpIHtcbiAgICAgICAgICAgIGlmICghaXNFeHByZXNzaW9uRmlsdGVyKGYpICYmIHR5cGVvZiBmICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbmNvbnN0IGZpbHRlclNwZWMgPSB7XG4gICAgJ3R5cGUnOiAnYm9vbGVhbicsXG4gICAgJ2RlZmF1bHQnOiBmYWxzZSxcbiAgICAnZnVuY3Rpb24nOiB0cnVlLFxuICAgICdwcm9wZXJ0eS1mdW5jdGlvbic6IHRydWUsXG4gICAgJ3pvb20tZnVuY3Rpb24nOiB0cnVlXG59O1xuXG4vKipcbiAqIEdpdmVuIGEgZmlsdGVyIGV4cHJlc3NlZCBhcyBuZXN0ZWQgYXJyYXlzLCByZXR1cm4gYSBuZXcgZnVuY3Rpb25cbiAqIHRoYXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiBmZWF0dXJlICh3aXRoIGEgLnByb3BlcnRpZXMgb3IgLnRhZ3MgcHJvcGVydHkpXG4gKiBwYXNzZXMgaXRzIHRlc3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlciBtYXBib3ggZ2wgZmlsdGVyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGZpbHRlci1ldmFsdWF0aW5nIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUZpbHRlcihmaWx0ZXIgICAgICkgICAgICAgICAgICAgICAge1xuICAgIGlmICghZmlsdGVyKSB7XG4gICAgICAgIHJldHVybiAoKSA9PiB0cnVlO1xuICAgIH1cblxuICAgIGlmICghaXNFeHByZXNzaW9uRmlsdGVyKGZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gY29udmVydEZpbHRlcihmaWx0ZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBpbGVkID0gY3JlYXRlRXhwcmVzc2lvbihmaWx0ZXIsIGZpbHRlclNwZWMpO1xuICAgIGlmIChjb21waWxlZC5yZXN1bHQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbXBpbGVkLnZhbHVlLm1hcChlcnIgPT4gYCR7ZXJyLmtleX06ICR7ZXJyLm1lc3NhZ2V9YCkuam9pbignLCAnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChnbG9iYWxQcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgLCBmZWF0dXJlICAgICAgICAgICAgICAgICAgICkgPT4gY29tcGlsZWQudmFsdWUuZXZhbHVhdGUoZ2xvYmFsUHJvcGVydGllcywgZmVhdHVyZSk7XG4gICAgfVxufVxuXG4vLyBDb21wYXJpc29uIGZ1bmN0aW9uIHRvIHNvcnQgbnVtYmVycyBhbmQgc3RyaW5nc1xuZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RmlsdGVyKGZpbHRlciAgICAgICAgICAgICApICAgICAgICB7XG4gICAgaWYgKCFmaWx0ZXIpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IG9wID0gZmlsdGVyWzBdO1xuICAgIGlmIChmaWx0ZXIubGVuZ3RoIDw9IDEpIHJldHVybiAob3AgIT09ICdhbnknKTtcbiAgICBjb25zdCBjb252ZXJ0ZWQgPVxuICAgICAgICBvcCA9PT0gJz09JyA/IGNvbnZlcnRDb21wYXJpc29uT3AoZmlsdGVyWzFdLCBmaWx0ZXJbMl0sICc9PScpIDpcbiAgICAgICAgb3AgPT09ICchPScgPyBjb252ZXJ0TmVnYXRpb24oY29udmVydENvbXBhcmlzb25PcChmaWx0ZXJbMV0sIGZpbHRlclsyXSwgJz09JykpIDpcbiAgICAgICAgb3AgPT09ICc8JyB8fFxuICAgICAgICBvcCA9PT0gJz4nIHx8XG4gICAgICAgIG9wID09PSAnPD0nIHx8XG4gICAgICAgIG9wID09PSAnPj0nID8gY29udmVydENvbXBhcmlzb25PcChmaWx0ZXJbMV0sIGZpbHRlclsyXSwgb3ApIDpcbiAgICAgICAgb3AgPT09ICdhbnknID8gY29udmVydERpc2p1bmN0aW9uT3AoZmlsdGVyLnNsaWNlKDEpKSA6XG4gICAgICAgIG9wID09PSAnYWxsJyA/IFsnYWxsJ10uY29uY2F0KGZpbHRlci5zbGljZSgxKS5tYXAoY29udmVydEZpbHRlcikpIDpcbiAgICAgICAgb3AgPT09ICdub25lJyA/IFsnYWxsJ10uY29uY2F0KGZpbHRlci5zbGljZSgxKS5tYXAoY29udmVydEZpbHRlcikubWFwKGNvbnZlcnROZWdhdGlvbikpIDpcbiAgICAgICAgb3AgPT09ICdpbicgPyBjb252ZXJ0SW5PcChmaWx0ZXJbMV0sIGZpbHRlci5zbGljZSgyKSkgOlxuICAgICAgICBvcCA9PT0gJyFpbicgPyBjb252ZXJ0TmVnYXRpb24oY29udmVydEluT3AoZmlsdGVyWzFdLCBmaWx0ZXIuc2xpY2UoMikpKSA6XG4gICAgICAgIG9wID09PSAnaGFzJyA/IGNvbnZlcnRIYXNPcChmaWx0ZXJbMV0pIDpcbiAgICAgICAgb3AgPT09ICchaGFzJyA/IGNvbnZlcnROZWdhdGlvbihjb252ZXJ0SGFzT3AoZmlsdGVyWzFdKSkgOlxuICAgICAgICB0cnVlO1xuICAgIHJldHVybiBjb252ZXJ0ZWQ7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRDb21wYXJpc29uT3AocHJvcGVydHkgICAgICAgICwgdmFsdWUgICAgICwgb3AgICAgICAgICkge1xuICAgIHN3aXRjaCAocHJvcGVydHkpIHtcbiAgICBjYXNlICckdHlwZSc6XG4gICAgICAgIHJldHVybiBbYGZpbHRlci10eXBlLSR7b3B9YCwgdmFsdWVdO1xuICAgIGNhc2UgJyRpZCc6XG4gICAgICAgIHJldHVybiBbYGZpbHRlci1pZC0ke29wfWAsIHZhbHVlXTtcbiAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW2BmaWx0ZXItJHtvcH1gLCBwcm9wZXJ0eSwgdmFsdWVdO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY29udmVydERpc2p1bmN0aW9uT3AoZmlsdGVycyAgICAgICAgICAgICAgICAgICApIHtcbiAgICByZXR1cm4gWydhbnknXS5jb25jYXQoZmlsdGVycy5tYXAoY29udmVydEZpbHRlcikpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0SW5PcChwcm9wZXJ0eSAgICAgICAgLCB2YWx1ZXMgICAgICAgICAgICApIHtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBzd2l0Y2ggKHByb3BlcnR5KSB7XG4gICAgY2FzZSAnJHR5cGUnOlxuICAgICAgICByZXR1cm4gW2BmaWx0ZXItdHlwZS1pbmAsIFsnbGl0ZXJhbCcsIHZhbHVlc11dO1xuICAgIGNhc2UgJyRpZCc6XG4gICAgICAgIHJldHVybiBbYGZpbHRlci1pZC1pbmAsIFsnbGl0ZXJhbCcsIHZhbHVlc11dO1xuICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMjAwICYmICF2YWx1ZXMuc29tZSh2ID0+IHR5cGVvZiB2ICE9PSB0eXBlb2YgdmFsdWVzWzBdKSkge1xuICAgICAgICAgICAgcmV0dXJuIFsnZmlsdGVyLWluLWxhcmdlJywgcHJvcGVydHksIFsnbGl0ZXJhbCcsIHZhbHVlcy5zb3J0KGNvbXBhcmUpXV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gWydmaWx0ZXItaW4tc21hbGwnLCBwcm9wZXJ0eSwgWydsaXRlcmFsJywgdmFsdWVzXV07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRIYXNPcChwcm9wZXJ0eSAgICAgICAgKSB7XG4gICAgc3dpdGNoIChwcm9wZXJ0eSkge1xuICAgIGNhc2UgJyR0eXBlJzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSAnJGlkJzpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLWhhcy1pZGBdO1xuICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbYGZpbHRlci1oYXNgLCBwcm9wZXJ0eV07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0TmVnYXRpb24oZmlsdGVyICAgICAgICkge1xuICAgIHJldHVybiBbJyEnLCBmaWx0ZXJdO1xufVxuXG4iLCJcbmNvbnN0IGNvbG9yU3BhY2VzID0gcmVxdWlyZSgnLi4vdXRpbC9jb2xvcl9zcGFjZXMnKTtcbmNvbnN0IENvbG9yID0gcmVxdWlyZSgnLi4vdXRpbC9jb2xvcicpO1xuY29uc3QgZXh0ZW5kID0gcmVxdWlyZSgnLi4vdXRpbC9leHRlbmQnKTtcbmNvbnN0IGdldFR5cGUgPSByZXF1aXJlKCcuLi91dGlsL2dldF90eXBlJyk7XG5jb25zdCBpbnRlcnBvbGF0ZSA9IHJlcXVpcmUoJy4uL3V0aWwvaW50ZXJwb2xhdGUnKTtcbmNvbnN0IEludGVycG9sYXRlID0gcmVxdWlyZSgnLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbnRlcnBvbGF0ZScpO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBpZGVudGl0eUZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb24ocGFyYW1ldGVycywgcHJvcGVydHlTcGVjKSB7XG4gICAgY29uc3QgaXNDb2xvciA9IHByb3BlcnR5U3BlYy50eXBlID09PSAnY29sb3InO1xuICAgIGNvbnN0IHpvb21BbmRGZWF0dXJlRGVwZW5kZW50ID0gcGFyYW1ldGVycy5zdG9wcyAmJiB0eXBlb2YgcGFyYW1ldGVycy5zdG9wc1swXVswXSA9PT0gJ29iamVjdCc7XG4gICAgY29uc3QgZmVhdHVyZURlcGVuZGVudCA9IHpvb21BbmRGZWF0dXJlRGVwZW5kZW50IHx8IHBhcmFtZXRlcnMucHJvcGVydHkgIT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCB6b29tRGVwZW5kZW50ID0gem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQgfHwgIWZlYXR1cmVEZXBlbmRlbnQ7XG4gICAgY29uc3QgdHlwZSA9IHBhcmFtZXRlcnMudHlwZSB8fCAocHJvcGVydHlTcGVjLmZ1bmN0aW9uID09PSAnaW50ZXJwb2xhdGVkJyA/ICdleHBvbmVudGlhbCcgOiAnaW50ZXJ2YWwnKTtcblxuICAgIGlmIChpc0NvbG9yKSB7XG4gICAgICAgIHBhcmFtZXRlcnMgPSBleHRlbmQoe30sIHBhcmFtZXRlcnMpO1xuXG4gICAgICAgIGlmIChwYXJhbWV0ZXJzLnN0b3BzKSB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzLnN0b3BzID0gcGFyYW1ldGVycy5zdG9wcy5tYXAoKHN0b3ApID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3N0b3BbMF0sIENvbG9yLnBhcnNlKHN0b3BbMV0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmFtZXRlcnMuZGVmYXVsdCkge1xuICAgICAgICAgICAgcGFyYW1ldGVycy5kZWZhdWx0ID0gQ29sb3IucGFyc2UocGFyYW1ldGVycy5kZWZhdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmFtZXRlcnMuZGVmYXVsdCA9IENvbG9yLnBhcnNlKHByb3BlcnR5U3BlYy5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbWV0ZXJzLmNvbG9yU3BhY2UgJiYgcGFyYW1ldGVycy5jb2xvclNwYWNlICE9PSAncmdiJyAmJiAhY29sb3JTcGFjZXNbcGFyYW1ldGVycy5jb2xvclNwYWNlXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29sb3Igc3BhY2U6ICR7cGFyYW1ldGVycy5jb2xvclNwYWNlfWApO1xuICAgIH1cblxuICAgIGxldCBpbm5lckZ1bjtcbiAgICBsZXQgaGFzaGVkU3RvcHM7XG4gICAgbGV0IGNhdGVnb3JpY2FsS2V5VHlwZTtcbiAgICBpZiAodHlwZSA9PT0gJ2V4cG9uZW50aWFsJykge1xuICAgICAgICBpbm5lckZ1biA9IGV2YWx1YXRlRXhwb25lbnRpYWxGdW5jdGlvbjtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdpbnRlcnZhbCcpIHtcbiAgICAgICAgaW5uZXJGdW4gPSBldmFsdWF0ZUludGVydmFsRnVuY3Rpb247XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnY2F0ZWdvcmljYWwnKSB7XG4gICAgICAgIGlubmVyRnVuID0gZXZhbHVhdGVDYXRlZ29yaWNhbEZ1bmN0aW9uO1xuXG4gICAgICAgIC8vIEZvciBjYXRlZ29yaWNhbCBmdW5jdGlvbnMsIGdlbmVyYXRlIGFuIE9iamVjdCBhcyBhIGhhc2htYXAgb2YgdGhlIHN0b3BzIGZvciBmYXN0IHNlYXJjaGluZ1xuICAgICAgICBoYXNoZWRTdG9wcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGZvciAoY29uc3Qgc3RvcCBvZiBwYXJhbWV0ZXJzLnN0b3BzKSB7XG4gICAgICAgICAgICBoYXNoZWRTdG9wc1tzdG9wWzBdXSA9IHN0b3BbMV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmZlciBrZXkgdHlwZSBiYXNlZCBvbiBmaXJzdCBzdG9wIGtleS0tIHVzZWQgdG8gZW5jZm9yY2Ugc3RyaWN0IHR5cGUgY2hlY2tpbmcgbGF0ZXJcbiAgICAgICAgY2F0ZWdvcmljYWxLZXlUeXBlID0gdHlwZW9mIHBhcmFtZXRlcnMuc3RvcHNbMF1bMF07XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdpZGVudGl0eScpIHtcbiAgICAgICAgaW5uZXJGdW4gPSBldmFsdWF0ZUlkZW50aXR5RnVuY3Rpb247XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZ1bmN0aW9uIHR5cGUgXCIke3R5cGV9XCJgKTtcbiAgICB9XG5cbiAgICBpZiAoem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQpIHtcbiAgICAgICAgY29uc3QgZmVhdHVyZUZ1bmN0aW9ucyA9IHt9O1xuICAgICAgICBjb25zdCB6b29tU3RvcHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcyA9IDA7IHMgPCBwYXJhbWV0ZXJzLnN0b3BzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICBjb25zdCBzdG9wID0gcGFyYW1ldGVycy5zdG9wc1tzXTtcbiAgICAgICAgICAgIGNvbnN0IHpvb20gPSBzdG9wWzBdLnpvb207XG4gICAgICAgICAgICBpZiAoZmVhdHVyZUZ1bmN0aW9uc1t6b29tXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZUZ1bmN0aW9uc1t6b29tXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgem9vbTogem9vbSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogcGFyYW1ldGVycy50eXBlLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogcGFyYW1ldGVycy5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogcGFyYW1ldGVycy5kZWZhdWx0LFxuICAgICAgICAgICAgICAgICAgICBzdG9wczogW11cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHpvb21TdG9wcy5wdXNoKHpvb20pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmVhdHVyZUZ1bmN0aW9uc1t6b29tXS5zdG9wcy5wdXNoKFtzdG9wWzBdLnZhbHVlLCBzdG9wWzFdXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmZWF0dXJlRnVuY3Rpb25TdG9wcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHogb2Ygem9vbVN0b3BzKSB7XG4gICAgICAgICAgICBmZWF0dXJlRnVuY3Rpb25TdG9wcy5wdXNoKFtmZWF0dXJlRnVuY3Rpb25zW3pdLnpvb20sIGNyZWF0ZUZ1bmN0aW9uKGZlYXR1cmVGdW5jdGlvbnNbel0sIHByb3BlcnR5U3BlYyldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY29tcG9zaXRlJyxcbiAgICAgICAgICAgIGludGVycG9sYXRpb25GYWN0b3I6IEludGVycG9sYXRlLmludGVycG9sYXRpb25GYWN0b3IuYmluZCh1bmRlZmluZWQsIHtuYW1lOiAnbGluZWFyJ30pLFxuICAgICAgICAgICAgem9vbVN0b3BzOiBmZWF0dXJlRnVuY3Rpb25TdG9wcy5tYXAocyA9PiBzWzBdKSxcbiAgICAgICAgICAgIGV2YWx1YXRlKHt6b29tfSwgcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb24oe1xuICAgICAgICAgICAgICAgICAgICBzdG9wczogZmVhdHVyZUZ1bmN0aW9uU3RvcHMsXG4gICAgICAgICAgICAgICAgICAgIGJhc2U6IHBhcmFtZXRlcnMuYmFzZVxuICAgICAgICAgICAgICAgIH0sIHByb3BlcnR5U3BlYywgem9vbSkuZXZhbHVhdGUoem9vbSwgcHJvcGVydGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh6b29tRGVwZW5kZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY2FtZXJhJyxcbiAgICAgICAgICAgIGludGVycG9sYXRpb25GYWN0b3I6IHR5cGUgPT09ICdleHBvbmVudGlhbCcgP1xuICAgICAgICAgICAgICAgIEludGVycG9sYXRlLmludGVycG9sYXRpb25GYWN0b3IuYmluZCh1bmRlZmluZWQsIHtuYW1lOiAnZXhwb25lbnRpYWwnLCBiYXNlOiBwYXJhbWV0ZXJzLmJhc2UgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYmFzZSA6IDF9KSA6XG4gICAgICAgICAgICAgICAgKCkgPT4gMCxcbiAgICAgICAgICAgIHpvb21TdG9wczogcGFyYW1ldGVycy5zdG9wcy5tYXAocyA9PiBzWzBdKSxcbiAgICAgICAgICAgIGV2YWx1YXRlOiAoe3pvb219KSA9PiBpbm5lckZ1bihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIHpvb20sIGhhc2hlZFN0b3BzLCBjYXRlZ29yaWNhbEtleVR5cGUpXG4gICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6ICdzb3VyY2UnLFxuICAgICAgICAgICAgZXZhbHVhdGUoXywgZmVhdHVyZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZmVhdHVyZSAmJiBmZWF0dXJlLnByb3BlcnRpZXMgPyBmZWF0dXJlLnByb3BlcnRpZXNbcGFyYW1ldGVycy5wcm9wZXJ0eV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvYWxlc2NlKHBhcmFtZXRlcnMuZGVmYXVsdCwgcHJvcGVydHlTcGVjLmRlZmF1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaW5uZXJGdW4ocGFyYW1ldGVycywgcHJvcGVydHlTcGVjLCB2YWx1ZSwgaGFzaGVkU3RvcHMsIGNhdGVnb3JpY2FsS2V5VHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb2FsZXNjZShhLCBiLCBjKSB7XG4gICAgaWYgKGEgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGE7XG4gICAgaWYgKGIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGI7XG4gICAgaWYgKGMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGM7XG59XG5cbmZ1bmN0aW9uIGV2YWx1YXRlQ2F0ZWdvcmljYWxGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIGlucHV0LCBoYXNoZWRTdG9wcywga2V5VHlwZSkge1xuICAgIGNvbnN0IGV2YWx1YXRlZCA9IHR5cGVvZiBpbnB1dCA9PT0ga2V5VHlwZSA/IGhhc2hlZFN0b3BzW2lucHV0XSA6IHVuZGVmaW5lZDsgLy8gRW5mb3JjZSBzdHJpY3QgdHlwaW5nIG9uIGlucHV0XG4gICAgcmV0dXJuIGNvYWxlc2NlKGV2YWx1YXRlZCwgcGFyYW1ldGVycy5kZWZhdWx0LCBwcm9wZXJ0eVNwZWMuZGVmYXVsdCk7XG59XG5cbmZ1bmN0aW9uIGV2YWx1YXRlSW50ZXJ2YWxGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIGlucHV0KSB7XG4gICAgLy8gRWRnZSBjYXNlc1xuICAgIGlmIChnZXRUeXBlKGlucHV0KSAhPT0gJ251bWJlcicpIHJldHVybiBjb2FsZXNjZShwYXJhbWV0ZXJzLmRlZmF1bHQsIHByb3BlcnR5U3BlYy5kZWZhdWx0KTtcbiAgICBjb25zdCBuID0gcGFyYW1ldGVycy5zdG9wcy5sZW5ndGg7XG4gICAgaWYgKG4gPT09IDEpIHJldHVybiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzFdO1xuICAgIGlmIChpbnB1dCA8PSBwYXJhbWV0ZXJzLnN0b3BzWzBdWzBdKSByZXR1cm4gcGFyYW1ldGVycy5zdG9wc1swXVsxXTtcbiAgICBpZiAoaW5wdXQgPj0gcGFyYW1ldGVycy5zdG9wc1tuIC0gMV1bMF0pIHJldHVybiBwYXJhbWV0ZXJzLnN0b3BzW24gLSAxXVsxXTtcblxuICAgIGNvbnN0IGluZGV4ID0gZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUbyhwYXJhbWV0ZXJzLnN0b3BzLCBpbnB1dCk7XG5cbiAgICByZXR1cm4gcGFyYW1ldGVycy5zdG9wc1tpbmRleF1bMV07XG59XG5cbmZ1bmN0aW9uIGV2YWx1YXRlRXhwb25lbnRpYWxGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIGlucHV0KSB7XG4gICAgY29uc3QgYmFzZSA9IHBhcmFtZXRlcnMuYmFzZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5iYXNlIDogMTtcblxuICAgIC8vIEVkZ2UgY2FzZXNcbiAgICBpZiAoZ2V0VHlwZShpbnB1dCkgIT09ICdudW1iZXInKSByZXR1cm4gY29hbGVzY2UocGFyYW1ldGVycy5kZWZhdWx0LCBwcm9wZXJ0eVNwZWMuZGVmYXVsdCk7XG4gICAgY29uc3QgbiA9IHBhcmFtZXRlcnMuc3RvcHMubGVuZ3RoO1xuICAgIGlmIChuID09PSAxKSByZXR1cm4gcGFyYW1ldGVycy5zdG9wc1swXVsxXTtcbiAgICBpZiAoaW5wdXQgPD0gcGFyYW1ldGVycy5zdG9wc1swXVswXSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbMF1bMV07XG4gICAgaWYgKGlucHV0ID49IHBhcmFtZXRlcnMuc3RvcHNbbiAtIDFdWzBdKSByZXR1cm4gcGFyYW1ldGVycy5zdG9wc1tuIC0gMV1bMV07XG5cbiAgICBjb25zdCBpbmRleCA9IGZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG8ocGFyYW1ldGVycy5zdG9wcywgaW5wdXQpO1xuICAgIGNvbnN0IHQgPSBpbnRlcnBvbGF0aW9uRmFjdG9yKFxuICAgICAgICBpbnB1dCwgYmFzZSxcbiAgICAgICAgcGFyYW1ldGVycy5zdG9wc1tpbmRleF1bMF0sXG4gICAgICAgIHBhcmFtZXRlcnMuc3RvcHNbaW5kZXggKyAxXVswXSk7XG5cbiAgICBjb25zdCBvdXRwdXRMb3dlciA9IHBhcmFtZXRlcnMuc3RvcHNbaW5kZXhdWzFdO1xuICAgIGNvbnN0IG91dHB1dFVwcGVyID0gcGFyYW1ldGVycy5zdG9wc1tpbmRleCArIDFdWzFdO1xuICAgIGxldCBpbnRlcnAgPSBpbnRlcnBvbGF0ZVtwcm9wZXJ0eVNwZWMudHlwZV0gfHwgaWRlbnRpdHlGdW5jdGlvbjtcblxuICAgIGlmIChwYXJhbWV0ZXJzLmNvbG9yU3BhY2UgJiYgcGFyYW1ldGVycy5jb2xvclNwYWNlICE9PSAncmdiJykge1xuICAgICAgICBjb25zdCBjb2xvcnNwYWNlID0gY29sb3JTcGFjZXNbcGFyYW1ldGVycy5jb2xvclNwYWNlXTtcbiAgICAgICAgaW50ZXJwID0gKGEsIGIpID0+IGNvbG9yc3BhY2UucmV2ZXJzZShjb2xvcnNwYWNlLmludGVycG9sYXRlKGNvbG9yc3BhY2UuZm9yd2FyZChhKSwgY29sb3JzcGFjZS5mb3J3YXJkKGIpLCB0KSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvdXRwdXRMb3dlci5ldmFsdWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXZhbHVhdGUoLi4uYXJncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRlZExvd2VyID0gb3V0cHV0TG93ZXIuZXZhbHVhdGUuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBldmFsdWF0ZWRVcHBlciA9IG91dHB1dFVwcGVyLmV2YWx1YXRlLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBmaWxsLW91dGxpbmUtY29sb3IsIHdoaWNoIGhhcyBubyBzcGVjIGRlZmF1bHQuXG4gICAgICAgICAgICAgICAgaWYgKGV2YWx1YXRlZExvd2VyID09PSB1bmRlZmluZWQgfHwgZXZhbHVhdGVkVXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaW50ZXJwKGV2YWx1YXRlZExvd2VyLCBldmFsdWF0ZWRVcHBlciwgdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVycChvdXRwdXRMb3dlciwgb3V0cHV0VXBwZXIsIHQpO1xufVxuXG5mdW5jdGlvbiBldmFsdWF0ZUlkZW50aXR5RnVuY3Rpb24ocGFyYW1ldGVycywgcHJvcGVydHlTcGVjLCBpbnB1dCkge1xuICAgIGlmIChwcm9wZXJ0eVNwZWMudHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICBpbnB1dCA9IENvbG9yLnBhcnNlKGlucHV0KTtcbiAgICB9IGVsc2UgaWYgKGdldFR5cGUoaW5wdXQpICE9PSBwcm9wZXJ0eVNwZWMudHlwZSAmJiAocHJvcGVydHlTcGVjLnR5cGUgIT09ICdlbnVtJyB8fCAhcHJvcGVydHlTcGVjLnZhbHVlc1tpbnB1dF0pKSB7XG4gICAgICAgIGlucHV0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gY29hbGVzY2UoaW5wdXQsIHBhcmFtZXRlcnMuZGVmYXVsdCwgcHJvcGVydHlTcGVjLmRlZmF1bHQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHN0b3AgPD0gaW5wdXQsIG9yIDAgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKHN0b3BzLCBpbnB1dCkge1xuICAgIGNvbnN0IG4gPSBzdG9wcy5sZW5ndGg7XG4gICAgbGV0IGxvd2VySW5kZXggPSAwO1xuICAgIGxldCB1cHBlckluZGV4ID0gbiAtIDE7XG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IDA7XG4gICAgbGV0IGN1cnJlbnRWYWx1ZSwgdXBwZXJWYWx1ZTtcblxuICAgIHdoaWxlIChsb3dlckluZGV4IDw9IHVwcGVySW5kZXgpIHtcbiAgICAgICAgY3VycmVudEluZGV4ID0gTWF0aC5mbG9vcigobG93ZXJJbmRleCArIHVwcGVySW5kZXgpIC8gMik7XG4gICAgICAgIGN1cnJlbnRWYWx1ZSA9IHN0b3BzW2N1cnJlbnRJbmRleF1bMF07XG4gICAgICAgIHVwcGVyVmFsdWUgPSBzdG9wc1tjdXJyZW50SW5kZXggKyAxXVswXTtcbiAgICAgICAgaWYgKGlucHV0ID09PSBjdXJyZW50VmFsdWUgfHwgaW5wdXQgPiBjdXJyZW50VmFsdWUgJiYgaW5wdXQgPCB1cHBlclZhbHVlKSB7IC8vIFNlYXJjaCBjb21wbGV0ZVxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleDtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VmFsdWUgPCBpbnB1dCkge1xuICAgICAgICAgICAgbG93ZXJJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFZhbHVlID4gaW5wdXQpIHtcbiAgICAgICAgICAgIHVwcGVySW5kZXggPSBjdXJyZW50SW5kZXggLSAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGgubWF4KGN1cnJlbnRJbmRleCAtIDEsIDApO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSByYXRpbyB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVycG9sYXRlIGJldHdlZW4gZXhwb25lbnRpYWwgZnVuY3Rpb25cbiAqIHN0b3BzLlxuICpcbiAqIEhvdyBpdCB3b3JrczpcbiAqIFR3byBjb25zZWN1dGl2ZSBzdG9wIHZhbHVlcyBkZWZpbmUgYSAoc2NhbGVkIGFuZCBzaGlmdGVkKSBleHBvbmVudGlhbFxuICogZnVuY3Rpb24gYGYoeCkgPSBhICogYmFzZV54ICsgYmAsIHdoZXJlIGBiYXNlYCBpcyB0aGUgdXNlci1zcGVjaWZpZWQgYmFzZSxcbiAqIGFuZCBgYWAgYW5kIGBiYCBhcmUgY29uc3RhbnRzIGFmZm9yZGluZyBzdWZmaWNpZW50IGRlZ3JlZXMgb2YgZnJlZWRvbSB0byBmaXRcbiAqIHRoZSBmdW5jdGlvbiB0byB0aGUgZ2l2ZW4gc3RvcHMuXG4gKlxuICogSGVyZSdzIGEgYml0IG9mIGFsZ2VicmEgdGhhdCBsZXRzIHVzIGNvbXB1dGUgYGYoeClgIGRpcmVjdGx5IGZyb20gdGhlIHN0b3BcbiAqIHZhbHVlcyB3aXRob3V0IGV4cGxpY2l0bHkgc29sdmluZyBmb3IgYGFgIGFuZCBgYmA6XG4gKlxuICogRmlyc3Qgc3RvcCB2YWx1ZTogYGYoeDApID0geTAgPSBhICogYmFzZV54MCArIGJgXG4gKiBTZWNvbmQgc3RvcCB2YWx1ZTogYGYoeDEpID0geTEgPSBhICogYmFzZV54MSArIGJgXG4gKiA9PiBgeTEgLSB5MCA9IGEoYmFzZV54MSAtIGJhc2VeeDApYFxuICogPT4gYGEgPSAoeTEgLSB5MCkvKGJhc2VeeDEgLSBiYXNlXngwKWBcbiAqXG4gKiBEZXNpcmVkIHZhbHVlOiBgZih4KSA9IHkgPSBhICogYmFzZV54ICsgYmBcbiAqID0+IGBmKHgpID0geTAgKyBhICogKGJhc2VeeCAtIGJhc2VeeDApYFxuICpcbiAqIEZyb20gdGhlIGFib3ZlLCB3ZSBjYW4gcmVwbGFjZSB0aGUgYGFgIGluIGBhICogKGJhc2VeeCAtIGJhc2VeeDApYCBhbmQgZG8gYVxuICogbGl0dGxlIGFsZ2VicmE6XG4gKiBgYGBcbiAqIGEgKiAoYmFzZV54IC0gYmFzZV54MCkgPSAoeTEgLSB5MCkvKGJhc2VeeDEgLSBiYXNlXngwKSAqIChiYXNlXnggLSBiYXNlXngwKVxuICogICAgICAgICAgICAgICAgICAgICA9ICh5MSAtIHkwKSAqIChiYXNlXnggLSBiYXNlXngwKSAvIChiYXNlXngxIC0gYmFzZV54MClcbiAqIGBgYFxuICpcbiAqIElmIHdlIGxldCBgKGJhc2VeeCAtIGJhc2VeeDApIC8gKGJhc2VeeDEgYmFzZV54MClgLCB0aGVuIHdlIGhhdmVcbiAqIGBmKHgpID0geTAgKyAoeTEgLSB5MCkgKiByYXRpb2AuICBJbiBvdGhlciB3b3JkcywgYHJhdGlvYCBtYXkgYmUgdHJlYXRlZCBhc1xuICogYW4gaW50ZXJwb2xhdGlvbiBmYWN0b3IgYmV0d2VlbiB0aGUgdHdvIHN0b3BzJyBvdXRwdXQgdmFsdWVzLlxuICpcbiAqIChOb3RlOiBhIHNsaWdodGx5IGRpZmZlcmVudCBmb3JtIGZvciBgcmF0aW9gLFxuICogYChiYXNlXih4LXgwKSAtIDEpIC8gKGJhc2VeKHgxLXgwKSAtIDEpIGAsIGlzIGVxdWl2YWxlbnQsIGJ1dCByZXF1aXJlcyBmZXdlclxuICogZXhwZW5zaXZlIGBNYXRoLnBvdygpYCBvcGVyYXRpb25zLilcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBpbnRlcnBvbGF0aW9uRmFjdG9yKGlucHV0LCBiYXNlLCBsb3dlclZhbHVlLCB1cHBlclZhbHVlKSB7XG4gICAgY29uc3QgZGlmZmVyZW5jZSA9IHVwcGVyVmFsdWUgLSBsb3dlclZhbHVlO1xuICAgIGNvbnN0IHByb2dyZXNzID0gaW5wdXQgLSBsb3dlclZhbHVlO1xuXG4gICAgaWYgKGRpZmZlcmVuY2UgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIGlmIChiYXNlID09PSAxKSB7XG4gICAgICAgIHJldHVybiBwcm9ncmVzcyAvIGRpZmZlcmVuY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChNYXRoLnBvdyhiYXNlLCBwcm9ncmVzcykgLSAxKSAvIChNYXRoLnBvdyhiYXNlLCBkaWZmZXJlbmNlKSAtIDEpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgY3JlYXRlRnVuY3Rpb24sXG4gICAgaXNGdW5jdGlvblxufTtcbiIsIlxuY29uc3QgcmVmUHJvcGVydGllcyA9IHJlcXVpcmUoJy4vdXRpbC9yZWZfcHJvcGVydGllcycpO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkob2JqKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBvYmo7XG4gICAgaWYgKHR5cGUgPT09ICdudW1iZXInIHx8IHR5cGUgPT09ICdib29sZWFuJyB8fCB0eXBlID09PSAnc3RyaW5nJyB8fCBvYmogPT09IHVuZGVmaW5lZCB8fCBvYmogPT09IG51bGwpXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBsZXQgc3RyID0gJ1snO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiBvYmopIHtcbiAgICAgICAgICAgIHN0ciArPSBgJHtzdHJpbmdpZnkodmFsKX0sYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7c3RyfV1gO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopLnNvcnQoKTtcblxuICAgIGxldCBzdHIgPSAneyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN0ciArPSBgJHtKU09OLnN0cmluZ2lmeShrZXlzW2ldKX06JHtzdHJpbmdpZnkob2JqW2tleXNbaV1dKX0sYDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3N0cn19YDtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5KGxheWVyKSB7XG4gICAgbGV0IGtleSA9ICcnO1xuICAgIGZvciAoY29uc3QgayBvZiByZWZQcm9wZXJ0aWVzKSB7XG4gICAgICAgIGtleSArPSBgLyR7c3RyaW5naWZ5KGxheWVyW2tdKX1gO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdyb3VwQnlMYXlvdXQ7XG5cbi8qKlxuICogR2l2ZW4gYW4gYXJyYXkgb2YgbGF5ZXJzLCByZXR1cm4gYW4gYXJyYXkgb2YgYXJyYXlzIG9mIGxheWVycyB3aGVyZSBhbGxcbiAqIGxheWVycyBpbiBlYWNoIGdyb3VwIGhhdmUgaWRlbnRpY2FsIGxheW91dC1hZmZlY3RpbmcgcHJvcGVydGllcy4gVGhlc2VcbiAqIGFyZSB0aGUgcHJvcGVydGllcyB0aGF0IHdlcmUgZm9ybWVybHkgdXNlZCBieSBleHBsaWNpdCBgcmVmYCBtZWNoYW5pc21cbiAqIGZvciBsYXllcnM6ICd0eXBlJywgJ3NvdXJjZScsICdzb3VyY2UtbGF5ZXInLCAnbWluem9vbScsICdtYXh6b29tJyxcbiAqICdmaWx0ZXInLCBhbmQgJ2xheW91dCcuXG4gKlxuICogVGhlIGlucHV0IGlzIG5vdCBtb2RpZmllZC4gVGhlIG91dHB1dCBsYXllcnMgYXJlIHJlZmVyZW5jZXMgdG8gdGhlXG4gKiBpbnB1dCBsYXllcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXk8TGF5ZXI+fSBsYXllcnNcbiAqIEByZXR1cm5zIHtBcnJheTxBcnJheTxMYXllcj4+fVxuICovXG5mdW5jdGlvbiBncm91cEJ5TGF5b3V0KGxheWVycykge1xuICAgIGNvbnN0IGdyb3VwcyA9IHt9O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgayA9IGdldEtleShsYXllcnNbaV0pO1xuICAgICAgICBsZXQgZ3JvdXAgPSBncm91cHNba107XG4gICAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgICAgIGdyb3VwID0gZ3JvdXBzW2tdID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXAucHVzaChsYXllcnNbaV0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBrIGluIGdyb3Vwcykge1xuICAgICAgICByZXN1bHQucHVzaChncm91cHNba10pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCJcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi92OC5qc29uJyk7XG4iLCJtb2R1bGUuZXhwb3J0cz17XCIkdmVyc2lvblwiOjgsXCIkcm9vdFwiOntcInZlcnNpb25cIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjpbOF19LFwibmFtZVwiOntcInR5cGVcIjpcInN0cmluZ1wifSxcIm1ldGFkYXRhXCI6e1widHlwZVwiOlwiKlwifSxcImNlbnRlclwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCJ9LFwiem9vbVwiOntcInR5cGVcIjpcIm51bWJlclwifSxcImJlYXJpbmdcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwicGVyaW9kXCI6MzYwLFwidW5pdHNcIjpcImRlZ3JlZXNcIn0sXCJwaXRjaFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJ1bml0c1wiOlwiZGVncmVlc1wifSxcImxpZ2h0XCI6e1widHlwZVwiOlwibGlnaHRcIn0sXCJzb3VyY2VzXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwic291cmNlc1wifSxcInNwcml0ZVwiOntcInR5cGVcIjpcInN0cmluZ1wifSxcImdseXBoc1wiOntcInR5cGVcIjpcInN0cmluZ1wifSxcInRyYW5zaXRpb25cIjp7XCJ0eXBlXCI6XCJ0cmFuc2l0aW9uXCJ9LFwibGF5ZXJzXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJsYXllclwifX0sXCJzb3VyY2VzXCI6e1wiKlwiOntcInR5cGVcIjpcInNvdXJjZVwifX0sXCJzb3VyY2VcIjpbXCJzb3VyY2VfdmVjdG9yXCIsXCJzb3VyY2VfcmFzdGVyXCIsXCJzb3VyY2VfcmFzdGVyX2RlbVwiLFwic291cmNlX2dlb2pzb25cIixcInNvdXJjZV92aWRlb1wiLFwic291cmNlX2ltYWdlXCIsXCJzb3VyY2VfY2FudmFzXCJdLFwic291cmNlX3ZlY3RvclwiOntcInR5cGVcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCJ2ZWN0b3JcIjp7fX19LFwidXJsXCI6e1widHlwZVwiOlwic3RyaW5nXCJ9LFwidGlsZXNcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcInN0cmluZ1wifSxcImJvdW5kc1wiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjo0LFwiZGVmYXVsdFwiOlstMTgwLC04NS4wNTExLDE4MCw4NS4wNTExXX0sXCJtaW56b29tXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MH0sXCJtYXh6b29tXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MjJ9LFwiYXR0cmlidXRpb25cIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIn0sXCIqXCI6e1widHlwZVwiOlwiKlwifX0sXCJzb3VyY2VfcmFzdGVyXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcInJhc3RlclwiOnt9fX0sXCJ1cmxcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIn0sXCJ0aWxlc1wiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwic3RyaW5nXCJ9LFwiYm91bmRzXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImxlbmd0aFwiOjQsXCJkZWZhdWx0XCI6Wy0xODAsLTg1LjA1MTEsMTgwLDg1LjA1MTFdfSxcIm1pbnpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowfSxcIm1heHpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoyMn0sXCJ0aWxlU2l6ZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjUxMixcInVuaXRzXCI6XCJwaXhlbHNcIn0sXCJzY2hlbWVcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCJ4eXpcIjp7fSxcInRtc1wiOnt9fSxcImRlZmF1bHRcIjpcInh5elwifSxcImF0dHJpYnV0aW9uXCI6e1widHlwZVwiOlwic3RyaW5nXCJ9LFwiKlwiOntcInR5cGVcIjpcIipcIn19LFwic291cmNlX3Jhc3Rlcl9kZW1cIjp7XCJ0eXBlXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6e1wicmFzdGVyLWRlbVwiOnt9fX0sXCJ1cmxcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIn0sXCJ0aWxlc1wiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwic3RyaW5nXCJ9LFwiYm91bmRzXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImxlbmd0aFwiOjQsXCJkZWZhdWx0XCI6Wy0xODAsLTg1LjA1MTEsMTgwLDg1LjA1MTFdfSxcIm1pbnpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowfSxcIm1heHpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoyMn0sXCJ0aWxlU2l6ZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjUxMixcInVuaXRzXCI6XCJwaXhlbHNcIn0sXCJhdHRyaWJ1dGlvblwiOntcInR5cGVcIjpcInN0cmluZ1wifSxcIipcIjp7XCJ0eXBlXCI6XCIqXCJ9fSxcInNvdXJjZV9nZW9qc29uXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcImdlb2pzb25cIjp7fX19LFwiZGF0YVwiOntcInR5cGVcIjpcIipcIn0sXCJtYXh6b29tXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MTh9LFwiYnVmZmVyXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MTI4LFwibWF4aW11bVwiOjUxMixcIm1pbmltdW1cIjowfSxcInRvbGVyYW5jZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAuMzc1fSxcImNsdXN0ZXJcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJkZWZhdWx0XCI6ZmFsc2V9LFwiY2x1c3RlclJhZGl1c1wiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjUwLFwibWluaW11bVwiOjB9LFwiY2x1c3Rlck1heFpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIn19LFwic291cmNlX3ZpZGVvXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcInZpZGVvXCI6e319fSxcInVybHNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcInN0cmluZ1wifSxcImNvb3JkaW5hdGVzXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjQsXCJ2YWx1ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJsZW5ndGhcIjoyLFwidmFsdWVcIjpcIm51bWJlclwifX19LFwic291cmNlX2ltYWdlXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcImltYWdlXCI6e319fSxcInVybFwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcInN0cmluZ1wifSxcImNvb3JkaW5hdGVzXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjQsXCJ2YWx1ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJsZW5ndGhcIjoyLFwidmFsdWVcIjpcIm51bWJlclwifX19LFwic291cmNlX2NhbnZhc1wiOntcInR5cGVcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCJjYW52YXNcIjp7fX19LFwiY29vcmRpbmF0ZXNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJhcnJheVwiLFwibGVuZ3RoXCI6NCxcInZhbHVlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjIsXCJ2YWx1ZVwiOlwibnVtYmVyXCJ9fSxcImFuaW1hdGVcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJkZWZhdWx0XCI6XCJ0cnVlXCJ9LFwiY2FudmFzXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJyZXF1aXJlZFwiOnRydWV9fSxcImxheWVyXCI6e1wiaWRcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcInJlcXVpcmVkXCI6dHJ1ZX0sXCJ0eXBlXCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6e1wiZmlsbFwiOnt9LFwibGluZVwiOnt9LFwic3ltYm9sXCI6e30sXCJjaXJjbGVcIjp7fSxcImhlYXRtYXBcIjp7fSxcImZpbGwtZXh0cnVzaW9uXCI6e30sXCJyYXN0ZXJcIjp7fSxcImhpbGxzaGFkZVwiOnt9LFwiYmFja2dyb3VuZFwiOnt9fSxcInJlcXVpcmVkXCI6dHJ1ZX0sXCJtZXRhZGF0YVwiOntcInR5cGVcIjpcIipcIn0sXCJzb3VyY2VcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIn0sXCJzb3VyY2UtbGF5ZXJcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIn0sXCJtaW56b29tXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoyNH0sXCJtYXh6b29tXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoyNH0sXCJmaWx0ZXJcIjp7XCJ0eXBlXCI6XCJmaWx0ZXJcIn0sXCJsYXlvdXRcIjp7XCJ0eXBlXCI6XCJsYXlvdXRcIn0sXCJwYWludFwiOntcInR5cGVcIjpcInBhaW50XCJ9fSxcImxheW91dFwiOltcImxheW91dF9maWxsXCIsXCJsYXlvdXRfbGluZVwiLFwibGF5b3V0X2NpcmNsZVwiLFwibGF5b3V0X2hlYXRtYXBcIixcImxheW91dF9maWxsLWV4dHJ1c2lvblwiLFwibGF5b3V0X3N5bWJvbFwiLFwibGF5b3V0X3Jhc3RlclwiLFwibGF5b3V0X2hpbGxzaGFkZVwiLFwibGF5b3V0X2JhY2tncm91bmRcIl0sXCJsYXlvdXRfYmFja2dyb3VuZFwiOntcInZpc2liaWxpdHlcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCJ2aXNpYmxlXCI6e30sXCJub25lXCI6e319LFwiZGVmYXVsdFwiOlwidmlzaWJsZVwifX0sXCJsYXlvdXRfZmlsbFwiOntcInZpc2liaWxpdHlcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCJ2aXNpYmxlXCI6e30sXCJub25lXCI6e319LFwiZGVmYXVsdFwiOlwidmlzaWJsZVwifX0sXCJsYXlvdXRfY2lyY2xlXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcInZpc2libGVcIjp7fSxcIm5vbmVcIjp7fX0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCJ9fSxcImxheW91dF9oZWF0bWFwXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcInZpc2libGVcIjp7fSxcIm5vbmVcIjp7fX0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCJ9fSxcImxheW91dF9maWxsLWV4dHJ1c2lvblwiOntcInZpc2liaWxpdHlcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCJ2aXNpYmxlXCI6e30sXCJub25lXCI6e319LFwiZGVmYXVsdFwiOlwidmlzaWJsZVwifX0sXCJsYXlvdXRfbGluZVwiOntcImxpbmUtY2FwXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ2YWx1ZXNcIjp7XCJidXR0XCI6e30sXCJyb3VuZFwiOnt9LFwic3F1YXJlXCI6e319LFwiZGVmYXVsdFwiOlwiYnV0dFwifSxcImxpbmUtam9pblwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wiYmV2ZWxcIjp7fSxcInJvdW5kXCI6e30sXCJtaXRlclwiOnt9fSxcImRlZmF1bHRcIjpcIm1pdGVyXCJ9LFwibGluZS1taXRlci1saW1pdFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W3tcImxpbmUtam9pblwiOlwibWl0ZXJcIn1dfSxcImxpbmUtcm91bmQtbGltaXRcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLjA1LFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOlt7XCJsaW5lLWpvaW5cIjpcInJvdW5kXCJ9XX0sXCJ2aXNpYmlsaXR5XCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6e1widmlzaWJsZVwiOnt9LFwibm9uZVwiOnt9fSxcImRlZmF1bHRcIjpcInZpc2libGVcIn19LFwibGF5b3V0X3N5bWJvbFwiOntcInN5bWJvbC1wbGFjZW1lbnRcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInZhbHVlc1wiOntcInBvaW50XCI6e30sXCJsaW5lXCI6e319LFwiZGVmYXVsdFwiOlwicG9pbnRcIn0sXCJzeW1ib2wtc3BhY2luZ1wiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjI1MCxcIm1pbmltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJyZXF1aXJlc1wiOlt7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJzeW1ib2wtYXZvaWQtZWRnZXNcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcImRlZmF1bHRcIjpmYWxzZX0sXCJpY29uLWFsbG93LW92ZXJsYXBcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcImRlZmF1bHRcIjpmYWxzZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcImRlZmF1bHRcIjpmYWxzZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLW9wdGlvbmFsXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJkZWZhdWx0XCI6ZmFsc2UsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIixcInRleHQtZmllbGRcIl19LFwiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInZhbHVlc1wiOntcIm1hcFwiOnt9LFwidmlld3BvcnRcIjp7fSxcImF1dG9cIjp7fX0sXCJkZWZhdWx0XCI6XCJhdXRvXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1zaXplXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ1bml0c1wiOlwiZmFjdG9yIG9mIHRoZSBvcmlnaW5hbCBpY29uIHNpemVcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLXRleHQtZml0XCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ2YWx1ZXNcIjp7XCJub25lXCI6e30sXCJ3aWR0aFwiOnt9LFwiaGVpZ2h0XCI6e30sXCJib3RoXCI6e319LFwiZGVmYXVsdFwiOlwibm9uZVwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCIsXCJ0ZXh0LWZpZWxkXCJdfSxcImljb24tdGV4dC1maXQtcGFkZGluZ1wiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjo0LFwiZGVmYXVsdFwiOlswLDAsMCwwXSxcInVuaXRzXCI6XCJwaXhlbHNcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCIsXCJ0ZXh0LWZpZWxkXCIse1wiaWNvbi10ZXh0LWZpdFwiOltcImJvdGhcIixcIndpZHRoXCIsXCJoZWlnaHRcIl19XX0sXCJpY29uLWltYWdlXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRva2Vuc1wiOnRydWV9LFwiaWNvbi1yb3RhdGVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwicGVyaW9kXCI6MzYwLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ1bml0c1wiOlwiZGVncmVlc1wiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24tcGFkZGluZ1wiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24ta2VlcC11cHJpZ2h0XCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJkZWZhdWx0XCI6ZmFsc2UsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIix7XCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiOlwibWFwXCJ9LHtcInN5bWJvbC1wbGFjZW1lbnRcIjpcImxpbmVcIn1dfSxcImljb24tb2Zmc2V0XCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wiY2VudGVyXCI6e30sXCJsZWZ0XCI6e30sXCJyaWdodFwiOnt9LFwidG9wXCI6e30sXCJib3R0b21cIjp7fSxcInRvcC1sZWZ0XCI6e30sXCJ0b3AtcmlnaHRcIjp7fSxcImJvdHRvbS1sZWZ0XCI6e30sXCJib3R0b20tcmlnaHRcIjp7fX0sXCJkZWZhdWx0XCI6XCJjZW50ZXJcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLXBpdGNoLWFsaWdubWVudFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wibWFwXCI6e30sXCJ2aWV3cG9ydFwiOnt9LFwiYXV0b1wiOnt9fSxcImRlZmF1bHRcIjpcImF1dG9cIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJ0ZXh0LXBpdGNoLWFsaWdubWVudFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wibWFwXCI6e30sXCJ2aWV3cG9ydFwiOnt9LFwiYXV0b1wiOnt9fSxcImRlZmF1bHRcIjpcImF1dG9cIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wibWFwXCI6e30sXCJ2aWV3cG9ydFwiOnt9LFwiYXV0b1wiOnt9fSxcImRlZmF1bHRcIjpcImF1dG9cIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWZpZWxkXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcImRlZmF1bHRcIjpcIlwiLFwidG9rZW5zXCI6dHJ1ZX0sXCJ0ZXh0LWZvbnRcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcInN0cmluZ1wiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJkZWZhdWx0XCI6W1wiT3BlbiBTYW5zIFJlZ3VsYXJcIixcIkFyaWFsIFVuaWNvZGUgTVMgUmVndWxhclwiXSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LXNpemVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxNixcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1tYXgtd2lkdGhcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxMCxcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcImVtc1wiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1saW5lLWhlaWdodFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEuMixcInVuaXRzXCI6XCJlbXNcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtbGV0dGVyLXNwYWNpbmdcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwidW5pdHNcIjpcImVtc1wiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1qdXN0aWZ5XCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ2YWx1ZXNcIjp7XCJsZWZ0XCI6e30sXCJjZW50ZXJcIjp7fSxcInJpZ2h0XCI6e319LFwiZGVmYXVsdFwiOlwiY2VudGVyXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1hbmNob3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInZhbHVlc1wiOntcImNlbnRlclwiOnt9LFwibGVmdFwiOnt9LFwicmlnaHRcIjp7fSxcInRvcFwiOnt9LFwiYm90dG9tXCI6e30sXCJ0b3AtbGVmdFwiOnt9LFwidG9wLXJpZ2h0XCI6e30sXCJib3R0b20tbGVmdFwiOnt9LFwiYm90dG9tLXJpZ2h0XCI6e319LFwiZGVmYXVsdFwiOlwiY2VudGVyXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1tYXgtYW5nbGVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjo0NSxcInVuaXRzXCI6XCJkZWdyZWVzXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiLHtcInN5bWJvbC1wbGFjZW1lbnRcIjpcImxpbmVcIn1dfSxcInRleHQtcm90YXRlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInBlcmlvZFwiOjM2MCxcInVuaXRzXCI6XCJkZWdyZWVzXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LXBhZGRpbmdcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoyLFwibWluaW11bVwiOjAsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWtlZXAtdXByaWdodFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwiZGVmYXVsdFwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIix7XCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiOlwibWFwXCJ9LHtcInN5bWJvbC1wbGFjZW1lbnRcIjpcImxpbmVcIn1dfSxcInRleHQtdHJhbnNmb3JtXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ2YWx1ZXNcIjp7XCJub25lXCI6e30sXCJ1cHBlcmNhc2VcIjp7fSxcImxvd2VyY2FzZVwiOnt9fSxcImRlZmF1bHRcIjpcIm5vbmVcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LW9mZnNldFwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJ1bml0c1wiOlwiZW1zXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1hbGxvdy1vdmVybGFwXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJkZWZhdWx0XCI6ZmFsc2UsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1pZ25vcmUtcGxhY2VtZW50XCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJkZWZhdWx0XCI6ZmFsc2UsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1vcHRpb25hbFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwiZGVmYXVsdFwiOmZhbHNlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCIsXCJpY29uLWltYWdlXCJdfSxcInZpc2liaWxpdHlcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCJ2aXNpYmxlXCI6e30sXCJub25lXCI6e319LFwiZGVmYXVsdFwiOlwidmlzaWJsZVwifX0sXCJsYXlvdXRfcmFzdGVyXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcInZpc2libGVcIjp7fSxcIm5vbmVcIjp7fX0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCJ9fSxcImxheW91dF9oaWxsc2hhZGVcIjp7XCJ2aXNpYmlsaXR5XCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6e1widmlzaWJsZVwiOnt9LFwibm9uZVwiOnt9fSxcImRlZmF1bHRcIjpcInZpc2libGVcIn19LFwiZmlsdGVyXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCIqXCJ9LFwiZmlsdGVyX29wZXJhdG9yXCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6e1wiPT1cIjp7fSxcIiE9XCI6e30sXCI+XCI6e30sXCI+PVwiOnt9LFwiPFwiOnt9LFwiPD1cIjp7fSxcImluXCI6e30sXCIhaW5cIjp7fSxcImFsbFwiOnt9LFwiYW55XCI6e30sXCJub25lXCI6e30sXCJoYXNcIjp7fSxcIiFoYXNcIjp7fX19LFwiZ2VvbWV0cnlfdHlwZVwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcIlBvaW50XCI6e30sXCJMaW5lU3RyaW5nXCI6e30sXCJQb2x5Z29uXCI6e319fSxcImZ1bmN0aW9uXCI6e1wiZXhwcmVzc2lvblwiOntcInR5cGVcIjpcImV4cHJlc3Npb25cIn0sXCJzdG9wc1wiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwiZnVuY3Rpb25fc3RvcFwifSxcImJhc2VcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLFwibWluaW11bVwiOjB9LFwicHJvcGVydHlcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImRlZmF1bHRcIjpcIiR6b29tXCJ9LFwidHlwZVwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcImlkZW50aXR5XCI6e30sXCJleHBvbmVudGlhbFwiOnt9LFwiaW50ZXJ2YWxcIjp7fSxcImNhdGVnb3JpY2FsXCI6e319LFwiZGVmYXVsdFwiOlwiZXhwb25lbnRpYWxcIn0sXCJjb2xvclNwYWNlXCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6e1wicmdiXCI6e30sXCJsYWJcIjp7fSxcImhjbFwiOnt9fSxcImRlZmF1bHRcIjpcInJnYlwifSxcImRlZmF1bHRcIjp7XCJ0eXBlXCI6XCIqXCIsXCJyZXF1aXJlZFwiOmZhbHNlfX0sXCJmdW5jdGlvbl9zdG9wXCI6e1widHlwZVwiOlwiYXJyYXlcIixcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjIyLFwidmFsdWVcIjpbXCJudW1iZXJcIixcImNvbG9yXCJdLFwibGVuZ3RoXCI6Mn0sXCJleHByZXNzaW9uXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCIqXCIsXCJtaW5pbXVtXCI6MX0sXCJleHByZXNzaW9uX25hbWVcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCJsZXRcIjp7XCJncm91cFwiOlwiVmFyaWFibGUgYmluZGluZ1wifSxcInZhclwiOntcImdyb3VwXCI6XCJWYXJpYWJsZSBiaW5kaW5nXCJ9LFwibGl0ZXJhbFwiOntcImdyb3VwXCI6XCJUeXBlc1wifSxcImFycmF5XCI6e1wiZ3JvdXBcIjpcIlR5cGVzXCJ9LFwiYXRcIjp7XCJncm91cFwiOlwiTG9va3VwXCJ9LFwiY2FzZVwiOntcImdyb3VwXCI6XCJEZWNpc2lvblwifSxcIm1hdGNoXCI6e1wiZ3JvdXBcIjpcIkRlY2lzaW9uXCJ9LFwiY29hbGVzY2VcIjp7XCJncm91cFwiOlwiRGVjaXNpb25cIn0sXCJzdGVwXCI6e1wiZ3JvdXBcIjpcIlJhbXBzLCBzY2FsZXMsIGN1cnZlc1wifSxcImludGVycG9sYXRlXCI6e1wiZ3JvdXBcIjpcIlJhbXBzLCBzY2FsZXMsIGN1cnZlc1wifSxcImxuMlwiOntcImdyb3VwXCI6XCJNYXRoXCJ9LFwicGlcIjp7XCJncm91cFwiOlwiTWF0aFwifSxcImVcIjp7XCJncm91cFwiOlwiTWF0aFwifSxcInR5cGVvZlwiOntcImdyb3VwXCI6XCJUeXBlc1wifSxcInN0cmluZ1wiOntcImdyb3VwXCI6XCJUeXBlc1wifSxcIm51bWJlclwiOntcImdyb3VwXCI6XCJUeXBlc1wifSxcImJvb2xlYW5cIjp7XCJncm91cFwiOlwiVHlwZXNcIn0sXCJvYmplY3RcIjp7XCJncm91cFwiOlwiVHlwZXNcIn0sXCJ0by1zdHJpbmdcIjp7XCJncm91cFwiOlwiVHlwZXNcIn0sXCJ0by1udW1iZXJcIjp7XCJncm91cFwiOlwiVHlwZXNcIn0sXCJ0by1ib29sZWFuXCI6e1wiZ3JvdXBcIjpcIlR5cGVzXCJ9LFwidG8tcmdiYVwiOntcImdyb3VwXCI6XCJDb2xvclwifSxcInRvLWNvbG9yXCI6e1wiZ3JvdXBcIjpcIlR5cGVzXCJ9LFwicmdiXCI6e1wiZ3JvdXBcIjpcIkNvbG9yXCJ9LFwicmdiYVwiOntcImdyb3VwXCI6XCJDb2xvclwifSxcImdldFwiOntcImdyb3VwXCI6XCJMb29rdXBcIn0sXCJoYXNcIjp7XCJncm91cFwiOlwiTG9va3VwXCJ9LFwibGVuZ3RoXCI6e1wiZ3JvdXBcIjpcIkxvb2t1cFwifSxcInByb3BlcnRpZXNcIjp7XCJncm91cFwiOlwiRmVhdHVyZSBkYXRhXCJ9LFwiZ2VvbWV0cnktdHlwZVwiOntcImdyb3VwXCI6XCJGZWF0dXJlIGRhdGFcIn0sXCJpZFwiOntcImdyb3VwXCI6XCJGZWF0dXJlIGRhdGFcIn0sXCJ6b29tXCI6e1wiZ3JvdXBcIjpcIlpvb21cIn0sXCJoZWF0bWFwLWRlbnNpdHlcIjp7XCJncm91cFwiOlwiSGVhdG1hcFwifSxcIitcIjp7XCJncm91cFwiOlwiTWF0aFwifSxcIipcIjp7XCJncm91cFwiOlwiTWF0aFwifSxcIi1cIjp7XCJncm91cFwiOlwiTWF0aFwifSxcIi9cIjp7XCJncm91cFwiOlwiTWF0aFwifSxcIiVcIjp7XCJncm91cFwiOlwiTWF0aFwifSxcIl5cIjp7XCJncm91cFwiOlwiTWF0aFwifSxcInNxcnRcIjp7XCJncm91cFwiOlwiTWF0aFwifSxcImxvZzEwXCI6e1wiZ3JvdXBcIjpcIk1hdGhcIn0sXCJsblwiOntcImdyb3VwXCI6XCJNYXRoXCJ9LFwibG9nMlwiOntcImdyb3VwXCI6XCJNYXRoXCJ9LFwic2luXCI6e1wiZ3JvdXBcIjpcIk1hdGhcIn0sXCJjb3NcIjp7XCJncm91cFwiOlwiTWF0aFwifSxcInRhblwiOntcImdyb3VwXCI6XCJNYXRoXCJ9LFwiYXNpblwiOntcImdyb3VwXCI6XCJNYXRoXCJ9LFwiYWNvc1wiOntcImdyb3VwXCI6XCJNYXRoXCJ9LFwiYXRhblwiOntcImdyb3VwXCI6XCJNYXRoXCJ9LFwibWluXCI6e1wiZ3JvdXBcIjpcIk1hdGhcIn0sXCJtYXhcIjp7XCJncm91cFwiOlwiTWF0aFwifSxcIj09XCI6e1wiZ3JvdXBcIjpcIkRlY2lzaW9uXCJ9LFwiIT1cIjp7XCJncm91cFwiOlwiRGVjaXNpb25cIn0sXCI+XCI6e1wiZ3JvdXBcIjpcIkRlY2lzaW9uXCJ9LFwiPFwiOntcImdyb3VwXCI6XCJEZWNpc2lvblwifSxcIj49XCI6e1wiZ3JvdXBcIjpcIkRlY2lzaW9uXCJ9LFwiPD1cIjp7XCJncm91cFwiOlwiRGVjaXNpb25cIn0sXCJhbGxcIjp7XCJncm91cFwiOlwiRGVjaXNpb25cIn0sXCJhbnlcIjp7XCJncm91cFwiOlwiRGVjaXNpb25cIn0sXCIhXCI6e1wiZ3JvdXBcIjpcIkRlY2lzaW9uXCJ9LFwidXBjYXNlXCI6e1wiZ3JvdXBcIjpcIlN0cmluZ1wifSxcImRvd25jYXNlXCI6e1wiZ3JvdXBcIjpcIlN0cmluZ1wifSxcImNvbmNhdFwiOntcImdyb3VwXCI6XCJTdHJpbmdcIn19fSxcImxpZ2h0XCI6e1wiYW5jaG9yXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZGVmYXVsdFwiOlwidmlld3BvcnRcIixcInZhbHVlc1wiOntcIm1hcFwiOnt9LFwidmlld3BvcnRcIjp7fX0sXCJ0cmFuc2l0aW9uXCI6ZmFsc2UsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6ZmFsc2UsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCJ9LFwicG9zaXRpb25cIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwiZGVmYXVsdFwiOlsxLjE1LDIxMCwzMF0sXCJsZW5ndGhcIjozLFwidmFsdWVcIjpcIm51bWJlclwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6ZmFsc2V9LFwiY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwiI2ZmZmZmZlwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOmZhbHNlLFwidHJhbnNpdGlvblwiOnRydWV9LFwiaW50ZW5zaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MC41LFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjpmYWxzZSxcInRyYW5zaXRpb25cIjp0cnVlfX0sXCJwYWludFwiOltcInBhaW50X2ZpbGxcIixcInBhaW50X2xpbmVcIixcInBhaW50X2NpcmNsZVwiLFwicGFpbnRfaGVhdG1hcFwiLFwicGFpbnRfZmlsbC1leHRydXNpb25cIixcInBhaW50X3N5bWJvbFwiLFwicGFpbnRfcmFzdGVyXCIsXCJwYWludF9oaWxsc2hhZGVcIixcInBhaW50X2JhY2tncm91bmRcIl0sXCJwYWludF9maWxsXCI6e1wiZmlsbC1hbnRpYWxpYXNcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcImRlZmF1bHRcIjp0cnVlfSxcImZpbGwtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJmaWxsLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOlt7XCIhXCI6XCJmaWxsLXBhdHRlcm5cIn1dfSxcImZpbGwtb3V0bGluZS1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbe1wiIVwiOlwiZmlsbC1wYXR0ZXJuXCJ9LHtcImZpbGwtYW50aWFsaWFzXCI6dHJ1ZX1dfSxcImZpbGwtdHJhbnNsYXRlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wibWFwXCI6e30sXCJ2aWV3cG9ydFwiOnt9fSxcImRlZmF1bHRcIjpcIm1hcFwiLFwicmVxdWlyZXNcIjpbXCJmaWxsLXRyYW5zbGF0ZVwiXX0sXCJmaWxsLXBhdHRlcm5cIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWV9fSxcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCI6e1wiZmlsbC1leHRydXNpb24tb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOmZhbHNlLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwidHJhbnNpdGlvblwiOnRydWV9LFwiZmlsbC1leHRydXNpb24tY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwiIzAwMDAwMFwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W3tcIiFcIjpcImZpbGwtZXh0cnVzaW9uLXBhdHRlcm5cIn1dfSxcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIn0sXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUtYW5jaG9yXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ2YWx1ZXNcIjp7XCJtYXBcIjp7fSxcInZpZXdwb3J0XCI6e319LFwiZGVmYXVsdFwiOlwibWFwXCIsXCJyZXF1aXJlc1wiOltcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZVwiXX0sXCJmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlfSxcImZpbGwtZXh0cnVzaW9uLWhlaWdodFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcIm1ldGVyc1wiLFwidHJhbnNpdGlvblwiOnRydWV9LFwiZmlsbC1leHRydXNpb24tYmFzZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcIm1ldGVyc1wiLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcImZpbGwtZXh0cnVzaW9uLWhlaWdodFwiXX19LFwicGFpbnRfbGluZVwiOntcImxpbmUtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJsaW5lLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOlt7XCIhXCI6XCJsaW5lLXBhdHRlcm5cIn1dfSxcImxpbmUtdHJhbnNsYXRlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wibWFwXCI6e30sXCJ2aWV3cG9ydFwiOnt9fSxcImRlZmF1bHRcIjpcIm1hcFwiLFwicmVxdWlyZXNcIjpbXCJsaW5lLXRyYW5zbGF0ZVwiXX0sXCJsaW5lLXdpZHRoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIn0sXCJsaW5lLWdhcC13aWR0aFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwibGluZS1vZmZzZXRcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIn0sXCJsaW5lLWJsdXJcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImxpbmUtZGFzaGFycmF5XCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwibWluaW11bVwiOjAsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJsaW5lIHdpZHRoc1wiLFwicmVxdWlyZXNcIjpbe1wiIVwiOlwibGluZS1wYXR0ZXJuXCJ9XX0sXCJsaW5lLXBhdHRlcm5cIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWV9fSxcInBhaW50X2NpcmNsZVwiOntcImNpcmNsZS1yYWRpdXNcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjo1LFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImNpcmNsZS1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlfSxcImNpcmNsZS1ibHVyXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWV9LFwiY2lyY2xlLW9wYWNpdHlcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWV9LFwiY2lyY2xlLXRyYW5zbGF0ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIn0sXCJjaXJjbGUtdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wibWFwXCI6e30sXCJ2aWV3cG9ydFwiOnt9fSxcImRlZmF1bHRcIjpcIm1hcFwiLFwicmVxdWlyZXNcIjpbXCJjaXJjbGUtdHJhbnNsYXRlXCJdfSxcImNpcmNsZS1waXRjaC1zY2FsZVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wibWFwXCI6e30sXCJ2aWV3cG9ydFwiOnt9fSxcImRlZmF1bHRcIjpcIm1hcFwifSxcImNpcmNsZS1waXRjaC1hbGlnbm1lbnRcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInZhbHVlc1wiOntcIm1hcFwiOnt9LFwidmlld3BvcnRcIjp7fX0sXCJkZWZhdWx0XCI6XCJ2aWV3cG9ydFwifSxcImNpcmNsZS1zdHJva2Utd2lkdGhcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImNpcmNsZS1zdHJva2UtY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwiIzAwMDAwMFwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJjaXJjbGUtc3Ryb2tlLW9wYWNpdHlcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWV9fSxcInBhaW50X2hlYXRtYXBcIjp7XCJoZWF0bWFwLXJhZGl1c1wiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMwLFwibWluaW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImhlYXRtYXAtd2VpZ2h0XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6ZmFsc2V9LFwiaGVhdG1hcC1pbnRlbnNpdHlcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6ZmFsc2UsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJoZWF0bWFwLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpbXCJpbnRlcnBvbGF0ZVwiLFtcImxpbmVhclwiXSxbXCJoZWF0bWFwLWRlbnNpdHlcIl0sMCxcInJnYmEoMCwgMCwgMjU1LCAwKVwiLDAuMSxcInJveWFsYmx1ZVwiLDAuMyxcImN5YW5cIiwwLjUsXCJsaW1lXCIsMC43LFwieWVsbG93XCIsMSxcInJlZFwiXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjpmYWxzZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6ZmFsc2UsXCJ0cmFuc2l0aW9uXCI6ZmFsc2V9LFwiaGVhdG1hcC1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6ZmFsc2UsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX19LFwicGFpbnRfc3ltYm9sXCI6e1wiaWNvbi1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24tY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwiIzAwMDAwMFwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWhhbG8tY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwicmdiYSgwLCAwLCAwLCAwKVwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWhhbG8td2lkdGhcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24taGFsby1ibHVyXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLXRyYW5zbGF0ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInZhbHVlc1wiOntcIm1hcFwiOnt9LFwidmlld3BvcnRcIjp7fX0sXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiLFwiaWNvbi10cmFuc2xhdGVcIl19LFwidGV4dC1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwiIzAwMDAwMFwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWhhbG8tY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwicmdiYSgwLCAwLCAwLCAwKVwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWhhbG8td2lkdGhcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtaGFsby1ibHVyXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LXRyYW5zbGF0ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LXRyYW5zbGF0ZS1hbmNob3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInZhbHVlc1wiOntcIm1hcFwiOnt9LFwidmlld3BvcnRcIjp7fX0sXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiLFwidGV4dC10cmFuc2xhdGVcIl19fSxcInBhaW50X3Jhc3RlclwiOntcInJhc3Rlci1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlfSxcInJhc3Rlci1odWUtcm90YXRlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInBlcmlvZFwiOjM2MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwiZGVncmVlc1wifSxcInJhc3Rlci1icmlnaHRuZXNzLW1pblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXhcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwidHJhbnNpdGlvblwiOnRydWV9LFwicmFzdGVyLXNhdHVyYXRpb25cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOi0xLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlfSxcInJhc3Rlci1jb250cmFzdFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6LTEsXCJtYXhpbXVtXCI6MSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWV9LFwicmFzdGVyLWZhZGUtZHVyYXRpb25cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjozMDAsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOmZhbHNlLFwidW5pdHNcIjpcIm1pbGxpc2Vjb25kc1wifX0sXCJwYWludF9oaWxsc2hhZGVcIjp7XCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWRpcmVjdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMzNSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjM1OSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOmZhbHNlfSxcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tYW5jaG9yXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ2YWx1ZXNcIjp7XCJtYXBcIjp7fSxcInZpZXdwb3J0XCI6e319LFwiZGVmYXVsdFwiOlwidmlld3BvcnRcIn0sXCJoaWxsc2hhZGUtZXhhZ2dlcmF0aW9uXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MC41LFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWV9LFwiaGlsbHNoYWRlLXNoYWRvdy1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlfSxcImhpbGxzaGFkZS1oaWdobGlnaHQtY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwiI0ZGRkZGRlwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJoaWxsc2hhZGUtYWNjZW50LWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWV9fSxcInBhaW50X2JhY2tncm91bmRcIjp7XCJiYWNrZ3JvdW5kLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOlt7XCIhXCI6XCJiYWNrZ3JvdW5kLXBhdHRlcm5cIn1dfSxcImJhY2tncm91bmQtcGF0dGVyblwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJiYWNrZ3JvdW5kLW9wYWNpdHlcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWV9fSxcInRyYW5zaXRpb25cIjp7XCJkdXJhdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMwMCxcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcIm1pbGxpc2Vjb25kc1wifSxcImRlbGF5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcIm1pbGxpc2Vjb25kc1wifX19IiwiLy8gICAgICBcblxuY29uc3Qge3BhcnNlQ1NTQ29sb3J9ID0gcmVxdWlyZSgnY3NzY29sb3JwYXJzZXInKTtcblxuLyoqXG4gKiBBbiBSR0JBIGNvbG9yIHZhbHVlLiBDcmVhdGUgaW5zdGFuY2VzIGZyb20gY29sb3Igc3RyaW5ncyB1c2luZyB0aGUgc3RhdGljXG4gKiBtZXRob2QgYENvbG9yLnBhcnNlYC4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgUkdCIGNoYW5uZWwgdmFsdWVzIGluIHRoZSByYW5nZVxuICogYFswLCAxXWAsIHByZW11bHRpcGxpZWQgYnkgQS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gciBUaGUgcmVkIGNoYW5uZWwuXG4gKiBAcGFyYW0ge251bWJlcn0gZyBUaGUgZ3JlZW4gY2hhbm5lbC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiIFRoZSBibHVlIGNoYW5uZWwuXG4gKiBAcGFyYW0ge251bWJlcn0gYSBUaGUgYWxwaGEgY2hhbm5lbC5cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIENvbG9yIHtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihyICAgICAgICAsIGcgICAgICAgICwgYiAgICAgICAgLCBhICAgICAgICAgPSAxKSB7XG4gICAgICAgIHRoaXMuciA9IHI7XG4gICAgICAgIHRoaXMuZyA9IGc7XG4gICAgICAgIHRoaXMuYiA9IGI7XG4gICAgICAgIHRoaXMuYSA9IGE7XG4gICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgdmFsaWQgQ1NTIGNvbG9yIHN0cmluZ3MgYW5kIHJldHVybnMgYSBgQ29sb3JgIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm5zIEEgYENvbG9yYCBpbnN0YW5jZSwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIGlucHV0IGlzIG5vdCBhIHZhbGlkIGNvbG9yIHN0cmluZy5cbiAgICAgKi9cbiAgICBzdGF0aWMgcGFyc2UoaW5wdXQgICAgICAgICApICAgICAgICAgICAgICAge1xuICAgICAgICBpZiAoIWlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmdiYSA9IHBhcnNlQ1NTQ29sb3IoaW5wdXQpO1xuICAgICAgICBpZiAoIXJnYmEpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IENvbG9yKFxuICAgICAgICAgICAgcmdiYVswXSAvIDI1NSAqIHJnYmFbM10sXG4gICAgICAgICAgICByZ2JhWzFdIC8gMjU1ICogcmdiYVszXSxcbiAgICAgICAgICAgIHJnYmFbMl0gLyAyNTUgKiByZ2JhWzNdLFxuICAgICAgICAgICAgcmdiYVszXVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gUkdCQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb2xvciB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFuIFJHQkEgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIHB1cnBsZSA9IG5ldyBDb2xvci5wYXJzZSgncHVycGxlJyk7XG4gICAgICogcHVycGxlLnRvU3RyaW5nOyAvLyA9IFwicmdiYSgxMjgsMCwxMjgsMSlcIlxuICAgICAqIHZhciB0cmFuc2x1Y2VudEdyZWVuID0gbmV3IENvbG9yLnBhcnNlKCdyZ2JhKDI2LCAyMDcsIDI2LCAuNzMpJyk7XG4gICAgICogdHJhbnNsdWNlbnRHcmVlbi50b1N0cmluZygpOyAvLyA9IFwicmdiYSgyNiwyMDcsMjYsMC43MylcIlxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkgICAgICAgICB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybVJnYiA9ICh2YWx1ZSAgICAgICAgKSA9PiBNYXRoLnJvdW5kKHZhbHVlICogMjU1IC8gdGhpcy5hKTtcbiAgICAgICAgY29uc3QgcmdiID0gW3RoaXMuciwgdGhpcy5nLCB0aGlzLmJdLm1hcCh0cmFuc2Zvcm1SZ2IpO1xuICAgICAgICByZXR1cm4gYHJnYmEoJHtyZ2IuY29uY2F0KHRoaXMuYSkuam9pbignLCcpfSlgO1xuICAgIH1cbn1cblxuQ29sb3IuYmxhY2sgPSBuZXcgQ29sb3IoMCwgMCwgMCwgMSk7XG5Db2xvci53aGl0ZSA9IG5ldyBDb2xvcigxLCAxLCAxLCAxKTtcbkNvbG9yLnRyYW5zcGFyZW50ID0gbmV3IENvbG9yKDAsIDAsIDAsIDApO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbG9yO1xuIiwiLy8gICAgICBcblxuY29uc3QgQ29sb3IgPSByZXF1aXJlKCcuL2NvbG9yJyk7XG5jb25zdCBpbnRlcnBvbGF0ZU51bWJlciA9IHJlcXVpcmUoJy4vaW50ZXJwb2xhdGUnKS5udW1iZXI7XG5cbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuICBcblxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG4gIFxuXG4vLyBDb25zdGFudHNcbmNvbnN0IFhuID0gMC45NTA0NzAsIC8vIEQ2NSBzdGFuZGFyZCByZWZlcmVudFxuICAgIFluID0gMSxcbiAgICBabiA9IDEuMDg4ODMwLFxuICAgIHQwID0gNCAvIDI5LFxuICAgIHQxID0gNiAvIDI5LFxuICAgIHQyID0gMyAqIHQxICogdDEsXG4gICAgdDMgPSB0MSAqIHQxICogdDEsXG4gICAgZGVnMnJhZCA9IE1hdGguUEkgLyAxODAsXG4gICAgcmFkMmRlZyA9IDE4MCAvIE1hdGguUEk7XG5cbi8vIFV0aWxpdGllc1xuZnVuY3Rpb24geHl6MmxhYih0KSB7XG4gICAgcmV0dXJuIHQgPiB0MyA/IE1hdGgucG93KHQsIDEgLyAzKSA6IHQgLyB0MiArIHQwO1xufVxuXG5mdW5jdGlvbiBsYWIyeHl6KHQpIHtcbiAgICByZXR1cm4gdCA+IHQxID8gdCAqIHQgKiB0IDogdDIgKiAodCAtIHQwKTtcbn1cblxuZnVuY3Rpb24geHl6MnJnYih4KSB7XG4gICAgcmV0dXJuIDI1NSAqICh4IDw9IDAuMDAzMTMwOCA/IDEyLjkyICogeCA6IDEuMDU1ICogTWF0aC5wb3coeCwgMSAvIDIuNCkgLSAwLjA1NSk7XG59XG5cbmZ1bmN0aW9uIHJnYjJ4eXooeCkge1xuICAgIHggLz0gMjU1O1xuICAgIHJldHVybiB4IDw9IDAuMDQwNDUgPyB4IC8gMTIuOTIgOiBNYXRoLnBvdygoeCArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xufVxuXG4vLyBMQUJcbmZ1bmN0aW9uIHJnYlRvTGFiKHJnYkNvbG9yICAgICAgICkgICAgICAgICAgIHtcbiAgICBjb25zdCBiID0gcmdiMnh5eihyZ2JDb2xvci5yKSxcbiAgICAgICAgYSA9IHJnYjJ4eXoocmdiQ29sb3IuZyksXG4gICAgICAgIGwgPSByZ2IyeHl6KHJnYkNvbG9yLmIpLFxuICAgICAgICB4ID0geHl6MmxhYigoMC40MTI0NTY0ICogYiArIDAuMzU3NTc2MSAqIGEgKyAwLjE4MDQzNzUgKiBsKSAvIFhuKSxcbiAgICAgICAgeSA9IHh5ejJsYWIoKDAuMjEyNjcyOSAqIGIgKyAwLjcxNTE1MjIgKiBhICsgMC4wNzIxNzUwICogbCkgLyBZbiksXG4gICAgICAgIHogPSB4eXoybGFiKCgwLjAxOTMzMzkgKiBiICsgMC4xMTkxOTIwICogYSArIDAuOTUwMzA0MSAqIGwpIC8gWm4pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbDogMTE2ICogeSAtIDE2LFxuICAgICAgICBhOiA1MDAgKiAoeCAtIHkpLFxuICAgICAgICBiOiAyMDAgKiAoeSAtIHopLFxuICAgICAgICBhbHBoYTogcmdiQ29sb3IuYVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGxhYlRvUmdiKGxhYkNvbG9yICAgICAgICAgICkgICAgICAgIHtcbiAgICBsZXQgeSA9IChsYWJDb2xvci5sICsgMTYpIC8gMTE2LFxuICAgICAgICB4ID0gaXNOYU4obGFiQ29sb3IuYSkgPyB5IDogeSArIGxhYkNvbG9yLmEgLyA1MDAsXG4gICAgICAgIHogPSBpc05hTihsYWJDb2xvci5iKSA/IHkgOiB5IC0gbGFiQ29sb3IuYiAvIDIwMDtcbiAgICB5ID0gWW4gKiBsYWIyeHl6KHkpO1xuICAgIHggPSBYbiAqIGxhYjJ4eXooeCk7XG4gICAgeiA9IFpuICogbGFiMnh5eih6KTtcbiAgICByZXR1cm4gbmV3IENvbG9yKFxuICAgICAgICB4eXoycmdiKDMuMjQwNDU0MiAqIHggLSAxLjUzNzEzODUgKiB5IC0gMC40OTg1MzE0ICogeiksIC8vIEQ2NSAtPiBzUkdCXG4gICAgICAgIHh5ejJyZ2IoLTAuOTY5MjY2MCAqIHggKyAxLjg3NjAxMDggKiB5ICsgMC4wNDE1NTYwICogeiksXG4gICAgICAgIHh5ejJyZ2IoMC4wNTU2NDM0ICogeCAtIDAuMjA0MDI1OSAqIHkgKyAxLjA1NzIyNTIgKiB6KSxcbiAgICAgICAgbGFiQ29sb3IuYWxwaGFcbiAgICApO1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZUxhYihmcm9tICAgICAgICAgICwgdG8gICAgICAgICAgLCB0ICAgICAgICApIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBsOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmwsIHRvLmwsIHQpLFxuICAgICAgICBhOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmEsIHRvLmEsIHQpLFxuICAgICAgICBiOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmIsIHRvLmIsIHQpLFxuICAgICAgICBhbHBoYTogaW50ZXJwb2xhdGVOdW1iZXIoZnJvbS5hbHBoYSwgdG8uYWxwaGEsIHQpXG4gICAgfTtcbn1cblxuLy8gSENMXG5mdW5jdGlvbiByZ2JUb0hjbChyZ2JDb2xvciAgICAgICApICAgICAgICAgICB7XG4gICAgY29uc3Qge2wsIGEsIGJ9ID0gcmdiVG9MYWIocmdiQ29sb3IpO1xuICAgIGNvbnN0IGggPSBNYXRoLmF0YW4yKGIsIGEpICogcmFkMmRlZztcbiAgICByZXR1cm4ge1xuICAgICAgICBoOiBoIDwgMCA/IGggKyAzNjAgOiBoLFxuICAgICAgICBjOiBNYXRoLnNxcnQoYSAqIGEgKyBiICogYiksXG4gICAgICAgIGw6IGwsXG4gICAgICAgIGFscGhhOiByZ2JDb2xvci5hXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gaGNsVG9SZ2IoaGNsQ29sb3IgICAgICAgICAgKSAgICAgICAge1xuICAgIGNvbnN0IGggPSBoY2xDb2xvci5oICogZGVnMnJhZCxcbiAgICAgICAgYyA9IGhjbENvbG9yLmMsXG4gICAgICAgIGwgPSBoY2xDb2xvci5sO1xuICAgIHJldHVybiBsYWJUb1JnYih7XG4gICAgICAgIGw6IGwsXG4gICAgICAgIGE6IE1hdGguY29zKGgpICogYyxcbiAgICAgICAgYjogTWF0aC5zaW4oaCkgKiBjLFxuICAgICAgICBhbHBoYTogaGNsQ29sb3IuYWxwaGFcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVIdWUoYSAgICAgICAgLCBiICAgICAgICAsIHQgICAgICAgICkge1xuICAgIGNvbnN0IGQgPSBiIC0gYTtcbiAgICByZXR1cm4gYSArIHQgKiAoZCA+IDE4MCB8fCBkIDwgLTE4MCA/IGQgLSAzNjAgKiBNYXRoLnJvdW5kKGQgLyAzNjApIDogZCk7XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlSGNsKGZyb20gICAgICAgICAgLCB0byAgICAgICAgICAsIHQgICAgICAgICkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGg6IGludGVycG9sYXRlSHVlKGZyb20uaCwgdG8uaCwgdCksXG4gICAgICAgIGM6IGludGVycG9sYXRlTnVtYmVyKGZyb20uYywgdG8uYywgdCksXG4gICAgICAgIGw6IGludGVycG9sYXRlTnVtYmVyKGZyb20ubCwgdG8ubCwgdCksXG4gICAgICAgIGFscGhhOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmFscGhhLCB0by5hbHBoYSwgdClcbiAgICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBsYWI6IHtcbiAgICAgICAgZm9yd2FyZDogcmdiVG9MYWIsXG4gICAgICAgIHJldmVyc2U6IGxhYlRvUmdiLFxuICAgICAgICBpbnRlcnBvbGF0ZTogaW50ZXJwb2xhdGVMYWJcbiAgICB9LFxuICAgIGhjbDoge1xuICAgICAgICBmb3J3YXJkOiByZ2JUb0hjbCxcbiAgICAgICAgcmV2ZXJzZTogaGNsVG9SZ2IsXG4gICAgICAgIGludGVycG9sYXRlOiBpbnRlcnBvbGF0ZUhjbFxuICAgIH1cbn07XG4iLCIvLyAgICAgIFxuXG4vKipcbiAqIERlZXBseSBjb21wYXJlcyB0d28gb2JqZWN0IGxpdGVyYWxzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGRlZXBFcXVhbChhICAgICAgICAsIGIgICAgICAgICkgICAgICAgICAge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShiKSB8fCBhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWRlZXBFcXVhbChhW2ldLCBiW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnICYmIGEgIT09IG51bGwgJiYgYiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoISh0eXBlb2YgYiA9PT0gJ29iamVjdCcpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYSkge1xuICAgICAgICAgICAgaWYgKCFkZWVwRXF1YWwoYVtrZXldLCBiW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBhID09PSBiO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZXBFcXVhbDtcbiIsIlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3V0cHV0LCAuLi5pbnB1dHMpIHtcbiAgICBmb3IgKGNvbnN0IGlucHV0IG9mIGlucHV0cykge1xuICAgICAgICBmb3IgKGNvbnN0IGsgaW4gaW5wdXQpIHtcbiAgICAgICAgICAgIG91dHB1dFtrXSA9IGlucHV0W2tdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG59O1xuIiwiXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFR5cGUodmFsKSB7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIE51bWJlcikge1xuICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgfSBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgIH0gZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgQm9vbGVhbikge1xuICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIH0gZWxzZSBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWw7XG4gICAgfVxufTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IENvbG9yID0gcmVxdWlyZSgnLi9jb2xvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBudW1iZXIsXG4gICAgY29sb3IsXG4gICAgYXJyYXlcbn07XG5cbmZ1bmN0aW9uIG51bWJlcihhICAgICAgICAsIGIgICAgICAgICwgdCAgICAgICAgKSB7XG4gICAgcmV0dXJuIChhICogKDEgLSB0KSkgKyAoYiAqIHQpO1xufVxuXG5mdW5jdGlvbiBjb2xvcihmcm9tICAgICAgICwgdG8gICAgICAgLCB0ICAgICAgICApIHtcbiAgICByZXR1cm4gbmV3IENvbG9yKFxuICAgICAgICBudW1iZXIoZnJvbS5yLCB0by5yLCB0KSxcbiAgICAgICAgbnVtYmVyKGZyb20uZywgdG8uZywgdCksXG4gICAgICAgIG51bWJlcihmcm9tLmIsIHRvLmIsIHQpLFxuICAgICAgICBudW1iZXIoZnJvbS5hLCB0by5hLCB0KVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGFycmF5KGZyb20gICAgICAgICAgICAgICAsIHRvICAgICAgICAgICAgICAgLCB0ICAgICAgICApIHtcbiAgICByZXR1cm4gZnJvbS5tYXAoKGQsIGkpID0+IHtcbiAgICAgICAgcmV0dXJuIG51bWJlcihkLCB0b1tpXSwgdCk7XG4gICAgfSk7XG59XG4iLCJcbm1vZHVsZS5leHBvcnRzID0gWyd0eXBlJywgJ3NvdXJjZScsICdzb3VyY2UtbGF5ZXInLCAnbWluem9vbScsICdtYXh6b29tJywgJ2ZpbHRlcicsICdsYXlvdXQnXTtcbiIsIi8vICAgICAgXG5cbi8qKlxuICogQSB0eXBlIHVzZWQgZm9yIHJldHVybmluZyBhbmQgcHJvcGFnYXRpbmcgZXJyb3JzLiBUaGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgdW5pb25cbiAqIHJlcHJlc2VudHMgc3VjY2VzcyBhbmQgY29udGFpbnMgYSB2YWx1ZSwgYW5kIHRoZSBzZWNvbmQgcmVwcmVzZW50cyBhbiBlcnJvciBhbmRcbiAqIGNvbnRhaW5zIGFuIGVycm9yIHZhbHVlLlxuICogQHByaXZhdGVcbiAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuZnVuY3Rpb24gc3VjY2VzcyAgICAgICh2YWx1ZSAgICkgICAgICAgICAgICAgICB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiAnc3VjY2VzcycsIHZhbHVlIH07XG59XG5cbmZ1bmN0aW9uIGVycm9yICAgICAgKHZhbHVlICAgKSAgICAgICAgICAgICAgIHtcbiAgICByZXR1cm4geyByZXN1bHQ6ICdlcnJvcicsIHZhbHVlIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHN1Y2Nlc3MsXG4gICAgZXJyb3Jcbn07XG4iLCJcbi8vIFR1cm4ganNvbmxpbnQtbGluZXMtcHJpbWl0aXZlcyBvYmplY3RzIGludG8gcHJpbWl0aXZlIG9iamVjdHNcbmZ1bmN0aW9uIHVuYnVuZGxlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyIHx8IHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nIHx8IHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikge1xuICAgICAgICByZXR1cm4gdmFsdWUudmFsdWVPZigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRlZXBVbmJ1bmRsZSh2YWx1ZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUubWFwKGRlZXBVbmJ1bmRsZSk7XG4gICAgfVxuICAgIHJldHVybiB1bmJ1bmRsZSh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdW5idW5kbGU7XG5tb2R1bGUuZXhwb3J0cy5kZWVwID0gZGVlcFVuYnVuZGxlO1xuIiwiXG5jb25zdCBleHRlbmQgPSByZXF1aXJlKCcuLi91dGlsL2V4dGVuZCcpO1xuY29uc3QgdW5idW5kbGUgPSByZXF1aXJlKCcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50Jyk7XG5jb25zdCB7aXNFeHByZXNzaW9ufSA9IHJlcXVpcmUoJy4uL2V4cHJlc3Npb24nKTtcbmNvbnN0IHtpc0Z1bmN0aW9ufSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9uJyk7XG5cbi8vIE1haW4gcmVjdXJzaXZlIHZhbGlkYXRpb24gZnVuY3Rpb24uIFRyYWNrczpcbi8vXG4vLyAtIGtleTogc3RyaW5nIHJlcHJlc2VudGluZyBsb2NhdGlvbiBvZiB2YWxpZGF0aW9uIGluIHN0eWxlIHRyZWUuIFVzZWQgb25seVxuLy8gICBmb3IgbW9yZSBpbmZvcm1hdGl2ZSBlcnJvciByZXBvcnRpbmcuXG4vLyAtIHZhbHVlOiBjdXJyZW50IHZhbHVlIGZyb20gc3R5bGUgYmVpbmcgZXZhbHVhdGVkLiBNYXkgYmUgYW55dGhpbmcgZnJvbSBhXG4vLyAgIGhpZ2ggbGV2ZWwgb2JqZWN0IHRoYXQgbmVlZHMgdG8gYmUgZGVzY2VuZGVkIGludG8gZGVlcGVyIG9yIGEgc2ltcGxlXG4vLyAgIHNjYWxhciB2YWx1ZS5cbi8vIC0gdmFsdWVTcGVjOiBjdXJyZW50IHNwZWMgYmVpbmcgZXZhbHVhdGVkLiBUcmFja3MgdmFsdWUuXG4vLyAtIHN0eWxlU3BlYzogY3VycmVudCBmdWxsIHNwZWMgYmVpbmcgZXZhbHVhdGVkLlxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZhbGlkYXRlKG9wdGlvbnMpIHtcblxuICAgIGNvbnN0IHZhbGlkYXRlRnVuY3Rpb24gPSByZXF1aXJlKCcuL3ZhbGlkYXRlX2Z1bmN0aW9uJyk7XG4gICAgY29uc3QgdmFsaWRhdGVFeHByZXNzaW9uID0gcmVxdWlyZSgnLi92YWxpZGF0ZV9leHByZXNzaW9uJyk7XG4gICAgY29uc3QgdmFsaWRhdGVPYmplY3QgPSByZXF1aXJlKCcuL3ZhbGlkYXRlX29iamVjdCcpO1xuICAgIGNvbnN0IFZBTElEQVRPUlMgPSB7XG4gICAgICAgICcqJzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0sXG4gICAgICAgICdhcnJheSc6IHJlcXVpcmUoJy4vdmFsaWRhdGVfYXJyYXknKSxcbiAgICAgICAgJ2Jvb2xlYW4nOiByZXF1aXJlKCcuL3ZhbGlkYXRlX2Jvb2xlYW4nKSxcbiAgICAgICAgJ251bWJlcic6IHJlcXVpcmUoJy4vdmFsaWRhdGVfbnVtYmVyJyksXG4gICAgICAgICdjb2xvcic6IHJlcXVpcmUoJy4vdmFsaWRhdGVfY29sb3InKSxcbiAgICAgICAgJ2NvbnN0YW50cyc6IHJlcXVpcmUoJy4vdmFsaWRhdGVfY29uc3RhbnRzJyksXG4gICAgICAgICdlbnVtJzogcmVxdWlyZSgnLi92YWxpZGF0ZV9lbnVtJyksXG4gICAgICAgICdmaWx0ZXInOiByZXF1aXJlKCcuL3ZhbGlkYXRlX2ZpbHRlcicpLFxuICAgICAgICAnZnVuY3Rpb24nOiByZXF1aXJlKCcuL3ZhbGlkYXRlX2Z1bmN0aW9uJyksXG4gICAgICAgICdsYXllcic6IHJlcXVpcmUoJy4vdmFsaWRhdGVfbGF5ZXInKSxcbiAgICAgICAgJ29iamVjdCc6IHJlcXVpcmUoJy4vdmFsaWRhdGVfb2JqZWN0JyksXG4gICAgICAgICdzb3VyY2UnOiByZXF1aXJlKCcuL3ZhbGlkYXRlX3NvdXJjZScpLFxuICAgICAgICAnbGlnaHQnOiByZXF1aXJlKCcuL3ZhbGlkYXRlX2xpZ2h0JyksXG4gICAgICAgICdzdHJpbmcnOiByZXF1aXJlKCcuL3ZhbGlkYXRlX3N0cmluZycpXG4gICAgfTtcblxuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB2YWx1ZVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYztcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcblxuICAgIGlmICh2YWx1ZVNwZWMuZnVuY3Rpb24gJiYgaXNGdW5jdGlvbih1bmJ1bmRsZSh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZUZ1bmN0aW9uKG9wdGlvbnMpO1xuXG4gICAgfSBlbHNlIGlmICh2YWx1ZVNwZWMuZnVuY3Rpb24gJiYgaXNFeHByZXNzaW9uKHVuYnVuZGxlLmRlZXAodmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVFeHByZXNzaW9uKG9wdGlvbnMpO1xuXG4gICAgfSBlbHNlIGlmICh2YWx1ZVNwZWMudHlwZSAmJiBWQUxJREFUT1JTW3ZhbHVlU3BlYy50eXBlXSkge1xuICAgICAgICByZXR1cm4gVkFMSURBVE9SU1t2YWx1ZVNwZWMudHlwZV0ob3B0aW9ucyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVPYmplY3QoZXh0ZW5kKHt9LCBvcHRpb25zLCB7XG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHZhbHVlU3BlYy50eXBlID8gc3R5bGVTcGVjW3ZhbHVlU3BlYy50eXBlXSA6IHZhbHVlU3BlY1xuICAgICAgICB9KSk7XG4gICAgfVxufTtcbiIsIlxuY29uc3QgZ2V0VHlwZSA9IHJlcXVpcmUoJy4uL3V0aWwvZ2V0X3R5cGUnKTtcbmNvbnN0IHZhbGlkYXRlID0gcmVxdWlyZSgnLi92YWxpZGF0ZScpO1xuY29uc3QgVmFsaWRhdGlvbkVycm9yID0gcmVxdWlyZSgnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZhbGlkYXRlQXJyYXkob3B0aW9ucykge1xuICAgIGNvbnN0IGFycmF5ID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBhcnJheVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYztcbiAgICBjb25zdCBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3QgdmFsaWRhdGVBcnJheUVsZW1lbnQgPSBvcHRpb25zLmFycmF5RWxlbWVudFZhbGlkYXRvciB8fCB2YWxpZGF0ZTtcblxuICAgIGlmIChnZXRUeXBlKGFycmF5KSAhPT0gJ2FycmF5Jykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBhcnJheSwgYGFycmF5IGV4cGVjdGVkLCAke2dldFR5cGUoYXJyYXkpfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBpZiAoYXJyYXlTcGVjLmxlbmd0aCAmJiBhcnJheS5sZW5ndGggIT09IGFycmF5U3BlYy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgYXJyYXksIGBhcnJheSBsZW5ndGggJHthcnJheVNwZWMubGVuZ3RofSBleHBlY3RlZCwgbGVuZ3RoICR7YXJyYXkubGVuZ3RofSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBpZiAoYXJyYXlTcGVjWydtaW4tbGVuZ3RoJ10gJiYgYXJyYXkubGVuZ3RoIDwgYXJyYXlTcGVjWydtaW4tbGVuZ3RoJ10pIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgYXJyYXksIGBhcnJheSBsZW5ndGggYXQgbGVhc3QgJHthcnJheVNwZWNbJ21pbi1sZW5ndGgnXX0gZXhwZWN0ZWQsIGxlbmd0aCAke2FycmF5Lmxlbmd0aH0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgbGV0IGFycmF5RWxlbWVudFNwZWMgPSB7XG4gICAgICAgIFwidHlwZVwiOiBhcnJheVNwZWMudmFsdWVcbiAgICB9O1xuXG4gICAgaWYgKHN0eWxlU3BlYy4kdmVyc2lvbiA8IDcpIHtcbiAgICAgICAgYXJyYXlFbGVtZW50U3BlYy5mdW5jdGlvbiA9IGFycmF5U3BlYy5mdW5jdGlvbjtcbiAgICB9XG5cbiAgICBpZiAoZ2V0VHlwZShhcnJheVNwZWMudmFsdWUpID09PSAnb2JqZWN0Jykge1xuICAgICAgICBhcnJheUVsZW1lbnRTcGVjID0gYXJyYXlTcGVjLnZhbHVlO1xuICAgIH1cblxuICAgIGxldCBlcnJvcnMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVBcnJheUVsZW1lbnQoe1xuICAgICAgICAgICAgYXJyYXk6IGFycmF5LFxuICAgICAgICAgICAgYXJyYXlJbmRleDogaSxcbiAgICAgICAgICAgIHZhbHVlOiBhcnJheVtpXSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogYXJyYXlFbGVtZW50U3BlYyxcbiAgICAgICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogc3R5bGVTcGVjLFxuICAgICAgICAgICAga2V5OiBgJHtrZXl9WyR7aX1dYFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHJldHVybiBlcnJvcnM7XG59O1xuIiwiXG5jb25zdCBnZXRUeXBlID0gcmVxdWlyZSgnLi4vdXRpbC9nZXRfdHlwZScpO1xuY29uc3QgVmFsaWRhdGlvbkVycm9yID0gcmVxdWlyZSgnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZhbGlkYXRlQm9vbGVhbihvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlKHZhbHVlKTtcblxuICAgIGlmICh0eXBlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBib29sZWFuIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn07XG4iLCJcbmNvbnN0IFZhbGlkYXRpb25FcnJvciA9IHJlcXVpcmUoJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InKTtcbmNvbnN0IGdldFR5cGUgPSByZXF1aXJlKCcuLi91dGlsL2dldF90eXBlJyk7XG5jb25zdCBwYXJzZUNTU0NvbG9yID0gcmVxdWlyZSgnY3NzY29sb3JwYXJzZXInKS5wYXJzZUNTU0NvbG9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZhbGlkYXRlQ29sb3Iob3B0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBjb2xvciBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VDU1NDb2xvcih2YWx1ZSkgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBjb2xvciBleHBlY3RlZCwgXCIke3ZhbHVlfVwiIGZvdW5kYCldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn07XG4iLCJcbmNvbnN0IFZhbGlkYXRpb25FcnJvciA9IHJlcXVpcmUoJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB2YWxpZGF0ZUNvbnN0YW50cyhvcHRpb25zKSB7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3QgY29uc3RhbnRzID0gb3B0aW9ucy52YWx1ZTtcblxuICAgIGlmIChjb25zdGFudHMpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgY29uc3RhbnRzLCAnY29uc3RhbnRzIGhhdmUgYmVlbiBkZXByZWNhdGVkIGFzIG9mIHY4JyldO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG59O1xuIiwiXG5jb25zdCBWYWxpZGF0aW9uRXJyb3IgPSByZXF1aXJlKCcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJyk7XG5jb25zdCB1bmJ1bmRsZSA9IHJlcXVpcmUoJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB2YWxpZGF0ZUVudW0ob3B0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB2YWx1ZVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYztcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlU3BlYy52YWx1ZXMpKSB7IC8vIDw9djdcbiAgICAgICAgaWYgKHZhbHVlU3BlYy52YWx1ZXMuaW5kZXhPZih1bmJ1bmRsZSh2YWx1ZSkpID09PSAtMSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgZXhwZWN0ZWQgb25lIG9mIFske3ZhbHVlU3BlYy52YWx1ZXMuam9pbignLCAnKX1dLCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0gZm91bmRgKSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyA+PXY4XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZVNwZWMudmFsdWVzKS5pbmRleE9mKHVuYnVuZGxlKHZhbHVlKSkgPT09IC0xKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBleHBlY3RlZCBvbmUgb2YgWyR7T2JqZWN0LmtleXModmFsdWVTcGVjLnZhbHVlcykuam9pbignLCAnKX1dLCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0gZm91bmRgKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycztcbn07XG4iLCIvLyAgICAgIFxuXG5jb25zdCBWYWxpZGF0aW9uRXJyb3IgPSByZXF1aXJlKCcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJyk7XG5jb25zdCB7Y3JlYXRlRXhwcmVzc2lvbiwgY3JlYXRlUHJvcGVydHlFeHByZXNzaW9ufSA9IHJlcXVpcmUoJy4uL2V4cHJlc3Npb24nKTtcbmNvbnN0IHVuYnVuZGxlID0gcmVxdWlyZSgnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZhbGlkYXRlRXhwcmVzc2lvbihvcHRpb25zICAgICApIHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gKG9wdGlvbnMuZXhwcmVzc2lvbkNvbnRleHQgPT09ICdwcm9wZXJ0eScgPyBjcmVhdGVQcm9wZXJ0eUV4cHJlc3Npb24gOiBjcmVhdGVFeHByZXNzaW9uKSh1bmJ1bmRsZS5kZWVwKG9wdGlvbnMudmFsdWUpLCBvcHRpb25zLnZhbHVlU3BlYyk7XG4gICAgaWYgKGV4cHJlc3Npb24ucmVzdWx0ID09PSAnZXJyb3InKSB7XG4gICAgICAgIHJldHVybiBleHByZXNzaW9uLnZhbHVlLm1hcCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmFsaWRhdGlvbkVycm9yKGAke29wdGlvbnMua2V5fSR7ZXJyb3Iua2V5fWAsIG9wdGlvbnMudmFsdWUsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5leHByZXNzaW9uQ29udGV4dCA9PT0gJ3Byb3BlcnR5JyAmJiBvcHRpb25zLnByb3BlcnR5S2V5ID09PSAndGV4dC1mb250JyAmJlxuICAgICAgICAoZXhwcmVzc2lvbi52YWx1ZSAgICAgKS5fc3R5bGVFeHByZXNzaW9uLmV4cHJlc3Npb24ucG9zc2libGVPdXRwdXRzKCkuaW5kZXhPZih1bmRlZmluZWQpICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdJbnZhbGlkIGRhdGEgZXhwcmVzc2lvbiBmb3IgXCJ0ZXh0LWZvbnRcIi4gT3V0cHV0IHZhbHVlcyBtdXN0IGJlIGNvbnRhaW5lZCBhcyBsaXRlcmFscyB3aXRoaW4gdGhlIGV4cHJlc3Npb24uJyldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn07XG4iLCJcbmNvbnN0IFZhbGlkYXRpb25FcnJvciA9IHJlcXVpcmUoJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InKTtcbmNvbnN0IHZhbGlkYXRlRXhwcmVzc2lvbiA9IHJlcXVpcmUoJy4vdmFsaWRhdGVfZXhwcmVzc2lvbicpO1xuY29uc3QgdmFsaWRhdGVFbnVtID0gcmVxdWlyZSgnLi92YWxpZGF0ZV9lbnVtJyk7XG5jb25zdCBnZXRUeXBlID0gcmVxdWlyZSgnLi4vdXRpbC9nZXRfdHlwZScpO1xuY29uc3QgdW5idW5kbGUgPSByZXF1aXJlKCcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50Jyk7XG5jb25zdCBleHRlbmQgPSByZXF1aXJlKCcuLi91dGlsL2V4dGVuZCcpO1xuY29uc3Qge2lzRXhwcmVzc2lvbkZpbHRlcn0gPSByZXF1aXJlKCcuLi9mZWF0dXJlX2ZpbHRlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZhbGlkYXRlRmlsdGVyKG9wdGlvbnMpIHtcbiAgICBpZiAoaXNFeHByZXNzaW9uRmlsdGVyKHVuYnVuZGxlLmRlZXAob3B0aW9ucy52YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZUV4cHJlc3Npb24oZXh0ZW5kKHt9LCBvcHRpb25zLCB7XG4gICAgICAgICAgICBleHByZXNzaW9uQ29udGV4dDogJ2ZpbHRlcicsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHsgdmFsdWU6ICdib29sZWFuJyB9XG4gICAgICAgIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVOb25FeHByZXNzaW9uRmlsdGVyKG9wdGlvbnMpO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTm9uRXhwcmVzc2lvbkZpbHRlcihvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuXG4gICAgaWYgKGdldFR5cGUodmFsdWUpICE9PSAnYXJyYXknKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgYXJyYXkgZXhwZWN0ZWQsICR7Z2V0VHlwZSh2YWx1ZSl9IGZvdW5kYCldO1xuICAgIH1cblxuICAgIGNvbnN0IHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuICAgIGxldCB0eXBlO1xuXG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgaWYgKHZhbHVlLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdmaWx0ZXIgYXJyYXkgbXVzdCBoYXZlIGF0IGxlYXN0IDEgZWxlbWVudCcpXTtcbiAgICB9XG5cbiAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlRW51bSh7XG4gICAgICAgIGtleTogYCR7a2V5fVswXWAsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVswXSxcbiAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuZmlsdGVyX29wZXJhdG9yLFxuICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlY1xuICAgIH0pKTtcblxuICAgIHN3aXRjaCAodW5idW5kbGUodmFsdWVbMF0pKSB7XG4gICAgY2FzZSAnPCc6XG4gICAgY2FzZSAnPD0nOlxuICAgIGNhc2UgJz4nOlxuICAgIGNhc2UgJz49JzpcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+PSAyICYmIHVuYnVuZGxlKHZhbHVlWzFdKSA9PT0gJyR0eXBlJykge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgXCIkdHlwZVwiIGNhbm5vdCBiZSB1c2Ugd2l0aCBvcGVyYXRvciBcIiR7dmFsdWVbMF19XCJgKSk7XG4gICAgICAgIH1cbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgJz09JzpcbiAgICBjYXNlICchPSc6XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYGZpbHRlciBhcnJheSBmb3Igb3BlcmF0b3IgXCIke3ZhbHVlWzBdfVwiIG11c3QgaGF2ZSAzIGVsZW1lbnRzYCkpO1xuICAgICAgICB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlICdpbic6XG4gICAgY2FzZSAnIWluJzpcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICB0eXBlID0gZ2V0VHlwZSh2YWx1ZVsxXSk7XG4gICAgICAgICAgICBpZiAodHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGAke2tleX1bMV1gLCB2YWx1ZVsxXSwgYHN0cmluZyBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMjsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0eXBlID0gZ2V0VHlwZSh2YWx1ZVtpXSk7XG4gICAgICAgICAgICBpZiAodW5idW5kbGUodmFsdWVbMV0pID09PSAnJHR5cGUnKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUVudW0oe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGAke2tleX1bJHtpfV1gLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVbaV0sXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLmdlb21ldHJ5X3R5cGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSAnc3RyaW5nJyAmJiB0eXBlICE9PSAnbnVtYmVyJyAmJiB0eXBlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGAke2tleX1bJHtpfV1gLCB2YWx1ZVtpXSwgYHN0cmluZywgbnVtYmVyLCBvciBib29sZWFuIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYW55JzpcbiAgICBjYXNlICdhbGwnOlxuICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlTm9uRXhwcmVzc2lvbkZpbHRlcih7XG4gICAgICAgICAgICAgICAga2V5OiBgJHtrZXl9WyR7aX1dYCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVbaV0sXG4gICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlY1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaGFzJzpcbiAgICBjYXNlICchaGFzJzpcbiAgICAgICAgdHlwZSA9IGdldFR5cGUodmFsdWVbMV0pO1xuICAgICAgICBpZiAodmFsdWUubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBmaWx0ZXIgYXJyYXkgZm9yIFwiJHt2YWx1ZVswXX1cIiBvcGVyYXRvciBtdXN0IGhhdmUgMiBlbGVtZW50c2ApKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihgJHtrZXl9WzFdYCwgdmFsdWVbMV0sIGBzdHJpbmcgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5jb25zdCBWYWxpZGF0aW9uRXJyb3IgPSByZXF1aXJlKCcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJyk7XG5jb25zdCBnZXRUeXBlID0gcmVxdWlyZSgnLi4vdXRpbC9nZXRfdHlwZScpO1xuY29uc3QgdmFsaWRhdGUgPSByZXF1aXJlKCcuL3ZhbGlkYXRlJyk7XG5jb25zdCB2YWxpZGF0ZU9iamVjdCA9IHJlcXVpcmUoJy4vdmFsaWRhdGVfb2JqZWN0Jyk7XG5jb25zdCB2YWxpZGF0ZUFycmF5ID0gcmVxdWlyZSgnLi92YWxpZGF0ZV9hcnJheScpO1xuY29uc3QgdmFsaWRhdGVOdW1iZXIgPSByZXF1aXJlKCcuL3ZhbGlkYXRlX251bWJlcicpO1xuY29uc3QgdW5idW5kbGUgPSByZXF1aXJlKCcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvbihvcHRpb25zKSB7XG4gICAgY29uc3QgZnVuY3Rpb25WYWx1ZVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYztcbiAgICBjb25zdCBmdW5jdGlvblR5cGUgPSB1bmJ1bmRsZShvcHRpb25zLnZhbHVlLnR5cGUpO1xuICAgIGxldCBzdG9wS2V5VHlwZTtcbiAgICBsZXQgc3RvcERvbWFpblZhbHVlcyA9IHt9O1xuICAgIGxldCBwcmV2aW91c1N0b3BEb21haW5WYWx1ZTtcbiAgICBsZXQgcHJldmlvdXNTdG9wRG9tYWluWm9vbTtcblxuICAgIGNvbnN0IGlzWm9vbUZ1bmN0aW9uID0gZnVuY3Rpb25UeXBlICE9PSAnY2F0ZWdvcmljYWwnICYmIG9wdGlvbnMudmFsdWUucHJvcGVydHkgPT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpc1Byb3BlcnR5RnVuY3Rpb24gPSAhaXNab29tRnVuY3Rpb247XG4gICAgY29uc3QgaXNab29tQW5kUHJvcGVydHlGdW5jdGlvbiA9XG4gICAgICAgIGdldFR5cGUob3B0aW9ucy52YWx1ZS5zdG9wcykgPT09ICdhcnJheScgJiZcbiAgICAgICAgZ2V0VHlwZShvcHRpb25zLnZhbHVlLnN0b3BzWzBdKSA9PT0gJ2FycmF5JyAmJlxuICAgICAgICBnZXRUeXBlKG9wdGlvbnMudmFsdWUuc3RvcHNbMF1bMF0pID09PSAnb2JqZWN0JztcblxuICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAga2V5OiBvcHRpb25zLmtleSxcbiAgICAgICAgdmFsdWU6IG9wdGlvbnMudmFsdWUsXG4gICAgICAgIHZhbHVlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMuZnVuY3Rpb24sXG4gICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLFxuICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yczoge1xuICAgICAgICAgICAgc3RvcHM6IHZhbGlkYXRlRnVuY3Rpb25TdG9wcyxcbiAgICAgICAgICAgIGRlZmF1bHQ6IHZhbGlkYXRlRnVuY3Rpb25EZWZhdWx0XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChmdW5jdGlvblR5cGUgPT09ICdpZGVudGl0eScgJiYgaXNab29tRnVuY3Rpb24pIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ21pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJwcm9wZXJ0eVwiJykpO1xuICAgIH1cblxuICAgIGlmIChmdW5jdGlvblR5cGUgIT09ICdpZGVudGl0eScgJiYgIW9wdGlvbnMudmFsdWUuc3RvcHMpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ21pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJzdG9wc1wiJykpO1xuICAgIH1cblxuICAgIGlmIChmdW5jdGlvblR5cGUgPT09ICdleHBvbmVudGlhbCcgJiYgb3B0aW9ucy52YWx1ZVNwZWNbJ2Z1bmN0aW9uJ10gPT09ICdwaWVjZXdpc2UtY29uc3RhbnQnKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdleHBvbmVudGlhbCBmdW5jdGlvbnMgbm90IHN1cHBvcnRlZCcpKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zdHlsZVNwZWMuJHZlcnNpb24gPj0gOCkge1xuICAgICAgICBpZiAoaXNQcm9wZXJ0eUZ1bmN0aW9uICYmICFvcHRpb25zLnZhbHVlU3BlY1sncHJvcGVydHktZnVuY3Rpb24nXSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ3Byb3BlcnR5IGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkJykpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzWm9vbUZ1bmN0aW9uICYmICFvcHRpb25zLnZhbHVlU3BlY1snem9vbS1mdW5jdGlvbiddICYmIG9wdGlvbnMub2JqZWN0S2V5ICE9PSAnaGVhdG1hcC1jb2xvcicpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICd6b29tIGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkJykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKChmdW5jdGlvblR5cGUgPT09ICdjYXRlZ29yaWNhbCcgfHwgaXNab29tQW5kUHJvcGVydHlGdW5jdGlvbikgJiYgb3B0aW9ucy52YWx1ZS5wcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdcInByb3BlcnR5XCIgcHJvcGVydHkgaXMgcmVxdWlyZWQnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb25TdG9wcyhvcHRpb25zKSB7XG4gICAgICAgIGlmIChmdW5jdGlvblR5cGUgPT09ICdpZGVudGl0eScpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ2lkZW50aXR5IGZ1bmN0aW9uIG1heSBub3QgaGF2ZSBhIFwic3RvcHNcIiBwcm9wZXJ0eScpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlcnJvcnMgPSBbXTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuXG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVBcnJheSh7XG4gICAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBvcHRpb25zLnZhbHVlU3BlYyxcbiAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYyxcbiAgICAgICAgICAgIGFycmF5RWxlbWVudFZhbGlkYXRvcjogdmFsaWRhdGVGdW5jdGlvblN0b3BcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGlmIChnZXRUeXBlKHZhbHVlKSA9PT0gJ2FycmF5JyAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIHZhbHVlLCAnYXJyYXkgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzdG9wJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUZ1bmN0aW9uU3RvcChvcHRpb25zKSB7XG4gICAgICAgIGxldCBlcnJvcnMgPSBbXTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgICAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcblxuICAgICAgICBpZiAoZ2V0VHlwZSh2YWx1ZSkgIT09ICdhcnJheScpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgYXJyYXkgZXhwZWN0ZWQsICR7Z2V0VHlwZSh2YWx1ZSl9IGZvdW5kYCldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBhcnJheSBsZW5ndGggMiBleHBlY3RlZCwgbGVuZ3RoICR7dmFsdWUubGVuZ3RofSBmb3VuZGApXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1pvb21BbmRQcm9wZXJ0eUZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZ2V0VHlwZSh2YWx1ZVswXSkgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBvYmplY3QgZXhwZWN0ZWQsICR7Z2V0VHlwZSh2YWx1ZVswXSl9IGZvdW5kYCldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlWzBdLnpvb20gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAnb2JqZWN0IHN0b3Aga2V5IG11c3QgaGF2ZSB6b29tJyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlWzBdLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ29iamVjdCBzdG9wIGtleSBtdXN0IGhhdmUgdmFsdWUnKV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJldmlvdXNTdG9wRG9tYWluWm9vbSAmJiBwcmV2aW91c1N0b3BEb21haW5ab29tID4gdW5idW5kbGUodmFsdWVbMF0uem9vbSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZVswXS56b29tLCAnc3RvcCB6b29tIHZhbHVlcyBtdXN0IGFwcGVhciBpbiBhc2NlbmRpbmcgb3JkZXInKV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodW5idW5kbGUodmFsdWVbMF0uem9vbSkgIT09IHByZXZpb3VzU3RvcERvbWFpblpvb20pIHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c1N0b3BEb21haW5ab29tID0gdW5idW5kbGUodmFsdWVbMF0uem9vbSk7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTdG9wRG9tYWluVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgc3RvcERvbWFpblZhbHVlcyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICAgICAga2V5OiBgJHtrZXl9WzBdYCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVbMF0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiB7IHpvb206IHt9IH0sXG4gICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYyxcbiAgICAgICAgICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yczogeyB6b29tOiB2YWxpZGF0ZU51bWJlciwgdmFsdWU6IHZhbGlkYXRlU3RvcERvbWFpblZhbHVlIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVTdG9wRG9tYWluVmFsdWUoe1xuICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fVswXWAsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlWzBdLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzoge30sXG4gICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlY1xuICAgICAgICAgICAgfSwgdmFsdWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAgICAgIGtleTogYCR7a2V5fVsxXWAsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVbMV0sXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IGZ1bmN0aW9uVmFsdWVTcGVjLFxuICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZVN0b3BEb21haW5WYWx1ZShvcHRpb25zLCBzdG9wKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlKG9wdGlvbnMudmFsdWUpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHVuYnVuZGxlKG9wdGlvbnMudmFsdWUpO1xuXG4gICAgICAgIGNvbnN0IHJlcG9ydFZhbHVlID0gb3B0aW9ucy52YWx1ZSAhPT0gbnVsbCA/IG9wdGlvbnMudmFsdWUgOiBzdG9wO1xuXG4gICAgICAgIGlmICghc3RvcEtleVR5cGUpIHtcbiAgICAgICAgICAgIHN0b3BLZXlUeXBlID0gdHlwZTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSBzdG9wS2V5VHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCByZXBvcnRWYWx1ZSwgYCR7dHlwZX0gc3RvcCBkb21haW4gdHlwZSBtdXN0IG1hdGNoIHByZXZpb3VzIHN0b3AgZG9tYWluIHR5cGUgJHtzdG9wS2V5VHlwZX1gKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSAhPT0gJ251bWJlcicgJiYgdHlwZSAhPT0gJ3N0cmluZycgJiYgdHlwZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIHJlcG9ydFZhbHVlLCAnc3RvcCBkb21haW4gdmFsdWUgbXVzdCBiZSBhIG51bWJlciwgc3RyaW5nLCBvciBib29sZWFuJyldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUgIT09ICdudW1iZXInICYmIGZ1bmN0aW9uVHlwZSAhPT0gJ2NhdGVnb3JpY2FsJykge1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgbnVtYmVyIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYDtcbiAgICAgICAgICAgIGlmIChmdW5jdGlvblZhbHVlU3BlY1sncHJvcGVydHktZnVuY3Rpb24nXSAmJiBmdW5jdGlvblR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gJ1xcbklmIHlvdSBpbnRlbmRlZCB0byB1c2UgYSBjYXRlZ29yaWNhbCBmdW5jdGlvbiwgc3BlY2lmeSBgXCJ0eXBlXCI6IFwiY2F0ZWdvcmljYWxcImAuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsIG1lc3NhZ2UpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmdW5jdGlvblR5cGUgPT09ICdjYXRlZ29yaWNhbCcgJiYgdHlwZSA9PT0gJ251bWJlcicgJiYgKCFpc0Zpbml0ZSh2YWx1ZSkgfHwgTWF0aC5mbG9vcih2YWx1ZSkgIT09IHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCByZXBvcnRWYWx1ZSwgYGludGVnZXIgZXhwZWN0ZWQsIGZvdW5kICR7dmFsdWV9YCldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZ1bmN0aW9uVHlwZSAhPT0gJ2NhdGVnb3JpY2FsJyAmJiB0eXBlID09PSAnbnVtYmVyJyAmJiBwcmV2aW91c1N0b3BEb21haW5WYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlIDwgcHJldmlvdXNTdG9wRG9tYWluVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsICdzdG9wIGRvbWFpbiB2YWx1ZXMgbXVzdCBhcHBlYXIgaW4gYXNjZW5kaW5nIG9yZGVyJyldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJldmlvdXNTdG9wRG9tYWluVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmdW5jdGlvblR5cGUgPT09ICdjYXRlZ29yaWNhbCcgJiYgdmFsdWUgaW4gc3RvcERvbWFpblZhbHVlcykge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCByZXBvcnRWYWx1ZSwgJ3N0b3AgZG9tYWluIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZScpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0b3BEb21haW5WYWx1ZXNbdmFsdWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUZ1bmN0aW9uRGVmYXVsdChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZSh7XG4gICAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMudmFsdWUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IGZ1bmN0aW9uVmFsdWVTcGVjLFxuICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjXG4gICAgICAgIH0pO1xuICAgIH1cbn07XG4iLCJcbmNvbnN0IFZhbGlkYXRpb25FcnJvciA9IHJlcXVpcmUoJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InKTtcbmNvbnN0IHZhbGlkYXRlU3RyaW5nID0gcmVxdWlyZSgnLi92YWxpZGF0ZV9zdHJpbmcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuXG4gICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVTdHJpbmcob3B0aW9ucyk7XG4gICAgaWYgKGVycm9ycy5sZW5ndGgpIHJldHVybiBlcnJvcnM7XG5cbiAgICBpZiAodmFsdWUuaW5kZXhPZigne2ZvbnRzdGFja30nKSA9PT0gLTEpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAnXCJnbHlwaHNcIiB1cmwgbXVzdCBpbmNsdWRlIGEgXCJ7Zm9udHN0YWNrfVwiIHRva2VuJykpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5pbmRleE9mKCd7cmFuZ2V9JykgPT09IC0xKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ1wiZ2x5cGhzXCIgdXJsIG11c3QgaW5jbHVkZSBhIFwie3JhbmdlfVwiIHRva2VuJykpO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG59O1xuIiwiXG5jb25zdCBWYWxpZGF0aW9uRXJyb3IgPSByZXF1aXJlKCcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJyk7XG5jb25zdCB1bmJ1bmRsZSA9IHJlcXVpcmUoJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQnKTtcbmNvbnN0IHZhbGlkYXRlT2JqZWN0ID0gcmVxdWlyZSgnLi92YWxpZGF0ZV9vYmplY3QnKTtcbmNvbnN0IHZhbGlkYXRlRmlsdGVyID0gcmVxdWlyZSgnLi92YWxpZGF0ZV9maWx0ZXInKTtcbmNvbnN0IHZhbGlkYXRlUGFpbnRQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vdmFsaWRhdGVfcGFpbnRfcHJvcGVydHknKTtcbmNvbnN0IHZhbGlkYXRlTGF5b3V0UHJvcGVydHkgPSByZXF1aXJlKCcuL3ZhbGlkYXRlX2xheW91dF9wcm9wZXJ0eScpO1xuY29uc3QgdmFsaWRhdGVTcGVjID0gcmVxdWlyZSgnLi92YWxpZGF0ZScpO1xuY29uc3QgZXh0ZW5kID0gcmVxdWlyZSgnLi4vdXRpbC9leHRlbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB2YWxpZGF0ZUxheWVyKG9wdGlvbnMpIHtcbiAgICBsZXQgZXJyb3JzID0gW107XG5cbiAgICBjb25zdCBsYXllciA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuICAgIGNvbnN0IHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuXG4gICAgaWYgKCFsYXllci50eXBlICYmICFsYXllci5yZWYpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLCAnZWl0aGVyIFwidHlwZVwiIG9yIFwicmVmXCIgaXMgcmVxdWlyZWQnKSk7XG4gICAgfVxuICAgIGxldCB0eXBlID0gdW5idW5kbGUobGF5ZXIudHlwZSk7XG4gICAgY29uc3QgcmVmID0gdW5idW5kbGUobGF5ZXIucmVmKTtcblxuICAgIGlmIChsYXllci5pZCkge1xuICAgICAgICBjb25zdCBsYXllcklkID0gdW5idW5kbGUobGF5ZXIuaWQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnMuYXJyYXlJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBvdGhlckxheWVyID0gc3R5bGUubGF5ZXJzW2ldO1xuICAgICAgICAgICAgaWYgKHVuYnVuZGxlKG90aGVyTGF5ZXIuaWQpID09PSBsYXllcklkKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLmlkLCBgZHVwbGljYXRlIGxheWVyIGlkIFwiJHtsYXllci5pZH1cIiwgcHJldmlvdXNseSB1c2VkIGF0IGxpbmUgJHtvdGhlckxheWVyLmlkLl9fbGluZV9ffWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICgncmVmJyBpbiBsYXllcikge1xuICAgICAgICBbJ3R5cGUnLCAnc291cmNlJywgJ3NvdXJjZS1sYXllcicsICdmaWx0ZXInLCAnbGF5b3V0J10uZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICAgICAgaWYgKHAgaW4gbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXJbcF0sIGBcIiR7cH1cIiBpcyBwcm9oaWJpdGVkIGZvciByZWYgbGF5ZXJzYCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgcGFyZW50O1xuXG4gICAgICAgIHN0eWxlLmxheWVycy5mb3JFYWNoKChsYXllcikgPT4ge1xuICAgICAgICAgICAgaWYgKHVuYnVuZGxlKGxheWVyLmlkKSA9PT0gcmVmKSBwYXJlbnQgPSBsYXllcjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5yZWYsIGByZWYgbGF5ZXIgXCIke3JlZn1cIiBub3QgZm91bmRgKSk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFyZW50LnJlZikge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLnJlZiwgJ3JlZiBjYW5ub3QgcmVmZXJlbmNlIGFub3RoZXIgcmVmIGxheWVyJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHlwZSA9IHVuYnVuZGxlKHBhcmVudC50eXBlKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gJ2JhY2tncm91bmQnKSB7XG4gICAgICAgIGlmICghbGF5ZXIuc291cmNlKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwic291cmNlXCInKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBzdHlsZS5zb3VyY2VzICYmIHN0eWxlLnNvdXJjZXNbbGF5ZXIuc291cmNlXTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVR5cGUgPSBzb3VyY2UgJiYgdW5idW5kbGUoc291cmNlLnR5cGUpO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIuc291cmNlLCBgc291cmNlIFwiJHtsYXllci5zb3VyY2V9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VUeXBlID09PSAndmVjdG9yJyAmJiB0eXBlID09PSAncmFzdGVyJykge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5zb3VyY2UsIGBsYXllciBcIiR7bGF5ZXIuaWR9XCIgcmVxdWlyZXMgYSByYXN0ZXIgc291cmNlYCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VUeXBlID09PSAncmFzdGVyJyAmJiB0eXBlICE9PSAncmFzdGVyJykge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5zb3VyY2UsIGBsYXllciBcIiR7bGF5ZXIuaWR9XCIgcmVxdWlyZXMgYSB2ZWN0b3Igc291cmNlYCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VUeXBlID09PSAndmVjdG9yJyAmJiAhbGF5ZXJbJ3NvdXJjZS1sYXllciddKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLCBgbGF5ZXIgXCIke2xheWVyLmlkfVwiIG11c3Qgc3BlY2lmeSBhIFwic291cmNlLWxheWVyXCJgKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZVR5cGUgPT09ICdyYXN0ZXItZGVtJyAmJiB0eXBlICE9PSAnaGlsbHNoYWRlJykge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5zb3VyY2UsICdyYXN0ZXItZGVtIHNvdXJjZSBjYW4gb25seSBiZSB1c2VkIHdpdGggbGF5ZXIgdHlwZSBcXCdoaWxsc2hhZGVcXCcuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICB2YWx1ZTogbGF5ZXIsXG4gICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLmxheWVyLFxuICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYyxcbiAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHtcbiAgICAgICAgICAgICcqJzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZW5mb3JjZSB0aGUgc3BlYydzIGBcInJlcXVpcmVzXCI6IHRydWVgIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggcmVmcztcbiAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVxdWlyZW1lbnQgaXMgdmFsaWRhdGVkIGFib3ZlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzU3NzIuXG4gICAgICAgICAgICB0eXBlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVTcGVjKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBgJHtrZXl9LnR5cGVgLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbGF5ZXIudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMubGF5ZXIudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdDogbGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEtleTogJ3R5cGUnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmlsdGVyOiB2YWxpZGF0ZUZpbHRlcixcbiAgICAgICAgICAgIGxheW91dDogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyOiBsYXllcixcbiAgICAgICAgICAgICAgICAgICAga2V5OiBvcHRpb25zLmtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLFxuICAgICAgICAgICAgICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgJyonOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlTGF5b3V0UHJvcGVydHkoZXh0ZW5kKHtsYXllclR5cGU6IHR5cGV9LCBvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYWludDogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyOiBsYXllcixcbiAgICAgICAgICAgICAgICAgICAga2V5OiBvcHRpb25zLmtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLFxuICAgICAgICAgICAgICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgJyonOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlUGFpbnRQcm9wZXJ0eShleHRlbmQoe2xheWVyVHlwZTogdHlwZX0sIG9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIGVycm9ycztcbn07XG4iLCJcbmNvbnN0IHZhbGlkYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuL3ZhbGlkYXRlX3Byb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdmFsaWRhdGVMYXlvdXRQcm9wZXJ0eShvcHRpb25zKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlUHJvcGVydHkob3B0aW9ucywgJ2xheW91dCcpO1xufTtcbiIsIlxuY29uc3QgVmFsaWRhdGlvbkVycm9yID0gcmVxdWlyZSgnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcicpO1xuY29uc3QgZ2V0VHlwZSA9IHJlcXVpcmUoJy4uL3V0aWwvZ2V0X3R5cGUnKTtcbmNvbnN0IHZhbGlkYXRlID0gcmVxdWlyZSgnLi92YWxpZGF0ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZhbGlkYXRlTGlnaHQob3B0aW9ucykge1xuICAgIGNvbnN0IGxpZ2h0ID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBjb25zdCBsaWdodFNwZWMgPSBzdHlsZVNwZWMubGlnaHQ7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuXG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgY29uc3Qgcm9vdFR5cGUgPSBnZXRUeXBlKGxpZ2h0KTtcbiAgICBpZiAobGlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH0gZWxzZSBpZiAocm9vdFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQoW25ldyBWYWxpZGF0aW9uRXJyb3IoJ2xpZ2h0JywgbGlnaHQsIGBvYmplY3QgZXhwZWN0ZWQsICR7cm9vdFR5cGV9IGZvdW5kYCldKTtcbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBsaWdodCkge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uTWF0Y2ggPSBrZXkubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG5cbiAgICAgICAgaWYgKHRyYW5zaXRpb25NYXRjaCAmJiBsaWdodFNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXSAmJiBsaWdodFNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXS50cmFuc2l0aW9uKSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogbGlnaHRba2V5XSxcbiAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy50cmFuc2l0aW9uLFxuICAgICAgICAgICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IHN0eWxlU3BlY1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGxpZ2h0U3BlY1trZXldKSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogbGlnaHRba2V5XSxcbiAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IGxpZ2h0U3BlY1trZXldLFxuICAgICAgICAgICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IHN0eWxlU3BlY1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdChbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxpZ2h0W2tleV0sIGB1bmtub3duIHByb3BlcnR5IFwiJHtrZXl9XCJgKV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn07XG4iLCJcbmNvbnN0IGdldFR5cGUgPSByZXF1aXJlKCcuLi91dGlsL2dldF90eXBlJyk7XG5jb25zdCBWYWxpZGF0aW9uRXJyb3IgPSByZXF1aXJlKCcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdmFsaWRhdGVOdW1iZXIob3B0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB2YWx1ZVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYztcbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBudW1iZXIgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgaWYgKCdtaW5pbXVtJyBpbiB2YWx1ZVNwZWMgJiYgdmFsdWUgPCB2YWx1ZVNwZWMubWluaW11bSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYCR7dmFsdWV9IGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bSB2YWx1ZSAke3ZhbHVlU3BlYy5taW5pbXVtfWApXTtcbiAgICB9XG5cbiAgICBpZiAoJ21heGltdW0nIGluIHZhbHVlU3BlYyAmJiB2YWx1ZSA+IHZhbHVlU3BlYy5tYXhpbXVtKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgJHt2YWx1ZX0gaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIHZhbHVlICR7dmFsdWVTcGVjLm1heGltdW19YCldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn07XG4iLCJcbmNvbnN0IFZhbGlkYXRpb25FcnJvciA9IHJlcXVpcmUoJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InKTtcbmNvbnN0IGdldFR5cGUgPSByZXF1aXJlKCcuLi91dGlsL2dldF90eXBlJyk7XG5jb25zdCB2YWxpZGF0ZVNwZWMgPSByZXF1aXJlKCcuL3ZhbGlkYXRlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdmFsaWRhdGVPYmplY3Qob3B0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IG9iamVjdCA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3QgZWxlbWVudFNwZWNzID0gb3B0aW9ucy52YWx1ZVNwZWMgfHwge307XG4gICAgY29uc3QgZWxlbWVudFZhbGlkYXRvcnMgPSBvcHRpb25zLm9iamVjdEVsZW1lbnRWYWxpZGF0b3JzIHx8IHt9O1xuICAgIGNvbnN0IHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBsZXQgZXJyb3JzID0gW107XG5cbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZShvYmplY3QpO1xuICAgIGlmICh0eXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBvYmplY3QsIGBvYmplY3QgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvYmplY3RLZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRTcGVjS2V5ID0gb2JqZWN0S2V5LnNwbGl0KCcuJylbMF07IC8vIHRyZWF0ICdwYWludC4qJyBhcyAncGFpbnQnXG4gICAgICAgIGNvbnN0IGVsZW1lbnRTcGVjID0gZWxlbWVudFNwZWNzW2VsZW1lbnRTcGVjS2V5XSB8fCBlbGVtZW50U3BlY3NbJyonXTtcblxuICAgICAgICBsZXQgdmFsaWRhdGVFbGVtZW50O1xuICAgICAgICBpZiAoZWxlbWVudFZhbGlkYXRvcnNbZWxlbWVudFNwZWNLZXldKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQgPSBlbGVtZW50VmFsaWRhdG9yc1tlbGVtZW50U3BlY0tleV07XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudFNwZWNzW2VsZW1lbnRTcGVjS2V5XSkge1xuICAgICAgICAgICAgdmFsaWRhdGVFbGVtZW50ID0gdmFsaWRhdGVTcGVjO1xuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRWYWxpZGF0b3JzWycqJ10pIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRWxlbWVudCA9IGVsZW1lbnRWYWxpZGF0b3JzWycqJ107XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudFNwZWNzWycqJ10pIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRWxlbWVudCA9IHZhbGlkYXRlU3BlYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBvYmplY3Rbb2JqZWN0S2V5XSwgYHVua25vd24gcHJvcGVydHkgXCIke29iamVjdEtleX1cImApKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUVsZW1lbnQoe1xuICAgICAgICAgICAga2V5OiAoa2V5ID8gYCR7a2V5fS5gIDoga2V5KSArIG9iamVjdEtleSxcbiAgICAgICAgICAgIHZhbHVlOiBvYmplY3Rbb2JqZWN0S2V5XSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogZWxlbWVudFNwZWMsXG4gICAgICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IHN0eWxlU3BlYyxcbiAgICAgICAgICAgIG9iamVjdDogb2JqZWN0LFxuICAgICAgICAgICAgb2JqZWN0S2V5OiBvYmplY3RLZXlcbiAgICAgICAgfSwgb2JqZWN0KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlbGVtZW50U3BlY0tleSBpbiBlbGVtZW50U3BlY3MpIHtcbiAgICAgICAgLy8gRG9uJ3QgY2hlY2sgYHJlcXVpcmVkYCB3aGVuIHRoZXJlJ3MgYSBjdXN0b20gdmFsaWRhdG9yIGZvciB0aGF0IHByb3BlcnR5LlxuICAgICAgICBpZiAoZWxlbWVudFZhbGlkYXRvcnNbZWxlbWVudFNwZWNLZXldKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbGVtZW50U3BlY3NbZWxlbWVudFNwZWNLZXldLnJlcXVpcmVkICYmIGVsZW1lbnRTcGVjc1tlbGVtZW50U3BlY0tleV1bJ2RlZmF1bHQnXSA9PT0gdW5kZWZpbmVkICYmIG9iamVjdFtlbGVtZW50U3BlY0tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIG9iamVjdCwgYG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCIke2VsZW1lbnRTcGVjS2V5fVwiYCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn07XG4iLCJcbmNvbnN0IHZhbGlkYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuL3ZhbGlkYXRlX3Byb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdmFsaWRhdGVQYWludFByb3BlcnR5KG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVQcm9wZXJ0eShvcHRpb25zLCAncGFpbnQnKTtcbn07XG4iLCJcbmNvbnN0IHZhbGlkYXRlID0gcmVxdWlyZSgnLi92YWxpZGF0ZScpO1xuY29uc3QgVmFsaWRhdGlvbkVycm9yID0gcmVxdWlyZSgnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcicpO1xuY29uc3QgZ2V0VHlwZSA9IHJlcXVpcmUoJy4uL3V0aWwvZ2V0X3R5cGUnKTtcbmNvbnN0IHtpc0Z1bmN0aW9ufSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9uJyk7XG5jb25zdCB1bmJ1bmRsZSA9IHJlcXVpcmUoJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5KG9wdGlvbnMsIHByb3BlcnR5VHlwZSkge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3QgcHJvcGVydHlLZXkgPSBvcHRpb25zLm9iamVjdEtleTtcbiAgICBjb25zdCBsYXllclNwZWMgPSBzdHlsZVNwZWNbYCR7cHJvcGVydHlUeXBlfV8ke29wdGlvbnMubGF5ZXJUeXBlfWBdO1xuXG4gICAgaWYgKCFsYXllclNwZWMpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IHRyYW5zaXRpb25NYXRjaCA9IHByb3BlcnR5S2V5Lm1hdGNoKC9eKC4qKS10cmFuc2l0aW9uJC8pO1xuICAgIGlmIChwcm9wZXJ0eVR5cGUgPT09ICdwYWludCcgJiYgdHJhbnNpdGlvbk1hdGNoICYmIGxheWVyU3BlY1t0cmFuc2l0aW9uTWF0Y2hbMV1dICYmIGxheWVyU3BlY1t0cmFuc2l0aW9uTWF0Y2hbMV1dLnRyYW5zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlKHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMudHJhbnNpdGlvbixcbiAgICAgICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogc3R5bGVTcGVjXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlU3BlYyA9IG9wdGlvbnMudmFsdWVTcGVjIHx8IGxheWVyU3BlY1twcm9wZXJ0eUtleV07XG4gICAgaWYgKCF2YWx1ZVNwZWMpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGB1bmtub3duIHByb3BlcnR5IFwiJHtwcm9wZXJ0eUtleX1cImApXTtcbiAgICB9XG5cbiAgICBsZXQgdG9rZW5NYXRjaDtcbiAgICBpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICdzdHJpbmcnICYmIHZhbHVlU3BlY1sncHJvcGVydHktZnVuY3Rpb24nXSAmJiAhdmFsdWVTcGVjLnRva2VucyAmJiAodG9rZW5NYXRjaCA9IC9eeyhbXn1dKyl9JC8uZXhlYyh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgIGtleSwgdmFsdWUsXG4gICAgICAgICAgICBgXCIke3Byb3BlcnR5S2V5fVwiIGRvZXMgbm90IHN1cHBvcnQgaW50ZXJwb2xhdGlvbiBzeW50YXhcXG5gICtcbiAgICAgICAgICAgICAgICBgVXNlIGFuIGlkZW50aXR5IHByb3BlcnR5IGZ1bmN0aW9uIGluc3RlYWQ6IFxcYHsgXCJ0eXBlXCI6IFwiaWRlbnRpdHlcIiwgXCJwcm9wZXJ0eVwiOiAke0pTT04uc3RyaW5naWZ5KHRva2VuTWF0Y2hbMV0pfSB9XFxgLmApXTtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcblxuICAgIGlmIChvcHRpb25zLmxheWVyVHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgaWYgKHByb3BlcnR5S2V5ID09PSAndGV4dC1maWVsZCcgJiYgc3R5bGUgJiYgIXN0eWxlLmdseXBocykge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAndXNlIG9mIFwidGV4dC1maWVsZFwiIHJlcXVpcmVzIGEgc3R5bGUgXCJnbHlwaHNcIiBwcm9wZXJ0eScpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHlLZXkgPT09ICd0ZXh0LWZvbnQnICYmIGlzRnVuY3Rpb24odW5idW5kbGUuZGVlcCh2YWx1ZSkpICYmIHVuYnVuZGxlKHZhbHVlLnR5cGUpID09PSAnaWRlbnRpdHknKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdcInRleHQtZm9udFwiIGRvZXMgbm90IHN1cHBvcnQgaWRlbnRpdHkgZnVuY3Rpb25zJykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycy5jb25jYXQodmFsaWRhdGUoe1xuICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIHZhbHVlU3BlYzogdmFsdWVTcGVjLFxuICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgIHN0eWxlU3BlYzogc3R5bGVTcGVjLFxuICAgICAgICBleHByZXNzaW9uQ29udGV4dDogJ3Byb3BlcnR5JyxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICB9KSk7XG59O1xuIiwiXG5jb25zdCBWYWxpZGF0aW9uRXJyb3IgPSByZXF1aXJlKCcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJyk7XG5jb25zdCB1bmJ1bmRsZSA9IHJlcXVpcmUoJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQnKTtcbmNvbnN0IHZhbGlkYXRlT2JqZWN0ID0gcmVxdWlyZSgnLi92YWxpZGF0ZV9vYmplY3QnKTtcbmNvbnN0IHZhbGlkYXRlRW51bSA9IHJlcXVpcmUoJy4vdmFsaWRhdGVfZW51bScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZhbGlkYXRlU291cmNlKG9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuXG4gICAgaWYgKCF2YWx1ZS50eXBlKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAnXCJ0eXBlXCIgaXMgcmVxdWlyZWQnKV07XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9IHVuYnVuZGxlKHZhbHVlLnR5cGUpO1xuICAgIGxldCBlcnJvcnMgPSBbXTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3ZlY3Rvcic6XG4gICAgY2FzZSAncmFzdGVyJzpcbiAgICBjYXNlICdyYXN0ZXItZGVtJzpcbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjW2Bzb3VyY2VfJHt0eXBlLnJlcGxhY2UoJy0nLCAnXycpfWBdLFxuICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IHN0eWxlU3BlY1xuICAgICAgICB9KSk7XG4gICAgICAgIGlmICgndXJsJyBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKFsndHlwZScsICd1cmwnLCAndGlsZVNpemUnXS5pbmRleE9mKHByb3ApIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGAke2tleX0uJHtwcm9wfWAsIHZhbHVlW3Byb3BdLCBgYSBzb3VyY2Ugd2l0aCBhIFwidXJsXCIgcHJvcGVydHkgbWF5IG5vdCBpbmNsdWRlIGEgXCIke3Byb3B9XCIgcHJvcGVydHlgKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcnJvcnM7XG5cbiAgICBjYXNlICdnZW9qc29uJzpcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuc291cmNlX2dlb2pzb24sXG4gICAgICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IHN0eWxlU3BlY1xuICAgICAgICB9KTtcblxuICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuc291cmNlX3ZpZGVvLFxuICAgICAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjOiBzdHlsZVNwZWNcbiAgICAgICAgfSk7XG5cbiAgICBjYXNlICdpbWFnZSc6XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLnNvdXJjZV9pbWFnZSxcbiAgICAgICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogc3R5bGVTcGVjXG4gICAgICAgIH0pO1xuXG4gICAgY2FzZSAnY2FudmFzJzpcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuc291cmNlX2NhbnZhcyxcbiAgICAgICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogc3R5bGVTcGVjXG4gICAgICAgIH0pO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlRW51bSh7XG4gICAgICAgICAgICBrZXk6IGAke2tleX0udHlwZWAsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUudHlwZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzoge3ZhbHVlczogWyd2ZWN0b3InLCAncmFzdGVyJywgJ3Jhc3Rlci1kZW0nLCAnZ2VvanNvbicsICd2aWRlbycsICdpbWFnZScsICdjYW52YXMnXX0sXG4gICAgICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IHN0eWxlU3BlY1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuIiwiXG5jb25zdCBnZXRUeXBlID0gcmVxdWlyZSgnLi4vdXRpbC9nZXRfdHlwZScpO1xuY29uc3QgVmFsaWRhdGlvbkVycm9yID0gcmVxdWlyZSgnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZhbGlkYXRlU3RyaW5nKG9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3QgdHlwZSA9IGdldFR5cGUodmFsdWUpO1xuXG4gICAgaWYgKHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgc3RyaW5nIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn07XG4iLCJcbmNvbnN0IHZhbGlkYXRlQ29uc3RhbnRzID0gcmVxdWlyZSgnLi92YWxpZGF0ZS92YWxpZGF0ZV9jb25zdGFudHMnKTtcbmNvbnN0IHZhbGlkYXRlID0gcmVxdWlyZSgnLi92YWxpZGF0ZS92YWxpZGF0ZScpO1xuY29uc3QgbGF0ZXN0U3R5bGVTcGVjID0gcmVxdWlyZSgnLi9yZWZlcmVuY2UvbGF0ZXN0Jyk7XG5jb25zdCB2YWxpZGF0ZUdseXBoc1VSTCA9IHJlcXVpcmUoJy4vdmFsaWRhdGUvdmFsaWRhdGVfZ2x5cGhzX3VybCcpO1xuXG4vKipcbiAqIFZhbGlkYXRlIGEgTWFwYm94IEdMIHN0eWxlIGFnYWluc3QgdGhlIHN0eWxlIHNwZWNpZmljYXRpb24uIFRoaXMgZW50cnlwb2ludCxcbiAqIGBtYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGVfc3R5bGUubWluYCwgaXMgZGVzaWduZWQgdG8gcHJvZHVjZSBhc1xuICogc21hbGwgYSBicm93c2VyaWZ5IGJ1bmRsZSBhcyBwb3NzaWJsZSBieSBvbWl0dGluZyB1bm5lY2Vzc2FyeSBmdW5jdGlvbmFsaXR5XG4gKiBhbmQgbGVnYWN5IHN0eWxlIHNwZWNpZmljYXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc3R5bGUgVGhlIHN0eWxlIHRvIGJlIHZhbGlkYXRlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3R5bGVTcGVjXSBUaGUgc3R5bGUgc3BlY2lmaWNhdGlvbiB0byB2YWxpZGF0ZSBhZ2FpbnN0LlxuICogICAgIElmIG9taXR0ZWQsIHRoZSBsYXRlc3Qgc3R5bGUgc3BlYyBpcyB1c2VkLlxuICogQHJldHVybnMge0FycmF5PFZhbGlkYXRpb25FcnJvcj59XG4gKiBAZXhhbXBsZVxuICogICB2YXIgdmFsaWRhdGUgPSByZXF1aXJlKCdtYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGVfc3R5bGUubWluJyk7XG4gKiAgIHZhciBlcnJvcnMgPSB2YWxpZGF0ZShzdHlsZSk7XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU3R5bGVNaW4oc3R5bGUsIHN0eWxlU3BlYykge1xuICAgIHN0eWxlU3BlYyA9IHN0eWxlU3BlYyB8fCBsYXRlc3RTdHlsZVNwZWM7XG5cbiAgICBsZXQgZXJyb3JzID0gW107XG5cbiAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAga2V5OiAnJyxcbiAgICAgICAgdmFsdWU6IHN0eWxlLFxuICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy4kcm9vdCxcbiAgICAgICAgc3R5bGVTcGVjOiBzdHlsZVNwZWMsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHtcbiAgICAgICAgICAgIGdseXBoczogdmFsaWRhdGVHbHlwaHNVUkwsXG4gICAgICAgICAgICAnKic6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pKTtcblxuICAgIGlmIChzdHlsZS5jb25zdGFudHMpIHtcbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUNvbnN0YW50cyh7XG4gICAgICAgICAgICBrZXk6ICdjb25zdGFudHMnLFxuICAgICAgICAgICAgdmFsdWU6IHN0eWxlLmNvbnN0YW50cyxcbiAgICAgICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogc3R5bGVTcGVjXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydEVycm9ycyhlcnJvcnMpO1xufVxuXG52YWxpZGF0ZVN0eWxlTWluLnNvdXJjZSA9IHdyYXBDbGVhbkVycm9ycyhyZXF1aXJlKCcuL3ZhbGlkYXRlL3ZhbGlkYXRlX3NvdXJjZScpKTtcbnZhbGlkYXRlU3R5bGVNaW4ubGlnaHQgPSB3cmFwQ2xlYW5FcnJvcnMocmVxdWlyZSgnLi92YWxpZGF0ZS92YWxpZGF0ZV9saWdodCcpKTtcbnZhbGlkYXRlU3R5bGVNaW4ubGF5ZXIgPSB3cmFwQ2xlYW5FcnJvcnMocmVxdWlyZSgnLi92YWxpZGF0ZS92YWxpZGF0ZV9sYXllcicpKTtcbnZhbGlkYXRlU3R5bGVNaW4uZmlsdGVyID0gd3JhcENsZWFuRXJyb3JzKHJlcXVpcmUoJy4vdmFsaWRhdGUvdmFsaWRhdGVfZmlsdGVyJykpO1xudmFsaWRhdGVTdHlsZU1pbi5wYWludFByb3BlcnR5ID0gd3JhcENsZWFuRXJyb3JzKHJlcXVpcmUoJy4vdmFsaWRhdGUvdmFsaWRhdGVfcGFpbnRfcHJvcGVydHknKSk7XG52YWxpZGF0ZVN0eWxlTWluLmxheW91dFByb3BlcnR5ID0gd3JhcENsZWFuRXJyb3JzKHJlcXVpcmUoJy4vdmFsaWRhdGUvdmFsaWRhdGVfbGF5b3V0X3Byb3BlcnR5JykpO1xuXG5mdW5jdGlvbiBzb3J0RXJyb3JzKGVycm9ycykge1xuICAgIHJldHVybiBbXS5jb25jYXQoZXJyb3JzKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIHJldHVybiBhLmxpbmUgLSBiLmxpbmU7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHdyYXBDbGVhbkVycm9ycyhpbm5lcikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHNvcnRFcnJvcnMoaW5uZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2YWxpZGF0ZVN0eWxlTWluO1xuIiwiLy8gICAgICBcblxuY29uc3QgWm9vbUhpc3RvcnkgPSByZXF1aXJlKCcuL3pvb21faGlzdG9yeScpO1xuXG5jbGFzcyBFdmFsdWF0aW9uUGFyYW1ldGVycyB7XG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKHpvb20gICAgICAgICwgb3B0aW9ucyAgICApIHtcbiAgICAgICAgdGhpcy56b29tID0gem9vbTtcblxuICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5ub3cgPSBvcHRpb25zLm5vdztcbiAgICAgICAgICAgIHRoaXMuZmFkZUR1cmF0aW9uID0gb3B0aW9ucy5mYWRlRHVyYXRpb247XG4gICAgICAgICAgICB0aGlzLnpvb21IaXN0b3J5ID0gb3B0aW9ucy56b29tSGlzdG9yeTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IG9wdGlvbnMudHJhbnNpdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubm93ID0gMDtcbiAgICAgICAgICAgIHRoaXMuZmFkZUR1cmF0aW9uID0gMDtcbiAgICAgICAgICAgIHRoaXMuem9vbUhpc3RvcnkgPSBuZXcgWm9vbUhpc3RvcnkoKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IHt9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3Jvc3NGYWRpbmdGYWN0b3IoKSB7XG4gICAgICAgIGlmICh0aGlzLmZhZGVEdXJhdGlvbiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4oKHRoaXMubm93IC0gdGhpcy56b29tSGlzdG9yeS5sYXN0SW50ZWdlclpvb21UaW1lKSAvIHRoaXMuZmFkZUR1cmF0aW9uLCAxKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBFdmFsdWF0aW9uUGFyYW1ldGVycztcbiIsIi8vICAgICAgXG5cbmNvbnN0IHN0eWxlU3BlYyA9IHJlcXVpcmUoJy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdCcpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuY29uc3QgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xuY29uc3QgdmFsaWRhdGVTdHlsZSA9IHJlcXVpcmUoJy4vdmFsaWRhdGVfc3R5bGUnKTtcbmNvbnN0IHtzcGhlcmljYWxUb0NhcnRlc2lhbn0gPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbmNvbnN0IENvbG9yID0gcmVxdWlyZSgnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yJyk7XG5jb25zdCBpbnRlcnBvbGF0ZSA9IHJlcXVpcmUoJy4uL3N0eWxlLXNwZWMvdXRpbC9pbnRlcnBvbGF0ZScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNvbnN0IHtcbiAgICBQcm9wZXJ0aWVzLFxuICAgIFRyYW5zaXRpb25hYmxlLFxuICAgIFRyYW5zaXRpb25pbmcsXG4gICAgUG9zc2libHlFdmFsdWF0ZWQsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHlcbn0gPSByZXF1aXJlKCcuL3Byb3BlcnRpZXMnKTtcblxuICAgICAgICAgICAgIFxuICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgXG4gIFxuXG5jbGFzcyBMaWdodFBvc2l0aW9uUHJvcGVydHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnNwZWNpZmljYXRpb24gPSBzdHlsZVNwZWMubGlnaHQucG9zaXRpb247XG4gICAgfVxuXG4gICAgcG9zc2libHlFdmFsdWF0ZSh2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAge1xuICAgICAgICByZXR1cm4gc3BoZXJpY2FsVG9DYXJ0ZXNpYW4odmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShwYXJhbWV0ZXJzKSk7XG4gICAgfVxuXG4gICAgaW50ZXJwb2xhdGUoYSAgICAgICAgICAgICAgICwgYiAgICAgICAgICAgICAgICwgdCAgICAgICAgKSAgICAgICAgICAgICAgICB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBpbnRlcnBvbGF0ZS5udW1iZXIoYS54LCBiLngsIHQpLFxuICAgICAgICAgICAgeTogaW50ZXJwb2xhdGUubnVtYmVyKGEueSwgYi55LCB0KSxcbiAgICAgICAgICAgIHo6IGludGVycG9sYXRlLm51bWJlcihhLnosIGIueiwgdCksXG4gICAgICAgIH07XG4gICAgfVxufVxuXG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgXG5cbmNvbnN0IHByb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiYW5jaG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWMubGlnaHQuYW5jaG9yKSxcbiAgICBcInBvc2l0aW9uXCI6IG5ldyBMaWdodFBvc2l0aW9uUHJvcGVydHkoKSxcbiAgICBcImNvbG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWMubGlnaHQuY29sb3IpLFxuICAgIFwiaW50ZW5zaXR5XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWMubGlnaHQuaW50ZW5zaXR5KSxcbn0pO1xuXG5jb25zdCBUUkFOU0lUSU9OX1NVRkZJWCA9ICctdHJhbnNpdGlvbic7XG5cbi8qXG4gKiBSZXByZXNlbnRzIHRoZSBsaWdodCB1c2VkIHRvIGxpZ2h0IGV4dHJ1ZGVkIGZlYXR1cmVzLlxuICovXG5jbGFzcyBMaWdodCBleHRlbmRzIEV2ZW50ZWQge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihsaWdodE9wdGlvbnMgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmFibGUgPSBuZXcgVHJhbnNpdGlvbmFibGUocHJvcGVydGllcyk7XG4gICAgICAgIHRoaXMuc2V0TGlnaHQobGlnaHRPcHRpb25zKTtcbiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmluZyA9IHRoaXMuX3RyYW5zaXRpb25hYmxlLnVudHJhbnNpdGlvbmVkKCk7XG4gICAgfVxuXG4gICAgZ2V0TGlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uYWJsZS5zZXJpYWxpemUoKTtcbiAgICB9XG5cbiAgICBzZXRMaWdodChvcHRpb25zICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLmxpZ2h0LCBvcHRpb25zKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9uc1tuYW1lXTtcbiAgICAgICAgICAgIGlmICh1dGlsLmVuZHNXaXRoKG5hbWUsIFRSQU5TSVRJT05fU1VGRklYKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25hYmxlLnNldFRyYW5zaXRpb24obmFtZS5zbGljZSgwLCAtVFJBTlNJVElPTl9TVUZGSVgubGVuZ3RoKSwgdmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVUcmFuc2l0aW9ucyhwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLl90cmFuc2l0aW9uaW5nID0gdGhpcy5fdHJhbnNpdGlvbmFibGUudHJhbnNpdGlvbmVkKHBhcmFtZXRlcnMsIHRoaXMuX3RyYW5zaXRpb25pbmcpO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uaW5nLmhhc1RyYW5zaXRpb24oKTtcbiAgICB9XG5cbiAgICByZWNhbGN1bGF0ZShwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSB0aGlzLl90cmFuc2l0aW9uaW5nLnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlKHZhbGlkYXRlLCB2YWx1ZSAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3R5bGUuZW1pdEVycm9ycyh0aGlzLCB2YWxpZGF0ZS5jYWxsKHZhbGlkYXRlU3R5bGUsIHV0aWwuZXh0ZW5kKHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yNDA3XG4gICAgICAgICAgICBzdHlsZToge2dseXBoczogdHJ1ZSwgc3ByaXRlOiB0cnVlfSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogc3R5bGVTcGVjXG4gICAgICAgIH0pKSk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IExpZ2h0O1xuIiwiLy8gICAgICBcblxuY29uc3Qge25vcm1hbGl6ZUdseXBoc1VSTH0gPSByZXF1aXJlKCcuLi91dGlsL21hcGJveCcpO1xuY29uc3QgYWpheCA9IHJlcXVpcmUoJy4uL3V0aWwvYWpheCcpO1xuY29uc3QgcGFyc2VHbHlwaFBCRiA9IHJlcXVpcmUoJy4vcGFyc2VfZ2x5cGhfcGJmJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm9udHN0YWNrICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsVGVtcGxhdGUgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUcmFuc2Zvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICBjb25zdCBiZWdpbiA9IHJhbmdlICogMjU2O1xuICAgIGNvbnN0IGVuZCA9IGJlZ2luICsgMjU1O1xuXG4gICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RUcmFuc2Zvcm0oXG4gICAgICAgIG5vcm1hbGl6ZUdseXBoc1VSTCh1cmxUZW1wbGF0ZSlcbiAgICAgICAgICAgIC5yZXBsYWNlKCd7Zm9udHN0YWNrfScsIGZvbnRzdGFjaylcbiAgICAgICAgICAgIC5yZXBsYWNlKCd7cmFuZ2V9JywgYCR7YmVnaW59LSR7ZW5kfWApLFxuICAgICAgICBhamF4LlJlc291cmNlVHlwZS5HbHlwaHMpO1xuXG4gICAgYWpheC5nZXRBcnJheUJ1ZmZlcihyZXF1ZXN0LCAoZXJyLCByZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBjb25zdCBnbHlwaHMgPSB7fTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBnbHlwaCBvZiBwYXJzZUdseXBoUEJGKHJlc3BvbnNlLmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgZ2x5cGhzW2dseXBoLmlkXSA9IGdseXBoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBnbHlwaHMpO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuIiwiLy8gICAgICBcblxuY29uc3QgYWpheCA9IHJlcXVpcmUoJy4uL3V0aWwvYWpheCcpO1xuY29uc3QgYnJvd3NlciA9IHJlcXVpcmUoJy4uL3V0aWwvYnJvd3NlcicpO1xuY29uc3Qge25vcm1hbGl6ZVNwcml0ZVVSTH0gPSByZXF1aXJlKCcuLi91dGlsL21hcGJveCcpO1xuY29uc3Qge1JHQkFJbWFnZX0gPSByZXF1aXJlKCcuLi91dGlsL2ltYWdlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihiYXNlVVJMICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybVJlcXVlc3RDYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICBsZXQganNvbiAgICAgLCBpbWFnZSwgZXJyb3I7XG4gICAgY29uc3QgZm9ybWF0ID0gYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvID4gMSA/ICdAMngnIDogJyc7XG5cbiAgICBhamF4LmdldEpTT04odHJhbnNmb3JtUmVxdWVzdENhbGxiYWNrKG5vcm1hbGl6ZVNwcml0ZVVSTChiYXNlVVJMLCBmb3JtYXQsICcuanNvbicpLCBhamF4LlJlc291cmNlVHlwZS5TcHJpdGVKU09OKSwgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgICAgIGpzb24gPSBkYXRhO1xuICAgICAgICAgICAgbWF5YmVDb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBhamF4LmdldEltYWdlKHRyYW5zZm9ybVJlcXVlc3RDYWxsYmFjayhub3JtYWxpemVTcHJpdGVVUkwoYmFzZVVSTCwgZm9ybWF0LCAnLnBuZycpLCBhamF4LlJlc291cmNlVHlwZS5TcHJpdGVJbWFnZSksIChlcnIsIGltZykgPT4ge1xuICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgICAgIGltYWdlID0gaW1nO1xuICAgICAgICAgICAgbWF5YmVDb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBtYXliZUNvbXBsZXRlKCkge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgfSBlbHNlIGlmIChqc29uICYmIGltYWdlKSB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZURhdGEgPSBicm93c2VyLmdldEltYWdlRGF0YShpbWFnZSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiBqc29uKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHQsIHgsIHksIHNkZiwgcGl4ZWxSYXRpb30gPSBqc29uW2lkXTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gbmV3IFJHQkFJbWFnZSh7d2lkdGgsIGhlaWdodH0pO1xuICAgICAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KGltYWdlRGF0YSwgZGF0YSwge3gsIHl9LCB7eDogMCwgeTogMH0sIHt3aWR0aCwgaGVpZ2h0fSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2lkXSA9IHtkYXRhLCBwaXhlbFJhdGlvLCBzZGZ9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgfVxufTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IHtBbHBoYUltYWdlfSA9IHJlcXVpcmUoJy4uL3V0aWwvaW1hZ2UnKTtcbmNvbnN0IFByb3RvYnVmID0gcmVxdWlyZSgncGJmJyk7XG5jb25zdCBib3JkZXIgPSAzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmZ1bmN0aW9uIHJlYWRGb250c3RhY2tzKHRhZyAgICAgICAgLCBnbHlwaHMgICAgICAgICAgICAgICAgICAgLCBwYmYgICAgICAgICAgKSB7XG4gICAgaWYgKHRhZyA9PT0gMSkge1xuICAgICAgICBwYmYucmVhZE1lc3NhZ2UocmVhZEZvbnRzdGFjaywgZ2x5cGhzKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRGb250c3RhY2sodGFnICAgICAgICAsIGdseXBocyAgICAgICAgICAgICAgICAgICAsIHBiZiAgICAgICAgICApIHtcbiAgICBpZiAodGFnID09PSAzKSB7XG4gICAgICAgIGNvbnN0IHtpZCwgYml0bWFwLCB3aWR0aCwgaGVpZ2h0LCBsZWZ0LCB0b3AsIGFkdmFuY2V9ID0gcGJmLnJlYWRNZXNzYWdlKHJlYWRHbHlwaCwge30pO1xuICAgICAgICBnbHlwaHMucHVzaCh7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGJpdG1hcDogbmV3IEFscGhhSW1hZ2Uoe1xuICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCArIDIgKiBib3JkZXIsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgKyAyICogYm9yZGVyXG4gICAgICAgICAgICB9LCBiaXRtYXApLFxuICAgICAgICAgICAgbWV0cmljczoge3dpZHRoLCBoZWlnaHQsIGxlZnQsIHRvcCwgYWR2YW5jZX1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZWFkR2x5cGgodGFnICAgICAgICAsIGdseXBoICAgICAgICAsIHBiZiAgICAgICAgICApIHtcbiAgICBpZiAodGFnID09PSAxKSBnbHlwaC5pZCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAyKSBnbHlwaC5iaXRtYXAgPSBwYmYucmVhZEJ5dGVzKCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAzKSBnbHlwaC53aWR0aCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSA0KSBnbHlwaC5oZWlnaHQgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNSkgZ2x5cGgubGVmdCA9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNikgZ2x5cGgudG9wID0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSA3KSBnbHlwaC5hZHZhbmNlID0gcGJmLnJlYWRWYXJpbnQoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAge1xuICAgIHJldHVybiBuZXcgUHJvdG9idWYoZGF0YSkucmVhZEZpZWxkcyhyZWFkRm9udHN0YWNrcywgW10pO1xufTtcblxubW9kdWxlLmV4cG9ydHMuR0xZUEhfUEJGX0JPUkRFUiA9IGJvcmRlcjtcbiIsIi8vICAgICAgXG5cbmNvbnN0IGJyb3dzZXIgPSByZXF1aXJlKCcuLi91dGlsL2Jyb3dzZXInKTtcbmNvbnN0IFBsYWNlbWVudCA9IHJlcXVpcmUoJy4uL3N5bWJvbC9wbGFjZW1lbnQnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jbGFzcyBMYXllclBsYWNlbWVudCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFRpbGVJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuX3NlZW5Dcm9zc1RpbGVJRHMgPSB7fTtcbiAgICB9XG5cbiAgICBjb250aW51ZVBsYWNlbWVudCh0aWxlcyAgICAgICAgICAgICAsIHBsYWNlbWVudCAgICAgICAgICAgLCBzaG93Q29sbGlzaW9uQm94ZXMgICAgICAgICAsIHN0eWxlTGF5ZXIgICAgICAgICAgICAsIHNob3VsZFBhdXNlUGxhY2VtZW50KSB7XG4gICAgICAgIHdoaWxlICh0aGlzLl9jdXJyZW50VGlsZUluZGV4IDwgdGlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGlsZXNbdGhpcy5fY3VycmVudFRpbGVJbmRleF07XG4gICAgICAgICAgICBwbGFjZW1lbnQucGxhY2VMYXllclRpbGUoc3R5bGVMYXllciwgdGlsZSwgc2hvd0NvbGxpc2lvbkJveGVzLCB0aGlzLl9zZWVuQ3Jvc3NUaWxlSURzKTtcblxuICAgICAgICAgICAgdGhpcy5fY3VycmVudFRpbGVJbmRleCsrO1xuICAgICAgICAgICAgaWYgKHNob3VsZFBhdXNlUGxhY2VtZW50KCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgUGF1c2VhYmxlUGxhY2VtZW50IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKHRyYW5zZm9ybSAgICAgICAgICAgLCBvcmRlciAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgIGZvcmNlRnVsbFBsYWNlbWVudCAgICAgICAgICwgc2hvd0NvbGxpc2lvbkJveGVzICAgICAgICAgLCBmYWRlRHVyYXRpb24gICAgICAgICkge1xuXG4gICAgICAgIHRoaXMucGxhY2VtZW50ID0gbmV3IFBsYWNlbWVudCh0cmFuc2Zvcm0sIGZhZGVEdXJhdGlvbik7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRQbGFjZW1lbnRJbmRleCA9IG9yZGVyLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMuX2ZvcmNlRnVsbFBsYWNlbWVudCA9IGZvcmNlRnVsbFBsYWNlbWVudDtcbiAgICAgICAgdGhpcy5fc2hvd0NvbGxpc2lvbkJveGVzID0gc2hvd0NvbGxpc2lvbkJveGVzO1xuICAgICAgICB0aGlzLl9kb25lID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaXNEb25lKCkgICAgICAgICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9uZTtcbiAgICB9XG5cbiAgICBjb250aW51ZVBsYWNlbWVudChvcmRlciAgICAgICAgICAgICAgICwgbGF5ZXJzICAgICAgICAgICAgICAgICAgICAgICAgLCBsYXllclRpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBicm93c2VyLm5vdygpO1xuXG4gICAgICAgIGNvbnN0IHNob3VsZFBhdXNlUGxhY2VtZW50ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxhcHNlZFRpbWUgPSBicm93c2VyLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZvcmNlRnVsbFBsYWNlbWVudCA/IGZhbHNlIDogZWxhcHNlZFRpbWUgPiAyO1xuICAgICAgICB9O1xuXG4gICAgICAgIHdoaWxlICh0aGlzLl9jdXJyZW50UGxhY2VtZW50SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJJZCA9IG9yZGVyW3RoaXMuX2N1cnJlbnRQbGFjZW1lbnRJbmRleF07XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IGxheWVyc1tsYXllcklkXTtcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlbWVudFpvb20gPSB0aGlzLnBsYWNlbWVudC5jb2xsaXNpb25JbmRleC50cmFuc2Zvcm0uem9vbTtcbiAgICAgICAgICAgIGlmIChsYXllci50eXBlID09PSAnc3ltYm9sJyAmJlxuICAgICAgICAgICAgICAgICghbGF5ZXIubWluem9vbSB8fCBsYXllci5taW56b29tIDw9IHBsYWNlbWVudFpvb20pICYmXG4gICAgICAgICAgICAgICAgKCFsYXllci5tYXh6b29tIHx8IGxheWVyLm1heHpvb20gPiBwbGFjZW1lbnRab29tKSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pblByb2dyZXNzTGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5Qcm9ncmVzc0xheWVyID0gbmV3IExheWVyUGxhY2VtZW50KCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcGF1c2VQbGFjZW1lbnQgPSB0aGlzLl9pblByb2dyZXNzTGF5ZXIuY29udGludWVQbGFjZW1lbnQobGF5ZXJUaWxlc1tsYXllci5zb3VyY2VdLCB0aGlzLnBsYWNlbWVudCwgdGhpcy5fc2hvd0NvbGxpc2lvbkJveGVzLCBsYXllciwgc2hvdWxkUGF1c2VQbGFjZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBhdXNlUGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGRpZG4ndCBmaW5pc2ggcGxhY2luZyBhbGwgbGF5ZXJzIHdpdGhpbiAybXMsXG4gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBjYW4ga2VlcCByZW5kZXJpbmcgd2l0aCBhIHBhcnRpYWwgcGxhY2VtZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlJ2xsIHJlc3VtZSBoZXJlIG9uIHRoZSBuZXh0IGZyYW1lXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5faW5Qcm9ncmVzc0xheWVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50UGxhY2VtZW50SW5kZXgtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbW1pdChwcmV2aW91c1BsYWNlbWVudCAgICAgICAgICAgICwgbm93ICAgICAgICApIHtcbiAgICAgICAgdGhpcy5wbGFjZW1lbnQuY29tbWl0KHByZXZpb3VzUGxhY2VtZW50LCBub3cpO1xuICAgICAgICByZXR1cm4gdGhpcy5wbGFjZW1lbnQ7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFBhdXNlYWJsZVBsYWNlbWVudDtcbiIsIi8vICAgICAgXG5cbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuY29uc3Qge2Nsb25lLCBleHRlbmQsIGVhc2VDdWJpY0luT3V0fSA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuY29uc3QgaW50ZXJwb2xhdGUgPSByZXF1aXJlKCcuLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGUnKTtcbmNvbnN0IHtub3JtYWxpemVQcm9wZXJ0eUV4cHJlc3Npb259ID0gcmVxdWlyZSgnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uJyk7XG5jb25zdCBDb2xvciA9IHJlcXVpcmUoJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcicpO1xuY29uc3Qge3JlZ2lzdGVyfSA9IHJlcXVpcmUoJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2ZlcicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4vKipcbiAqIEltcGxlbWVudHMgYSBudW1iZXIgb2YgY2xhc3NlcyB0aGF0IGRlZmluZSBzdGF0ZSBhbmQgYmVoYXZpb3IgZm9yIHBhaW50IGFuZCBsYXlvdXQgcHJvcGVydGllcywgbW9zdFxuICogaW1wb3J0YW50bHkgdGhlaXIgcmVzcGVjdGl2ZSBldmFsdWF0aW9uIGNoYWluczpcbiAqXG4gKiAgICAgICBUcmFuc2l0aW9uYWJsZSBwYWludCBwcm9wZXJ0eSB2YWx1ZVxuICogICAgIOKGkiBUcmFuc2l0aW9uaW5nIHBhaW50IHByb3BlcnR5IHZhbHVlXG4gKiAgICAg4oaSIFBvc3NpYmx5IGV2YWx1YXRlZCBwYWludCBwcm9wZXJ0eSB2YWx1ZVxuICogICAgIOKGkiBGdWxseSBldmFsdWF0ZWQgcGFpbnQgcHJvcGVydHkgdmFsdWVcbiAqXG4gKiAgICAgICBMYXlvdXQgcHJvcGVydHkgdmFsdWVcbiAqICAgICDihpIgUG9zc2libHkgZXZhbHVhdGVkIGxheW91dCBwcm9wZXJ0eSB2YWx1ZVxuICogICAgIOKGkiBGdWxseSBldmFsdWF0ZWQgbGF5b3V0IHByb3BlcnR5IHZhbHVlXG4gKlxuICogQG1vZHVsZVxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqICBJbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGBQcm9wZXJ0eWAgaW50ZXJmYWNlOlxuICpcbiAqICAqIEhvbGQgbWV0YWRhdGEgYWJvdXQgYSBwcm9wZXJ0eSB0aGF0J3MgaW5kZXBlbmRlbnQgb2YgYW55IHNwZWNpZmljIHZhbHVlOiBzdHVmZiBsaWtlIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSxcbiAqICAgIHRoZSBkZWZhdWx0IHZhbHVlLCBldGMuIFRoaXMgY29tZXMgZnJvbSB0aGUgc3R5bGUgc3BlY2lmaWNhdGlvbiBKU09OLlxuICogICogRGVmaW5lIGJlaGF2aW9yIHRoYXQgbmVlZHMgdG8gYmUgcG9seW1vcnBoaWMgYWNyb3NzIGRpZmZlcmVudCBwcm9wZXJ0aWVzOiBcInBvc3NpYmx5IGV2YWx1YXRpbmdcIlxuICogICAgYW4gaW5wdXQgdmFsdWUgKHNlZSBiZWxvdyksIGFuZCBpbnRlcnBvbGF0aW5nIGJldHdlZW4gdHdvIHBvc3NpYmx5LWV2YWx1dGVkIHZhbHVlcy5cbiAqXG4gKiAgVGhlIHR5cGUgYFRgIGlzIHRoZSBmdWxseS1ldmFsdWF0ZWQgdmFsdWUgdHlwZSAoZS5nLiBgbnVtYmVyYCwgYHN0cmluZ2AsIGBDb2xvcmApLlxuICogIFRoZSB0eXBlIGBSYCBpcyB0aGUgaW50ZXJtZWRpYXRlIFwicG9zc2libHkgZXZhbHVhdGVkXCIgdmFsdWUgdHlwZS4gU2VlIGJlbG93LlxuICpcbiAqICBUaGVyZSBhcmUgdHdvIG1haW4gaW1wbGVtZW50YXRpb25zIG9mIHRoZSBpbnRlcmZhY2UgLS0gb25lIGZvciBwcm9wZXJ0aWVzIHRoYXQgYWxsb3cgZGF0YS1kcml2ZW4gdmFsdWVzLFxuICogIGFuZCBvbmUgZm9yIHByb3BlcnRpZXMgdGhhdCBkb24ndC4gVGhlcmUgYXJlIGEgZmV3IFwic3BlY2lhbCBjYXNlXCIgaW1wbGVtZW50YXRpb25zIGFzIHdlbGw6IG9uZSBmb3IgcHJvcGVydGllc1xuICogIHdoaWNoIGNyb3NzLWZhZGUgYmV0d2VlbiB0d28gdmFsdWVzIHJhdGhlciB0aGFuIGludGVycG9sYXRpbmcsIG9uZSBmb3IgYGhlYXRtYXAtY29sb3JgLCBhbmQgb25lIGZvclxuICogIGBsaWdodC1wb3NpdGlvbmAuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gXG5cbi8qKlxuICogIGBQcm9wZXJ0eVZhbHVlYCByZXByZXNlbnRzIHRoZSB2YWx1ZSBwYXJ0IG9mIGEgcHJvcGVydHkga2V5LXZhbHVlIHVuaXQuIEl0J3MgdXNlZCB0byByZXByZXNlbnQgYm90aFxuICogIHBhaW50IGFuZCBsYXlvdXQgcHJvcGVydHkgdmFsdWVzLCBhbmQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGVpciBwcm9wZXJ0eSBzdXBwb3J0cyBkYXRhLWRyaXZlblxuICogIGV4cHJlc3Npb25zLlxuICpcbiAqICBgUHJvcGVydHlWYWx1ZWAgc3RvcmVzIHRoZSByYXcgaW5wdXQgdmFsdWUgYXMgc2VlbiBpbiBhIHN0eWxlIG9yIGEgcnVudGltZSBzdHlsaW5nIEFQSSBjYWxsLCBpLmUuIG9uZSBvZiB0aGVcbiAqICBmb2xsb3dpbmc6XG4gKlxuICogICAgKiBBIGNvbnN0YW50IHZhbHVlIG9mIHRoZSB0eXBlIGFwcHJvcHJpYXRlIGZvciB0aGUgcHJvcGVydHlcbiAqICAgICogQSBmdW5jdGlvbiB3aGljaCBwcm9kdWNlcyBhIHZhbHVlIG9mIHRoYXQgdHlwZSAoYnV0IGZ1bmN0aW9ucyBhcmUgcXVhc2ktZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBleHByZXNzaW9ucylcbiAqICAgICogQW4gZXhwcmVzc2lvbiB3aGljaCBwcm9kdWNlcyBhIHZhbHVlIG9mIHRoYXQgdHlwZVxuICogICAgKiBcInVuZGVmaW5lZFwiL1wibm90IHByZXNlbnRcIiwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvcGVydHkgaXMgYXNzdW1lZCB0byB0YWtlIG9uIGl0cyBkZWZhdWx0IHZhbHVlLlxuICpcbiAqICBJbiBhZGRpdGlvbiB0byBzdG9yaW5nIHRoZSBvcmlnaW5hbCBpbnB1dCB2YWx1ZSwgYFByb3BlcnR5VmFsdWVgIGFsc28gc3RvcmVzIGEgbm9ybWFsaXplZCByZXByZXNlbnRhdGlvbixcbiAqICBlZmZlY3RpdmVseSB0cmVhdGluZyBmdW5jdGlvbnMgYXMgaWYgdGhleSBhcmUgZXhwcmVzc2lvbnMsIGFuZCBjb25zdGFudCBvciBkZWZhdWx0IHZhbHVlcyBhcyBpZiB0aGV5IGFyZVxuICogIChjb25zdGFudCkgZXhwcmVzc2lvbnMuXG4gKlxuICogIEBwcml2YXRlXG4gKi9cbmNsYXNzIFByb3BlcnR5VmFsdWUgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IocHJvcGVydHkgICAgICAgICAgICAgICAgLCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBub3JtYWxpemVQcm9wZXJ0eUV4cHJlc3Npb24odmFsdWUgPT09IHVuZGVmaW5lZCA/IHByb3BlcnR5LnNwZWNpZmljYXRpb24uZGVmYXVsdCA6IHZhbHVlLCBwcm9wZXJ0eS5zcGVjaWZpY2F0aW9uKTtcbiAgICB9XG5cbiAgICBpc0RhdGFEcml2ZW4oKSAgICAgICAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24ua2luZCA9PT0gJ3NvdXJjZScgfHwgdGhpcy5leHByZXNzaW9uLmtpbmQgPT09ICdjb21wb3NpdGUnO1xuICAgIH1cblxuICAgIHBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICApICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHkucG9zc2libHlFdmFsdWF0ZSh0aGlzLCBwYXJhbWV0ZXJzKTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0gVHJhbnNpdGlvbmFibGUgLS0tLS0tLVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBcblxuLyoqXG4gKiBQYWludCBwcm9wZXJ0aWVzIGFyZSBfdHJhbnNpdGlvbmFibGVfOiB0aGV5IGNhbiBjaGFuZ2UgaW4gYSBmbHVpZCBtYW5uZXIsIGludGVycG9sYXRpbmcgb3IgY3Jvc3MtZmFkaW5nIGJldHdlZW5cbiAqIG9sZCBhbmQgbmV3IHZhbHVlLiBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24sIGFuZCB0aGUgZGVsYXkgYmVmb3JlIGl0IGJlZ2lucywgaXMgY29uZmlndXJhYmxlLlxuICpcbiAqIGBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVgIGlzIGEgY29tcG9zaXRpb25hbCBjbGFzcyB0aGF0IHN0b3JlcyBib3RoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBhbmQgdGhhdCB0cmFuc2l0aW9uXG4gKiBjb25maWd1cmF0aW9uLlxuICpcbiAqIEEgYFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZWAgY2FuIGNhbGN1bGF0ZSB0aGUgbmV4dCBzdGVwIGluIHRoZSBldmFsdWF0aW9uIGNoYWluIGZvciBwYWludCBwcm9wZXJ0eSB2YWx1ZXM6XG4gKiBgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZSAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnR5ICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXcgUHJvcGVydHlWYWx1ZShwcm9wZXJ0eSwgdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICB0cmFuc2l0aW9uZWQocGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgIHByaW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZSh0aGlzLnByb3BlcnR5LCB0aGlzLnZhbHVlLCBwcmlvciwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICAgICAgZXh0ZW5kKHt9LCBwYXJhbWV0ZXJzLnRyYW5zaXRpb24sIHRoaXMudHJhbnNpdGlvbiksIHBhcmFtZXRlcnMubm93KTtcbiAgICB9XG5cbiAgICB1bnRyYW5zaXRpb25lZCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWUodGhpcy5wcm9wZXJ0eSwgdGhpcy52YWx1ZSwgbnVsbCwge30sIDApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgfVxufVxuXG4vKipcbiAqIEEgaGVscGVyIHR5cGU6IGdpdmVuIGFuIG9iamVjdCB0eXBlIGBQcm9wZXJ0aWVzYCB3aG9zZSB2YWx1ZXMgYXJlIGVhY2ggb2YgdHlwZSBgUHJvcGVydHk8VCwgUj5gLCBpdCBjYWxjdWxhdGVzXG4gKiBhbiBvYmplY3QgdHlwZSB3aXRoIHRoZSBzYW1lIGtleXMgYW5kIHZhbHVlcyBvZiB0eXBlIGBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWU8VCwgUj5gLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuLyoqXG4gKiBgVHJhbnNpdGlvbmFibGVgIHN0b3JlcyBhIG1hcCBvZiBhbGwgKHByb3BlcnR5IG5hbWUsIGBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVgKSBwYWlycyBmb3IgcGFpbnQgcHJvcGVydGllcyBvZiBhXG4gKiBnaXZlbiBsYXllciB0eXBlLiBJdCBjYW4gY2FsY3VsYXRlIHRoZSBgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVgcyBmb3IgYWxsIG9mIHRoZW0gYXQgb25jZSwgcHJvZHVjaW5nIGFcbiAqIGBUcmFuc2l0aW9uaW5nYCBpbnN0YW5jZSBmb3IgdGhlIHNhbWUgc2V0IG9mIHByb3BlcnRpZXMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgVHJhbnNpdGlvbmFibGUgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgICAgICB0aGlzLl92YWx1ZXMgPSAoT2JqZWN0LmNyZWF0ZShwcm9wZXJ0aWVzLmRlZmF1bHRUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVzKSAgICAgKTtcbiAgICB9XG5cbiAgICBnZXRWYWx1ZSAgICAgICAgICAgICAgKG5hbWUgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICByZXR1cm4gY2xvbmUodGhpcy5fdmFsdWVzW25hbWVdLnZhbHVlLnZhbHVlKTtcbiAgICB9XG5cbiAgICBzZXRWYWx1ZSAgICAgICAgICAgICAgKG5hbWUgICAsIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKCF0aGlzLl92YWx1ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tuYW1lXSA9IG5ldyBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWUodGhpcy5fdmFsdWVzW25hbWVdLnByb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG8gbm90IF9yZW1vdmVfIGFuIG93biBwcm9wZXJ0eSBpbiB0aGUgY2FzZSB3aGVyZSBhIHZhbHVlIGlzIGJlaW5nIHJlc2V0XG4gICAgICAgIC8vIHRvIHRoZSBkZWZhdWx0OiB0aGUgdHJhbnNpdGlvbiBtaWdodCBzdGlsbCBiZSBub24tZGVmYXVsdC5cbiAgICAgICAgdGhpcy5fdmFsdWVzW25hbWVdLnZhbHVlID0gbmV3IFByb3BlcnR5VmFsdWUodGhpcy5fdmFsdWVzW25hbWVdLnByb3BlcnR5LCB2YWx1ZSA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGNsb25lKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgZ2V0VHJhbnNpdGlvbiAgICAgICAgICAgKG5hbWUgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICByZXR1cm4gY2xvbmUodGhpcy5fdmFsdWVzW25hbWVdLnRyYW5zaXRpb24pO1xuICAgIH1cblxuICAgIHNldFRyYW5zaXRpb24gICAgICAgICAgIChuYW1lICAgLCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGlmICghdGhpcy5fdmFsdWVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZXNbbmFtZV0gPSBuZXcgVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlKHRoaXMuX3ZhbHVlc1tuYW1lXS5wcm9wZXJ0eSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmFsdWVzW25hbWVdLnRyYW5zaXRpb24gPSBjbG9uZSh2YWx1ZSkgfHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ICAgICAgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUocHJvcGVydHkpO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbcHJvcGVydHldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSB0aGlzLmdldFRyYW5zaXRpb24ocHJvcGVydHkpO1xuICAgICAgICAgICAgaWYgKHRyYW5zaXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtgJHtwcm9wZXJ0eX0tdHJhbnNpdGlvbmBdID0gdHJhbnNpdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHRyYW5zaXRpb25lZChwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICwgcHJpb3IgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgVHJhbnNpdGlvbmluZyh0aGlzLl9wcm9wZXJ0aWVzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpIHtcbiAgICAgICAgICAgIHJlc3VsdC5fdmFsdWVzW3Byb3BlcnR5XSA9IHRoaXMuX3ZhbHVlc1twcm9wZXJ0eV0udHJhbnNpdGlvbmVkKHBhcmFtZXRlcnMsIHByaW9yLl92YWx1ZXNbcHJvcGVydHldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHVudHJhbnNpdGlvbmVkKCkgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFRyYW5zaXRpb25pbmcodGhpcy5fcHJvcGVydGllcyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKSB7XG4gICAgICAgICAgICByZXN1bHQuX3ZhbHVlc1twcm9wZXJ0eV0gPSB0aGlzLl92YWx1ZXNbcHJvcGVydHldLnVudHJhbnNpdGlvbmVkKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0gVHJhbnNpdGlvbmluZyAtLS0tLS0tXG5cbi8qKlxuICogYFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlYCBpbXBsZW1lbnRzIHRoZSBmaXJzdCBvZiB0d28gaW50ZXJtZWRpYXRlIHN0ZXBzIGluIHRoZSBldmFsdWF0aW9uIGNoYWluIG9mIGEgcGFpbnRcbiAqIHByb3BlcnR5IHZhbHVlLiBJbiB0aGlzIHN0ZXAsIHRyYW5zaXRpb25zIGJldHdlZW4gb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSBoYW5kbGVkOiBhcyBsb25nIGFzIHRoZSB0cmFuc2l0aW9uIGlzIGluXG4gKiBwcm9ncmVzcywgYFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlYCBtYWludGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHByaW9yIHZhbHVlLCBhbmQgaW50ZXJwb2xhdGVzIGJldHdlZW4gaXQgYW5kXG4gKiB0aGUgbmV3IHZhbHVlIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRpbWUgYW5kIHRoZSBjb25maWd1cmVkIHRyYW5zaXRpb24gZHVyYXRpb24gYW5kIGRlbGF5LiBUaGUgcHJvZHVjdCBpcyB0aGUgbmV4dFxuICogc3RlcCBpbiB0aGUgZXZhbHVhdGlvbiBjaGFpbjogdGhlIFwicG9zc2libHkgZXZhbHVhdGVkXCIgcmVzdWx0IHR5cGUgYFJgLiBTZWUgYmVsb3cgZm9yIG1vcmUgb24gdGhpcyBjb25jZXB0LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IocHJvcGVydHkgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgIHZhbHVlICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgIHByaW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgbm93ICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuYmVnaW4gPSBub3cgKyB0cmFuc2l0aW9uLmRlbGF5IHx8IDA7XG4gICAgICAgIHRoaXMuZW5kID0gdGhpcy5iZWdpbiArIHRyYW5zaXRpb24uZHVyYXRpb24gfHwgMDtcbiAgICAgICAgaWYgKHByb3BlcnR5LnNwZWNpZmljYXRpb24udHJhbnNpdGlvbiAmJiAodHJhbnNpdGlvbi5kZWxheSB8fCB0cmFuc2l0aW9uLmR1cmF0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5wcmlvciA9IHByaW9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcG9zc2libHlFdmFsdWF0ZShwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICkgICAge1xuICAgICAgICBjb25zdCBub3cgPSBwYXJhbWV0ZXJzLm5vdyB8fCAwO1xuICAgICAgICBjb25zdCBmaW5hbFZhbHVlID0gdGhpcy52YWx1ZS5wb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnMpO1xuICAgICAgICBjb25zdCBwcmlvciA9IHRoaXMucHJpb3I7XG4gICAgICAgIGlmICghcHJpb3IpIHtcbiAgICAgICAgICAgIC8vIE5vIHByaW9yIHZhbHVlLlxuICAgICAgICAgICAgcmV0dXJuIGZpbmFsVmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAobm93ID4gdGhpcy5lbmQpIHtcbiAgICAgICAgICAgIC8vIFRyYW5zaXRpb24gZnJvbSBwcmlvciB2YWx1ZSBpcyBub3cgY29tcGxldGUuXG4gICAgICAgICAgICB0aGlzLnByaW9yID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBmaW5hbFZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWUuaXNEYXRhRHJpdmVuKCkpIHtcbiAgICAgICAgICAgIC8vIFRyYW5zaXRpb25zIHRvIGRhdGEtZHJpdmVuIHByb3BlcnRpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAgICAgICAgICAvLyBXZSBzbmFwIGltbWVkaWF0ZWx5IHRvIHRoZSBkYXRhLWRyaXZlbiB2YWx1ZSBzbyB0aGF0LCB3aGVuIHdlIHBlcmZvcm0gbGF5b3V0LFxuICAgICAgICAgICAgLy8gd2Ugc2VlIHRoZSBkYXRhLWRyaXZlbiBmdW5jdGlvbiBhbmQgY2FuIHVzZSBpdCB0byBwb3B1bGF0ZSB2ZXJ0ZXggYnVmZmVycy5cbiAgICAgICAgICAgIHRoaXMucHJpb3IgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIGZpbmFsVmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAobm93IDwgdGhpcy5iZWdpbikge1xuICAgICAgICAgICAgLy8gVHJhbnNpdGlvbiBoYXNuJ3Qgc3RhcnRlZCB5ZXQuXG4gICAgICAgICAgICByZXR1cm4gcHJpb3IucG9zc2libHlFdmFsdWF0ZShwYXJhbWV0ZXJzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEludGVycG9sYXRlIGJldHdlZW4gcmVjdXJzaXZlbHktY2FsY3VsYXRlZCBwcmlvciB2YWx1ZSBhbmQgZmluYWwuXG4gICAgICAgICAgICBjb25zdCB0ID0gKG5vdyAtIHRoaXMuYmVnaW4pIC8gKHRoaXMuZW5kIC0gdGhpcy5iZWdpbik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eS5pbnRlcnBvbGF0ZShwcmlvci5wb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnMpLCBmaW5hbFZhbHVlLCBlYXNlQ3ViaWNJbk91dCh0KSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQSBoZWxwZXIgdHlwZTogZ2l2ZW4gYW4gb2JqZWN0IHR5cGUgYFByb3BlcnRpZXNgIHdob3NlIHZhbHVlcyBhcmUgZWFjaCBvZiB0eXBlIGBQcm9wZXJ0eTxULCBSPmAsIGl0IGNhbGN1bGF0ZXNcbiAqIGFuIG9iamVjdCB0eXBlIHdpdGggdGhlIHNhbWUga2V5cyBhbmQgdmFsdWVzIG9mIHR5cGUgYFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlPFQsIFI+YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4vKipcbiAqIGBUcmFuc2l0aW9uaW5nYCBzdG9yZXMgYSBtYXAgb2YgYWxsIChwcm9wZXJ0eSBuYW1lLCBgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVgKSBwYWlycyBmb3IgcGFpbnQgcHJvcGVydGllcyBvZiBhXG4gKiBnaXZlbiBsYXllciB0eXBlLiBJdCBjYW4gY2FsY3VsYXRlIHRoZSBwb3NzaWJseS1ldmFsdWF0ZWQgdmFsdWVzIGZvciBhbGwgb2YgdGhlbSBhdCBvbmNlLCBwcm9kdWNpbmcgYVxuICogYFBvc3NpYmx5RXZhbHVhdGVkYCBpbnN0YW5jZSBmb3IgdGhlIHNhbWUgc2V0IG9mIHByb3BlcnRpZXMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgVHJhbnNpdGlvbmluZyAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgdGhpcy5fdmFsdWVzID0gKE9iamVjdC5jcmVhdGUocHJvcGVydGllcy5kZWZhdWx0VHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVzKSAgICAgKTtcbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFBvc3NpYmx5RXZhbHVhdGVkKHRoaXMuX3Byb3BlcnRpZXMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKSkge1xuICAgICAgICAgICAgcmVzdWx0Ll92YWx1ZXNbcHJvcGVydHldID0gdGhpcy5fdmFsdWVzW3Byb3BlcnR5XS5wb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbigpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdmFsdWVzW3Byb3BlcnR5XS5wcmlvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0gTGF5b3V0IC0tLS0tLS1cblxuLyoqXG4gKiBBIGhlbHBlciB0eXBlOiBnaXZlbiBhbiBvYmplY3QgdHlwZSBgUHJvcGVydGllc2Agd2hvc2UgdmFsdWVzIGFyZSBlYWNoIG9mIHR5cGUgYFByb3BlcnR5PFQsIFI+YCwgaXQgY2FsY3VsYXRlc1xuICogYW4gb2JqZWN0IHR5cGUgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdHlwZSBgUHJvcGVydHlWYWx1ZTxULCBSPmAuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbi8qKlxuICogQmVjYXVzZSBsYXlvdXQgcHJvcGVydGllcyBhcmUgbm90IHRyYW5zaXRpb25hYmxlLCB0aGV5IGhhdmUgYSBzaW1wbGVyIHJlcHJlc2VudGF0aW9uIGFuZCBldmFsdWF0aW9uIGNoYWluIHRoYW5cbiAqIHBhaW50IHByb3BlcnRpZXM6IGBQcm9wZXJ0eVZhbHVlYHMgYXJlIHBvc3NpYmx5IGV2YWx1YXRlZCwgcHJvZHVjaW5nIHBvc3NpYmx5IGV2YWx1YXRlZCB2YWx1ZXMsIHdoaWNoIGFyZSB0aGVuXG4gKiBmdWxseSBldmFsdWF0ZWQuXG4gKlxuICogYExheW91dGAgc3RvcmVzIGEgbWFwIG9mIGFsbCAocHJvcGVydHkgbmFtZSwgYFByb3BlcnR5VmFsdWVgKSBwYWlycyBmb3IgbGF5b3V0IHByb3BlcnRpZXMgb2YgYVxuICogZ2l2ZW4gbGF5ZXIgdHlwZS4gSXQgY2FuIGNhbGN1bGF0ZSB0aGUgcG9zc2libHktZXZhbHVhdGVkIHZhbHVlcyBmb3IgYWxsIG9mIHRoZW0gYXQgb25jZSwgcHJvZHVjaW5nIGFcbiAqIGBQb3NzaWJseUV2YWx1YXRlZGAgaW5zdGFuY2UgZm9yIHRoZSBzYW1lIHNldCBvZiBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIExheW91dCAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgICAgICB0aGlzLl92YWx1ZXMgPSAoT2JqZWN0LmNyZWF0ZShwcm9wZXJ0aWVzLmRlZmF1bHRQcm9wZXJ0eVZhbHVlcykgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0VmFsdWUgICAgICAgICAgIChuYW1lICAgKSB7XG4gICAgICAgIHJldHVybiBjbG9uZSh0aGlzLl92YWx1ZXNbbmFtZV0udmFsdWUpO1xuICAgIH1cblxuICAgIHNldFZhbHVlICAgICAgICAgICAobmFtZSAgICwgdmFsdWUgICApIHtcbiAgICAgICAgdGhpcy5fdmFsdWVzW25hbWVdID0gbmV3IFByb3BlcnR5VmFsdWUodGhpcy5fdmFsdWVzW25hbWVdLnByb3BlcnR5LCB2YWx1ZSA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGNsb25lKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgICAgICA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZShwcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgUG9zc2libHlFdmFsdWF0ZWQodGhpcy5fcHJvcGVydGllcyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKSB7XG4gICAgICAgICAgICByZXN1bHQuX3ZhbHVlc1twcm9wZXJ0eV0gPSB0aGlzLl92YWx1ZXNbcHJvcGVydHldLnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0gUG9zc2libHlFdmFsdWF0ZWQgLS0tLS0tLVxuXG4vKipcbiAqIFwiUG9zc2libHkgZXZhbHVhdGVkIHZhbHVlXCIgaXMgYW4gaW50ZXJtZWRpYXRlIHN0YWdlIGluIHRoZSBldmFsdWF0aW9uIGNoYWluIGZvciBib3RoIHBhaW50IGFuZCBsYXlvdXQgcHJvcGVydHlcbiAqIHZhbHVlcy4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBzdGFnZSBpcyB0byBvcHRpbWl6ZSBhd2F5IHVubmVjZXNzYXJ5IHJlY2FsY3VsYXRpb25zIGZvciBkYXRhLWRyaXZlbiBwcm9wZXJ0aWVzLiBDb2RlXG4gKiB3aGljaCB1c2VzIGRhdGEtZHJpdmVuIHByb3BlcnR5IHZhbHVlcyBtdXN0IGFzc3VtZSB0aGF0IHRoZSB2YWx1ZSBpcyBkZXBlbmRlbnQgb24gZmVhdHVyZSBkYXRhLCBhbmQgcmVxdWVzdCB0aGF0IGl0XG4gKiBiZSBldmFsdWF0ZWQgZm9yIGVhY2ggZmVhdHVyZS4gQnV0IHdoZW4gdGhhdCBwcm9wZXJ0eSB2YWx1ZSBpcyBpbiBmYWN0IGEgY29uc3RhbnQgb3IgY2FtZXJhIGZ1bmN0aW9uLCB0aGUgY2FsY3VsYXRpb25cbiAqIHdpbGwgbm90IGFjdHVhbGx5IGRlcGVuZCBvbiB0aGUgZmVhdHVyZSwgYW5kIHdlIGNhbiBiZW5lZml0IGZyb20gcmV0dXJuaW5nIHRoZSBwcmlvciByZXN1bHQgb2YgaGF2aW5nIGRvbmUgdGhlXG4gKiBldmFsdWF0aW9uIG9uY2UsIGFoZWFkIG9mIHRpbWUsIGluIGFuIGludGVybWVkaWF0ZSBzdGVwIHdob3NlIGlucHV0cyBhcmUganVzdCB0aGUgdmFsdWUgYW5kIFwiZ2xvYmFsXCIgcGFyYW1ldGVyc1xuICogc3VjaCBhcyBjdXJyZW50IHpvb20gbGV2ZWwuXG4gKlxuICogYFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVgIHJlcHJlc2VudHMgdGhlIHRocmVlIHBvc3NpYmxlIG91dGNvbWVzIG9mIHRoaXMgc3RlcDogaWYgdGhlIGlucHV0IHZhbHVlIHdhcyBhIGNvbnN0YW50IG9yXG4gKiBjYW1lcmEgZXhwcmVzc2lvbiwgdGhlbiB0aGUgXCJwb3NzaWJseSBldmFsdWF0ZWRcIiByZXN1bHQgaXMgYSBjb25zdGFudCB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgaW5wdXQgdmFsdWUgd2FzIGVpdGhlclxuICogYSBzb3VyY2Ugb3IgY29tcG9zaXRlIGV4cHJlc3Npb24sIGFuZCB3ZSBtdXN0IGRlZmVyIGZpbmFsIGV2YWx1YXRpb24gdW50aWwgc3VwcGxpZWQgYSBmZWF0dXJlLiBXZSBzZXBhcmF0ZVxuICogdGhlIHNvdXJjZSBhbmQgY29tcG9zaXRlIGNhc2VzIGJlY2F1c2UgdGhleSBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSB3aGVuIGdlbmVyYXRpbmcgR0wgYXR0cmlidXRlcywgYnVmZmVycywgYW5kXG4gKiB1bmlmb3Jtcy5cbiAqXG4gKiBOb3RlIHRoYXQgYFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVgIChhbmQgYFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZWAsIGJlbG93KSBhcmUgX25vdF8gdXNlZCBmb3IgcHJvcGVydGllcyB0aGF0XG4gKiBkbyBub3QgYWxsb3cgZGF0YS1kcml2ZW4gdmFsdWVzLiBGb3Igc3VjaCBwcm9wZXJ0aWVzLCB3ZSBrbm93IHRoYXQgdGhlIFwicG9zc2libHkgZXZhbHVhdGVkXCIgcmVzdWx0IGlzIGFsd2F5cyBhIGNvbnN0YW50XG4gKiBzY2FsYXIgdmFsdWUuIFNlZSBiZWxvdy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuLyoqXG4gKiBgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlYCBpcyB1c2VkIGZvciBkYXRhLWRyaXZlbiBwYWludCBhbmQgbGF5b3V0IHByb3BlcnR5IHZhbHVlcy4gSXQgaG9sZHMgYVxuICogYFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVgIGFuZCB0aGUgYEdsb2JhbFByb3BlcnRpZXNgIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIGl0LiBZb3UncmUgbm90IGFsbG93ZWQgdG8gc3VwcGx5XG4gKiBhIGRpZmZlcmVudCBzZXQgb2YgYEdsb2JhbFByb3BlcnRpZXNgIHdoZW4gcGVyZm9ybWluZyB0aGUgZmluYWwgZXZhbHVhdGlvbiBiZWNhdXNlIHRoZXkgd291bGQgYmUgaWdub3JlZCBpbiB0aGVcbiAqIGNhc2Ugd2hlcmUgdGhlIGlucHV0IHZhbHVlIHdhcyBhIGNvbnN0YW50IG9yIGNhbWVyYSBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnR5ICAgICAgICAgICAgICAgICAgICAgICAsIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBnbG9iYWxzICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmdsb2JhbHMgPSBnbG9iYWxzO1xuICAgIH1cblxuICAgIGlzQ29uc3RhbnQoKSAgICAgICAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlLmtpbmQgPT09ICdjb25zdGFudCc7XG4gICAgfVxuXG4gICAgY29uc3RhbnRPcih2YWx1ZSAgICkgICAge1xuICAgICAgICBpZiAodGhpcy52YWx1ZS5raW5kID09PSAnY29uc3RhbnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS52YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV2YWx1YXRlKGZlYXR1cmUgICAgICAgICApICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHkuZXZhbHVhdGUodGhpcy52YWx1ZSwgdGhpcy5nbG9iYWxzLCBmZWF0dXJlKTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBoZWxwZXIgdHlwZTogZ2l2ZW4gYW4gb2JqZWN0IHR5cGUgYFByb3BlcnRpZXNgIHdob3NlIHZhbHVlcyBhcmUgZWFjaCBvZiB0eXBlIGBQcm9wZXJ0eTxULCBSPmAsIGl0IGNhbGN1bGF0ZXNcbiAqIGFuIG9iamVjdCB0eXBlIHdpdGggdGhlIHNhbWUga2V5cywgYW5kIHZhbHVlcyBvZiB0eXBlIGBSYC5cbiAqXG4gKiBGb3IgcHJvcGVydGllcyB0aGF0IGRvbid0IGFsbG93IGRhdGEtZHJpdmVuIHZhbHVlcywgYFJgIGlzIGEgc2NhbGFyIHR5cGUgc3VjaCBhcyBgbnVtYmVyYCwgYHN0cmluZ2AsIG9yIGBDb2xvcmAuXG4gKiBGb3IgZGF0YS1kcml2ZW4gcHJvcGVydGllcywgaXQgaXMgYFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZWAuIENyaXRpY2FsbHksIHRoZSB0eXBlIGRlZmluaXRpb25zIGFyZSBzZXQgdXBcbiAqIGluIGEgd2F5IHRoYXQgYWxsb3dzIGZsb3cgdG8ga25vdyB3aGljaCBvZiB0aGVzZSB0d28gY2FzZXMgYXBwbGllcyBmb3IgYW55IGdpdmVuIHByb3BlcnR5IG5hbWUsIGFuZCBpZiB5b3UgYXR0ZW1wdFxuICogdG8gdXNlIGEgYFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZWAgYXMgaWYgaXQgd2FzIGEgc2NhbGFyLCBvciB2aWNlIHZlcnNhLCB5b3Ugd2lsbCBnZXQgYSB0eXBlIGVycm9yLiAoSG93ZXZlcixcbiAqIHRoZXJlJ3MgYXQgbGVhc3Qgb25lIGNhc2UgaW4gd2hpY2ggZmxvdyBmYWlscyB0byBwcm9kdWNlIGEgdHlwZSBlcnJvciB0aGF0IHlvdSBzaG91bGQgYmUgYXdhcmUgb2Y6IGluIGEgY29udGV4dCBzdWNoXG4gKiBhcyBgbGF5ZXIucGFpbnQuZ2V0KCdmb28tb3BhY2l0eScpID09PSAwYCwgaWYgYGZvby1vcGFjaXR5YCBpcyBkYXRhLWRyaXZlbiwgdGhhbiB0aGUgbGVmdC1oYW5kIHNpZGUgaXMgb2YgdHlwZVxuICogYFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxudW1iZXI+YCwgYnV0IGZsb3cgd2lsbCBub3QgY29tcGxhaW4gYWJvdXQgY29tcGFyaW5nIHRoaXMgdG8gYSBudW1iZXIgdXNpbmcgYD09PWAuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzIzNTkuKVxuICpcbiAqIFRoZXJlJ3MgYWxzbyBhIHRoaXJkLCBzcGVjaWFsIGNhc2UgcG9zc2libGl0eSBmb3IgYFJgOiBmb3IgY3Jvc3MtZmFkZWQgcHJvcGVydGllcywgaXQncyBgP0Nyb3NzRmFkZWQ8VD5gLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbi8qKlxuICogYFBvc3NpYmx5RXZhbHVhdGVkYCBzdG9yZXMgYSBtYXAgb2YgYWxsIChwcm9wZXJ0eSBuYW1lLCBgUmApIHBhaXJzIGZvciBwYWludCBvciBsYXlvdXQgcHJvcGVydGllcyBvZiBhXG4gKiBnaXZlbiBsYXllciB0eXBlLlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgUG9zc2libHlFdmFsdWF0ZWQgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgICAgICB0aGlzLl92YWx1ZXMgPSAoT2JqZWN0LmNyZWF0ZShwcm9wZXJ0aWVzLmRlZmF1bHRQb3NzaWJseUV2YWx1YXRlZFZhbHVlcykgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0ICAgICAgICAgICAobmFtZSAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVzW25hbWVdO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBgUHJvcGVydHlgIGZvciBwcm9wZXJ0aWVzIHRoYXQgZG8gbm90IHBlcm1pdCBkYXRhLWRyaXZlbiAoc291cmNlIG9yIGNvbXBvc2l0ZSkgZXhwcmVzc2lvbnMuXG4gKiBUaGlzIHJlc3RyaWN0aW9uIGFsbG93cyB1cyB0byBkZWNsYXJlIHN0YXRpY2FsbHkgdGhhdCB0aGUgcmVzdWx0IG9mIHBvc3NpYmx5IGV2YWx1YXRpbmcgdGhpcyBraW5kIG9mIHByb3BlcnR5XG4gKiBpcyBpbiBmYWN0IGFsd2F5cyB0aGUgc2NhbGFyIHR5cGUgYFRgLCBhbmQgY2FuIGJlIHVzZWQgd2l0aG91dCBmdXJ0aGVyIGV2YWx1YXRpbmcgdGhlIHZhbHVlIG9uIGEgcGVyLWZlYXR1cmUgYmFzaXMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgRGF0YUNvbnN0YW50UHJvcGVydHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihzcGVjaWZpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLnNwZWNpZmljYXRpb24gPSBzcGVjaWZpY2F0aW9uO1xuICAgIH1cblxuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWUgICAgICAgICAgICAgICAgICAgICAsIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgKSAgICB7XG4gICAgICAgIGFzc2VydCghdmFsdWUuaXNEYXRhRHJpdmVuKCkpO1xuICAgICAgICByZXR1cm4gdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0ZShhICAgLCBiICAgLCB0ICAgICAgICApICAgIHtcbiAgICAgICAgY29uc3QgaW50ZXJwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChpbnRlcnBvbGF0ZSAgICAgKVt0aGlzLnNwZWNpZmljYXRpb24udHlwZV07XG4gICAgICAgIGlmIChpbnRlcnApIHtcbiAgICAgICAgICAgIHJldHVybiBpbnRlcnAoYSwgYiwgdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBgUHJvcGVydHlgIGZvciBwcm9wZXJ0aWVzIHRoYXQgcGVybWl0IGRhdGEtZHJpdmVuIChzb3VyY2Ugb3IgY29tcG9zaXRlKSBleHByZXNzaW9ucy5cbiAqIFRoZSByZXN1bHQgb2YgcG9zc2libHkgZXZhbHVhdGluZyB0aGlzIGtpbmQgb2YgcHJvcGVydHkgaXMgYFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPmA7IG9idGFpbmluZ1xuICogYSBzY2FsYXIgdmFsdWUgYFRgIHJlcXVpcmVzIGZ1cnRoZXIgZXZhbHVhdGlvbiBvbiBhIHBlci1mZWF0dXJlIGJhc2lzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIERhdGFEcml2ZW5Qcm9wZXJ0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3Ioc3BlY2lmaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5zcGVjaWZpY2F0aW9uID0gc3BlY2lmaWNhdGlvbjtcbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgaWYgKHZhbHVlLmV4cHJlc3Npb24ua2luZCA9PT0gJ2NvbnN0YW50JyB8fCB2YWx1ZS5leHByZXNzaW9uLmtpbmQgPT09ICdjYW1lcmEnKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSh0aGlzLCB7a2luZDogJ2NvbnN0YW50JywgdmFsdWU6IHZhbHVlLmV4cHJlc3Npb24uZXZhbHVhdGUocGFyYW1ldGVycyl9LCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKHRoaXMsIHZhbHVlLmV4cHJlc3Npb24sIHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW50ZXJwb2xhdGUoYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgIGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICB0ICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAvLyBJZiBlaXRoZXIgcG9zc2libHktZXZhbHVhdGVkIHZhbHVlIGlzIG5vbi1jb25zdGFudCwgZ2l2ZSB1cDogd2UgYXJlbid0IGFibGUgdG8gaW50ZXJwb2xhdGUgZGF0YS1kcml2ZW4gdmFsdWVzLlxuICAgICAgICBpZiAoYS52YWx1ZS5raW5kICE9PSAnY29uc3RhbnQnIHx8IGIudmFsdWUua2luZCAhPT0gJ2NvbnN0YW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTcGVjaWFsIGNhc2UgaGFjayBzb2xlbHkgZm9yIGZpbGwtb3V0bGluZS1jb2xvci5cbiAgICAgICAgaWYgKGEudmFsdWUudmFsdWUgPT09IHVuZGVmaW5lZCB8fCBiLnZhbHVlLnZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gKHVuZGVmaW5lZCAgICAgKTtcblxuICAgICAgICBjb25zdCBpbnRlcnAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKGludGVycG9sYXRlICAgICApW3RoaXMuc3BlY2lmaWNhdGlvbi50eXBlXTtcbiAgICAgICAgaWYgKGludGVycCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUodGhpcywge2tpbmQ6ICdjb25zdGFudCcsIHZhbHVlOiBpbnRlcnAoYS52YWx1ZS52YWx1ZSwgYi52YWx1ZS52YWx1ZSwgdCl9LCBhLmdsb2JhbHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmFsdWF0ZSh2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICwgZ2xvYmFscyAgICAgICAgICAgICAgICAgICwgZmVhdHVyZSAgICAgICAgICkgICAge1xuICAgICAgICBpZiAodmFsdWUua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmV2YWx1YXRlKGdsb2JhbHMsIGZlYXR1cmUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGBQcm9wZXJ0eWAgZm9yIGAqLXBhdHRlcm5gIGFuZCBgbGluZS1kYXNoYXJyYXlgLCB3aGljaCBhcmUgdHJhbnNpdGlvbmVkIGJ5IGNyb3NzLWZhZGluZ1xuICogcmF0aGVyIHRoYW4gaW50ZXJwb2xhdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBDcm9zc0ZhZGVkUHJvcGVydHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3Ioc3BlY2lmaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5zcGVjaWZpY2F0aW9uID0gc3BlY2lmaWNhdGlvbjtcbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICB7XG4gICAgICAgIGlmICh2YWx1ZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmV4cHJlc3Npb24ua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICAgICAgY29uc3QgY29uc3RhbnQgPSB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZShjb25zdGFudCwgY29uc3RhbnQsIGNvbnN0YW50LCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydCghdmFsdWUuaXNEYXRhRHJpdmVuKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZShcbiAgICAgICAgICAgICAgICB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOiBwYXJhbWV0ZXJzLnpvb20gLSAxLjB9KSxcbiAgICAgICAgICAgICAgICB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOiBwYXJhbWV0ZXJzLnpvb219KSxcbiAgICAgICAgICAgICAgICB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOiBwYXJhbWV0ZXJzLnpvb20gKyAxLjB9KSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jYWxjdWxhdGUobWluICAgLCBtaWQgICAsIG1heCAgICwgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICB7XG4gICAgICAgIGNvbnN0IHogPSBwYXJhbWV0ZXJzLnpvb207XG4gICAgICAgIGNvbnN0IGZyYWN0aW9uID0geiAtIE1hdGguZmxvb3Ioeik7XG4gICAgICAgIGNvbnN0IHQgPSBwYXJhbWV0ZXJzLmNyb3NzRmFkaW5nRmFjdG9yKCk7XG4gICAgICAgIHJldHVybiB6ID4gcGFyYW1ldGVycy56b29tSGlzdG9yeS5sYXN0SW50ZWdlclpvb20gP1xuICAgICAgICAgICAgeyBmcm9tOiBtaW4sIHRvOiBtaWQsIGZyb21TY2FsZTogMiwgdG9TY2FsZTogMSwgdDogZnJhY3Rpb24gKyAoMSAtIGZyYWN0aW9uKSAqIHQgfSA6XG4gICAgICAgICAgICB7IGZyb206IG1heCwgdG86IG1pZCwgZnJvbVNjYWxlOiAwLjUsIHRvU2NhbGU6IDEsIHQ6IDEgLSAoMSAtIHQpICogZnJhY3Rpb24gfTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0ZShhICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxufVxuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGBQcm9wZXJ0eWAgZm9yIGBoZWF0bWFwLWNvbG9yYC4gRXZhbHVhdGlvbiBhbmQgaW50ZXJwb2xhdGlvbiBhcmUgbm8tb3BzOiB0aGUgcmVhbFxuICogZXZhbHVhdGlvbiBoYXBwZW5zIGluIEhlYXRtYXBTdHlsZUxheWVyLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIEhlYXRtYXBDb2xvclByb3BlcnR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKHNwZWNpZmljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuc3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb247XG4gICAgfVxuXG4gICAgcG9zc2libHlFdmFsdWF0ZSgpIHt9XG4gICAgaW50ZXJwb2xhdGUoKSB7fVxufVxuXG4vKipcbiAqIGBQcm9wZXJ0aWVzYCBob2xkcyBvYmplY3RzIGNvbnRhaW5pbmcgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBsYXlvdXQgb3IgcGFpbnQgcHJvcGVydHkgc2V0IG9mIGEgZ2l2ZW5cbiAqIGxheWVyIHR5cGUuIFRoZXNlIG9iamVjdHMgYXJlIGltbXV0YWJsZSwgYW5kIHRoZXkgYXJlIHVzZWQgYXMgdGhlIHByb3RvdHlwZXMgZm9yIHRoZSBgX3ZhbHVlc2AgbWVtYmVycyBvZlxuICogYFRyYW5zaXRpb25hYmxlYCwgYFRyYW5zaXRpb25pbmdgLCBgTGF5b3V0YCwgYW5kIGBQb3NzaWJseUV2YWx1YXRlZGAuIFRoaXMgYWxsb3dzIHRoZXNlIGNsYXNzZXMgdG8gYXZvaWRcbiAqIGRvaW5nIHdvcmsgaW4gdGhlIGNvbW1vbiBjYXNlIHdoZXJlIGEgcHJvcGVydHkgaGFzIG5vIGV4cGxpY2l0IHZhbHVlIHNldCBhbmQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gdGFrZVxuICogb24gdGhlIGRlZmF1bHQgdmFsdWU6IHVzaW5nIGBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpYCwgdGhleSBjYW4gaXRlcmF0ZSBvdmVyXG4gKiBvbmx5IHRoZSBfb3duXyBwcm9wZXJ0aWVzIG9mIGBfdmFsdWVzYCwgc2tpcHBpbmcgcmVwZWF0ZWQgY2FsY3VsYXRpb24gb2YgdHJhbnNpdGlvbnMgYW5kIHBvc3NpYmxlL2ZpbmFsXG4gKiBldmFsdWF0aW9ucyBmb3IgZGVmYXVsdHMsIHRoZSByZXN1bHQgb2Ygd2hpY2ggd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgUHJvcGVydGllcyAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnRpZXMgICAgICAgKSB7XG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgICAgIHRoaXMuZGVmYXVsdFByb3BlcnR5VmFsdWVzID0gKHt9ICAgICApO1xuICAgICAgICB0aGlzLmRlZmF1bHRUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVzID0gKHt9ICAgICApO1xuICAgICAgICB0aGlzLmRlZmF1bHRUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZXMgPSAoe30gICAgICk7XG4gICAgICAgIHRoaXMuZGVmYXVsdFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVzID0gKHt9ICAgICApO1xuXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gcHJvcGVydGllcykge1xuICAgICAgICAgICAgY29uc3QgcHJvcCA9IHByb3BlcnRpZXNbcHJvcGVydHldO1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFByb3BlcnR5VmFsdWUgPSB0aGlzLmRlZmF1bHRQcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eV0gPVxuICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlKHByb3AsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0VHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlID0gdGhpcy5kZWZhdWx0VHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eV0gPVxuICAgICAgICAgICAgICAgIG5ldyBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWUocHJvcCk7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZXNbcHJvcGVydHldID1cbiAgICAgICAgICAgICAgICBkZWZhdWx0VHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlLnVudHJhbnNpdGlvbmVkKCk7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRQb3NzaWJseUV2YWx1YXRlZFZhbHVlc1twcm9wZXJ0eV0gPVxuICAgICAgICAgICAgICAgIGRlZmF1bHRQcm9wZXJ0eVZhbHVlLnBvc3NpYmx5RXZhbHVhdGUoKHt9ICAgICApKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0RhdGFEcml2ZW5Qcm9wZXJ0eScsIERhdGFEcml2ZW5Qcm9wZXJ0eSk7XG5yZWdpc3RlcignRGF0YUNvbnN0YW50UHJvcGVydHknLCBEYXRhQ29uc3RhbnRQcm9wZXJ0eSk7XG5yZWdpc3RlcignQ3Jvc3NGYWRlZFByb3BlcnR5JywgQ3Jvc3NGYWRlZFByb3BlcnR5KTtcbnJlZ2lzdGVyKCdIZWF0bWFwQ29sb3JQcm9wZXJ0eScsIEhlYXRtYXBDb2xvclByb3BlcnR5KTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgUHJvcGVydHlWYWx1ZSxcbiAgICBUcmFuc2l0aW9uYWJsZSxcbiAgICBUcmFuc2l0aW9uaW5nLFxuICAgIExheW91dCxcbiAgICBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUsXG4gICAgUG9zc2libHlFdmFsdWF0ZWQsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWRQcm9wZXJ0eSxcbiAgICBIZWF0bWFwQ29sb3JQcm9wZXJ0eSxcbiAgICBQcm9wZXJ0aWVzXG59O1xuIiwiLy8gICAgICBcblxuY29uc3QgUG9pbnQgPSByZXF1aXJlKCdAbWFwYm94L3BvaW50LWdlb21ldHJ5Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5mdW5jdGlvbiBnZXRNYXhpbXVtUGFpbnRWYWx1ZShwcm9wZXJ0eSAgICAgICAgLCBsYXllciAgICAgICAgICAgICwgYnVja2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgIHtcbiAgICBjb25zdCB2YWx1ZSA9ICgobGF5ZXIucGFpbnQgICAgICkuZ2V0KHByb3BlcnR5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnZhbHVlO1xuICAgIGlmICh2YWx1ZS5raW5kID09PSAnY29uc3RhbnQnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBiaW5kZXJzID0gYnVja2V0LnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQobGF5ZXIuaWQpLmJpbmRlcnM7XG4gICAgICAgIHJldHVybiBiaW5kZXJzW3Byb3BlcnR5XS5zdGF0aXN0aWNzLm1heDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZURpc3RhbmNlKHRyYW5zbGF0ZSAgICAgICAgICAgICAgICAgICkge1xuICAgIHJldHVybiBNYXRoLnNxcnQodHJhbnNsYXRlWzBdICogdHJhbnNsYXRlWzBdICsgdHJhbnNsYXRlWzFdICogdHJhbnNsYXRlWzFdKTtcbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRlKHF1ZXJ5R2VvbWV0cnkgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUFuY2hvciAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgIGJlYXJpbmcgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICBwaXhlbHNUb1RpbGVVbml0cyAgICAgICAgKSB7XG4gICAgaWYgKCF0cmFuc2xhdGVbMF0gJiYgIXRyYW5zbGF0ZVsxXSkge1xuICAgICAgICByZXR1cm4gcXVlcnlHZW9tZXRyeTtcbiAgICB9XG5cbiAgICBjb25zdCBwdCA9IFBvaW50LmNvbnZlcnQodHJhbnNsYXRlKTtcblxuICAgIGlmICh0cmFuc2xhdGVBbmNob3IgPT09IFwidmlld3BvcnRcIikge1xuICAgICAgICBwdC5fcm90YXRlKC1iZWFyaW5nKTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2xhdGVkID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWVyeUdlb21ldHJ5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJpbmcgPSBxdWVyeUdlb21ldHJ5W2ldO1xuICAgICAgICBjb25zdCB0cmFuc2xhdGVkUmluZyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHJpbmcubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIHRyYW5zbGF0ZWRSaW5nLnB1c2gocmluZ1trXS5zdWIocHQuX211bHQocGl4ZWxzVG9UaWxlVW5pdHMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNsYXRlZC5wdXNoKHRyYW5zbGF0ZWRSaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zbGF0ZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGdldE1heGltdW1QYWludFZhbHVlLFxuICAgIHRyYW5zbGF0ZURpc3RhbmNlLFxuICAgIHRyYW5zbGF0ZVxufTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuY29uc3QgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xuY29uc3QgU3R5bGVMYXllciA9IHJlcXVpcmUoJy4vc3R5bGVfbGF5ZXInKTtcbmNvbnN0IGxvYWRTcHJpdGUgPSByZXF1aXJlKCcuL2xvYWRfc3ByaXRlJyk7XG5jb25zdCBJbWFnZU1hbmFnZXIgPSByZXF1aXJlKCcuLi9yZW5kZXIvaW1hZ2VfbWFuYWdlcicpO1xuY29uc3QgR2x5cGhNYW5hZ2VyID0gcmVxdWlyZSgnLi4vcmVuZGVyL2dseXBoX21hbmFnZXInKTtcbmNvbnN0IExpZ2h0ID0gcmVxdWlyZSgnLi9saWdodCcpO1xuY29uc3QgTGluZUF0bGFzID0gcmVxdWlyZSgnLi4vcmVuZGVyL2xpbmVfYXRsYXMnKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbmNvbnN0IGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcbmNvbnN0IG1hcGJveCA9IHJlcXVpcmUoJy4uL3V0aWwvbWFwYm94Jyk7XG5jb25zdCBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG5jb25zdCBEaXNwYXRjaGVyID0gcmVxdWlyZSgnLi4vdXRpbC9kaXNwYXRjaGVyJyk7XG5jb25zdCB2YWxpZGF0ZVN0eWxlID0gcmVxdWlyZSgnLi92YWxpZGF0ZV9zdHlsZScpO1xuY29uc3QgZ2V0U291cmNlVHlwZSA9IHJlcXVpcmUoJy4uL3NvdXJjZS9zb3VyY2UnKS5nZXRUeXBlO1xuY29uc3Qgc2V0U291cmNlVHlwZSA9IHJlcXVpcmUoJy4uL3NvdXJjZS9zb3VyY2UnKS5zZXRUeXBlO1xuY29uc3QgUXVlcnlGZWF0dXJlcyA9IHJlcXVpcmUoJy4uL3NvdXJjZS9xdWVyeV9mZWF0dXJlcycpO1xuY29uc3QgU291cmNlQ2FjaGUgPSByZXF1aXJlKCcuLi9zb3VyY2Uvc291cmNlX2NhY2hlJyk7XG5jb25zdCBHZW9KU09OU291cmNlID0gcmVxdWlyZSgnLi4vc291cmNlL2dlb2pzb25fc291cmNlJyk7XG5jb25zdCBzdHlsZVNwZWMgPSByZXF1aXJlKCcuLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnKTtcbmNvbnN0IGdldFdvcmtlclBvb2wgPSByZXF1aXJlKCcuLi91dGlsL2dsb2JhbF93b3JrZXJfcG9vbCcpO1xuY29uc3QgZGVyZWYgPSByZXF1aXJlKCcuLi9zdHlsZS1zcGVjL2RlcmVmJyk7XG5jb25zdCBkaWZmID0gcmVxdWlyZSgnLi4vc3R5bGUtc3BlYy9kaWZmJyk7XG5jb25zdCBydGxUZXh0UGx1Z2luID0gcmVxdWlyZSgnLi4vc291cmNlL3J0bF90ZXh0X3BsdWdpbicpO1xuY29uc3QgUGF1c2VhYmxlUGxhY2VtZW50ID0gcmVxdWlyZSgnLi9wYXVzZWFibGVfcGxhY2VtZW50Jyk7XG5jb25zdCBab29tSGlzdG9yeSA9IHJlcXVpcmUoJy4vem9vbV9oaXN0b3J5Jyk7XG5jb25zdCBDcm9zc1RpbGVTeW1ib2xJbmRleCA9IHJlcXVpcmUoJy4uL3N5bWJvbC9jcm9zc190aWxlX3N5bWJvbF9pbmRleCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNvbnN0IHN1cHBvcnRlZERpZmZPcGVyYXRpb25zID0gdXRpbC5waWNrKGRpZmYub3BlcmF0aW9ucywgW1xuICAgICdhZGRMYXllcicsXG4gICAgJ3JlbW92ZUxheWVyJyxcbiAgICAnc2V0UGFpbnRQcm9wZXJ0eScsXG4gICAgJ3NldExheW91dFByb3BlcnR5JyxcbiAgICAnc2V0RmlsdGVyJyxcbiAgICAnYWRkU291cmNlJyxcbiAgICAncmVtb3ZlU291cmNlJyxcbiAgICAnc2V0TGF5ZXJab29tUmFuZ2UnLFxuICAgICdzZXRMaWdodCcsXG4gICAgJ3NldFRyYW5zaXRpb24nLFxuICAgICdzZXRHZW9KU09OU291cmNlRGF0YSdcbiAgICAvLyAnc2V0R2x5cGhzJyxcbiAgICAvLyAnc2V0U3ByaXRlJyxcbl0pO1xuXG5jb25zdCBpZ25vcmVkRGlmZk9wZXJhdGlvbnMgPSB1dGlsLnBpY2soZGlmZi5vcGVyYXRpb25zLCBbXG4gICAgJ3NldENlbnRlcicsXG4gICAgJ3NldFpvb20nLFxuICAgICdzZXRCZWFyaW5nJyxcbiAgICAnc2V0UGl0Y2gnXG5dKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgXG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3R5bGUgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKG1hcCAgICAgLCBvcHRpb25zICAgICAgICAgICAgICAgPSB7fSkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBuZXcgRGlzcGF0Y2hlcihnZXRXb3JrZXJQb29sKCksIHRoaXMpO1xuICAgICAgICB0aGlzLmltYWdlTWFuYWdlciA9IG5ldyBJbWFnZU1hbmFnZXIoKTtcbiAgICAgICAgdGhpcy5nbHlwaE1hbmFnZXIgPSBuZXcgR2x5cGhNYW5hZ2VyKG1hcC5fdHJhbnNmb3JtUmVxdWVzdCwgb3B0aW9ucy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkpO1xuICAgICAgICB0aGlzLmxpbmVBdGxhcyA9IG5ldyBMaW5lQXRsYXMoMjU2LCA1MTIpO1xuICAgICAgICB0aGlzLmNyb3NzVGlsZVN5bWJvbEluZGV4ID0gbmV3IENyb3NzVGlsZVN5bWJvbEluZGV4KCk7XG5cbiAgICAgICAgdGhpcy5fbGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMuX29yZGVyICA9IFtdO1xuICAgICAgICB0aGlzLnNvdXJjZUNhY2hlcyA9IHt9O1xuICAgICAgICB0aGlzLnpvb21IaXN0b3J5ID0gbmV3IFpvb21IaXN0b3J5KCk7XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX3Jlc2V0VXBkYXRlcygpO1xuXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLl9ydGxUZXh0UGx1Z2luQ2FsbGJhY2sgPSBydGxUZXh0UGx1Z2luLnJlZ2lzdGVyRm9yUGx1Z2luQXZhaWxhYmlsaXR5KChhcmdzKSA9PiB7XG4gICAgICAgICAgICBzZWxmLmRpc3BhdGNoZXIuYnJvYWRjYXN0KCdsb2FkUlRMVGV4dFBsdWdpbicsIGFyZ3MucGx1Z2luQmxvYlVSTCwgYXJncy5lcnJvckNhbGxiYWNrKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gc2VsZi5zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgICAgICBzZWxmLnNvdXJjZUNhY2hlc1tpZF0ucmVsb2FkKCk7IC8vIFNob3VsZCBiZSBhIG5vLW9wIGlmIHRoZSBwbHVnaW4gbG9hZHMgYmVmb3JlIGFueSB0aWxlcyBsb2FkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub24oJ2RhdGEnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5kYXRhVHlwZSAhPT0gJ3NvdXJjZScgfHwgZXZlbnQuc291cmNlRGF0YVR5cGUgIT09ICdtZXRhZGF0YScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5zb3VyY2VDYWNoZXNbZXZlbnQuc291cmNlSWRdO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2VDYWNoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gc291cmNlQ2FjaGUuZ2V0U291cmNlKCk7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZSB8fCAhc291cmNlLnZlY3RvckxheWVySWRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbbGF5ZXJJZF07XG4gICAgICAgICAgICAgICAgaWYgKGxheWVyLnNvdXJjZSA9PT0gc291cmNlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRlTGF5ZXIobGF5ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9hZFVSTCh1cmwgICAgICAgICwgb3B0aW9ucyAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICA9IHt9KSB7XG4gICAgICAgIHRoaXMuZmlyZSgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzdHlsZSd9KTtcblxuICAgICAgICBjb25zdCB2YWxpZGF0ZSA9IHR5cGVvZiBvcHRpb25zLnZhbGlkYXRlID09PSAnYm9vbGVhbicgP1xuICAgICAgICAgICAgb3B0aW9ucy52YWxpZGF0ZSA6ICFtYXBib3guaXNNYXBib3hVUkwodXJsKTtcblxuICAgICAgICB1cmwgPSBtYXBib3gubm9ybWFsaXplU3R5bGVVUkwodXJsLCBvcHRpb25zLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMubWFwLl90cmFuc2Zvcm1SZXF1ZXN0KHVybCwgYWpheC5SZXNvdXJjZVR5cGUuU3R5bGUpO1xuXG4gICAgICAgIGFqYXguZ2V0SlNPTihyZXF1ZXN0LCAoZXJyb3IsIGpzb24pID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCB7ZXJyb3J9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoanNvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWQoKGpzb24gICAgICksIHZhbGlkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9hZEpTT04oanNvbiAgICAgICAgICAgICAgICAgICAgLCBvcHRpb25zICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgPSB7fSkge1xuICAgICAgICB0aGlzLmZpcmUoJ2RhdGFsb2FkaW5nJywge2RhdGFUeXBlOiAnc3R5bGUnfSk7XG5cbiAgICAgICAgYnJvd3Nlci5mcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkKGpzb24sIG9wdGlvbnMudmFsaWRhdGUgIT09IGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2xvYWQoanNvbiAgICAgICAgICAgICAgICAgICAgLCB2YWxpZGF0ZSAgICAgICAgICkge1xuICAgICAgICBpZiAodmFsaWRhdGUgJiYgdmFsaWRhdGVTdHlsZS5lbWl0RXJyb3JzKHRoaXMsIHZhbGlkYXRlU3R5bGUoanNvbikpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0eWxlc2hlZXQgPSBqc29uO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4ganNvbi5zb3VyY2VzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFNvdXJjZShpZCwganNvbi5zb3VyY2VzW2lkXSwge3ZhbGlkYXRlOiBmYWxzZX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGpzb24uc3ByaXRlKSB7XG4gICAgICAgICAgICBsb2FkU3ByaXRlKGpzb24uc3ByaXRlLCB0aGlzLm1hcC5fdHJhbnNmb3JtUmVxdWVzdCwgKGVyciwgaW1hZ2VzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGltYWdlcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGltYWdlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIuYWRkSW1hZ2UoaWQsIGltYWdlc1tpZF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIuc2V0TG9hZGVkKHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgnZGF0YScsIHtkYXRhVHlwZTogJ3N0eWxlJ30pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlTWFuYWdlci5zZXRMb2FkZWQodHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdseXBoTWFuYWdlci5zZXRVUkwoanNvbi5nbHlwaHMpO1xuXG4gICAgICAgIGNvbnN0IGxheWVycyA9IGRlcmVmKHRoaXMuc3R5bGVzaGVldC5sYXllcnMpO1xuXG4gICAgICAgIHRoaXMuX29yZGVyID0gbGF5ZXJzLm1hcCgobGF5ZXIpID0+IGxheWVyLmlkKTtcblxuICAgICAgICB0aGlzLl9sYXllcnMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICAgICAgICBsYXllciA9IFN0eWxlTGF5ZXIuY3JlYXRlKGxheWVyKTtcbiAgICAgICAgICAgIGxheWVyLnNldEV2ZW50ZWRQYXJlbnQodGhpcywge2xheWVyOiB7aWQ6IGxheWVyLmlkfX0pO1xuICAgICAgICAgICAgdGhpcy5fbGF5ZXJzW2xheWVyLmlkXSA9IGxheWVyO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdCgnc2V0TGF5ZXJzJywgdGhpcy5fc2VyaWFsaXplTGF5ZXJzKHRoaXMuX29yZGVyKSk7XG5cbiAgICAgICAgdGhpcy5saWdodCA9IG5ldyBMaWdodCh0aGlzLnN0eWxlc2hlZXQubGlnaHQpO1xuXG4gICAgICAgIHRoaXMuZmlyZSgnZGF0YScsIHtkYXRhVHlwZTogJ3N0eWxlJ30pO1xuICAgICAgICB0aGlzLmZpcmUoJ3N0eWxlLmxvYWQnKTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVMYXllcihsYXllciAgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHRoaXMuc291cmNlQ2FjaGVzW2xheWVyLnNvdXJjZV07XG4gICAgICAgIGlmICghc291cmNlQ2FjaGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZUxheWVyID0gbGF5ZXIuc291cmNlTGF5ZXI7XG4gICAgICAgIGlmICghc291cmNlTGF5ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZUNhY2hlLmdldFNvdXJjZSgpO1xuICAgICAgICBpZiAoc291cmNlLnR5cGUgPT09ICdnZW9qc29uJyB8fCAoc291cmNlLnZlY3RvckxheWVySWRzICYmIHNvdXJjZS52ZWN0b3JMYXllcklkcy5pbmRleE9mKHNvdXJjZUxheWVyKSA9PT0gLTEpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBTb3VyY2UgbGF5ZXIgXCIke3NvdXJjZUxheWVyfVwiIGAgK1xuICAgICAgICAgICAgICAgICAgICBgZG9lcyBub3QgZXhpc3Qgb24gc291cmNlIFwiJHtzb3VyY2UuaWR9XCIgYCArXG4gICAgICAgICAgICAgICAgICAgIGBhcyBzcGVjaWZpZWQgYnkgc3R5bGUgbGF5ZXIgXCIke2xheWVyLmlkfVwiYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZGVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2xvYWRlZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXBkYXRlZFNvdXJjZXMpLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuc291cmNlQ2FjaGVzKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnNvdXJjZUNhY2hlc1tpZF0ubG9hZGVkKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmICghdGhpcy5pbWFnZU1hbmFnZXIuaXNMb2FkZWQoKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBfc2VyaWFsaXplTGF5ZXJzKGlkcyAgICAgICAgICAgICAgICkge1xuICAgICAgICByZXR1cm4gaWRzLm1hcCgoaWQpID0+IHRoaXMuX2xheWVyc1tpZF0uc2VyaWFsaXplKCkpO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb25zKCkge1xuICAgICAgICBpZiAodGhpcy5saWdodCAmJiB0aGlzLmxpZ2h0Lmhhc1RyYW5zaXRpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zb3VyY2VDYWNoZXNbaWRdLmhhc1RyYW5zaXRpb24oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9sYXllcnNbaWRdLmhhc1RyYW5zaXRpb24oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIF9jaGVja0xvYWRlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sb2FkZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3R5bGUgaXMgbm90IGRvbmUgbG9hZGluZycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgcXVldWVkIHN0eWxlIHVwZGF0ZXMgaW4gYSBiYXRjaCBhbmQgcmVjYWxjdWxhdGUgem9vbS1kZXBlbmRlbnQgcGFpbnQgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICB1cGRhdGUocGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkSWRzID0gT2JqZWN0LmtleXModGhpcy5fdXBkYXRlZExheWVycyk7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkSWRzID0gT2JqZWN0LmtleXModGhpcy5fcmVtb3ZlZExheWVycyk7XG5cbiAgICAgICAgICAgIGlmICh1cGRhdGVkSWRzLmxlbmd0aCB8fCByZW1vdmVkSWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVdvcmtlckxheWVycyh1cGRhdGVkSWRzLCByZW1vdmVkSWRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdXBkYXRlZFNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLl91cGRhdGVkU291cmNlc1tpZF07XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGFjdGlvbiA9PT0gJ3JlbG9hZCcgfHwgYWN0aW9uID09PSAnY2xlYXInKTtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAncmVsb2FkJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWxvYWRTb3VyY2UoaWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnY2xlYXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyU291cmNlKGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdXBkYXRlZFBhaW50UHJvcHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXllcnNbaWRdLnVwZGF0ZVRyYW5zaXRpb25zKHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxpZ2h0LnVwZGF0ZVRyYW5zaXRpb25zKHBhcmFtZXRlcnMpO1xuXG4gICAgICAgICAgICB0aGlzLl9yZXNldFVwZGF0ZXMoKTtcblxuICAgICAgICAgICAgdGhpcy5maXJlKCdkYXRhJywge2RhdGFUeXBlOiAnc3R5bGUnfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZUlkIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tzb3VyY2VJZF0udXNlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBsYXllcklkIG9mIHRoaXMuX29yZGVyKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tsYXllcklkXTtcblxuICAgICAgICAgICAgbGF5ZXIucmVjYWxjdWxhdGUocGFyYW1ldGVycyk7XG4gICAgICAgICAgICBpZiAoIWxheWVyLmlzSGlkZGVuKHBhcmFtZXRlcnMuem9vbSkgJiYgbGF5ZXIuc291cmNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXNbbGF5ZXIuc291cmNlXS51c2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGlnaHQucmVjYWxjdWxhdGUocGFyYW1ldGVycyk7XG4gICAgICAgIHRoaXMueiA9IHBhcmFtZXRlcnMuem9vbTtcbiAgICB9XG5cbiAgICBfdXBkYXRlV29ya2VyTGF5ZXJzKHVwZGF0ZWRJZHMgICAgICAgICAgICAgICAsIHJlbW92ZWRJZHMgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdCgndXBkYXRlTGF5ZXJzJywge1xuICAgICAgICAgICAgbGF5ZXJzOiB0aGlzLl9zZXJpYWxpemVMYXllcnModXBkYXRlZElkcyksXG4gICAgICAgICAgICByZW1vdmVkSWRzOiByZW1vdmVkSWRzXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9yZXNldFVwZGF0ZXMoKSB7XG4gICAgICAgIHRoaXMuX2NoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl91cGRhdGVkTGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMuX3JlbW92ZWRMYXllcnMgPSB7fTtcblxuICAgICAgICB0aGlzLl91cGRhdGVkU291cmNlcyA9IHt9O1xuICAgICAgICB0aGlzLl91cGRhdGVkUGFpbnRQcm9wcyA9IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGlzIHN0eWxlJ3Mgc3RhdGUgdG8gbWF0Y2ggdGhlIGdpdmVuIHN0eWxlIEpTT04sIHBlcmZvcm1pbmcgb25seVxuICAgICAqIHRoZSBuZWNlc3NhcnkgbXV0YXRpb25zLlxuICAgICAqXG4gICAgICogTWF5IHRocm93IGFuIEVycm9yICgnVW5pbXBsZW1lbnRlZDogTUVUSE9EJykgaWYgdGhlIG1hcGJveC1nbC1zdHlsZS1zcGVjXG4gICAgICogZGlmZiBhbGdvcml0aG0gcHJvZHVjZXMgYW4gb3BlcmF0aW9uIHRoYXQgaXMgbm90IHN1cHBvcnRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGFueSBjaGFuZ2VzIHdlcmUgbWFkZTsgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzZXRTdGF0ZShuZXh0U3RhdGUgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGlmICh2YWxpZGF0ZVN0eWxlLmVtaXRFcnJvcnModGhpcywgdmFsaWRhdGVTdHlsZShuZXh0U3RhdGUpKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIG5leHRTdGF0ZSA9IHV0aWwuY2xvbmUobmV4dFN0YXRlKTtcbiAgICAgICAgbmV4dFN0YXRlLmxheWVycyA9IGRlcmVmKG5leHRTdGF0ZS5sYXllcnMpO1xuXG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSBkaWZmKHRoaXMuc2VyaWFsaXplKCksIG5leHRTdGF0ZSlcbiAgICAgICAgICAgIC5maWx0ZXIob3AgPT4gIShvcC5jb21tYW5kIGluIGlnbm9yZWREaWZmT3BlcmF0aW9ucykpO1xuXG4gICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdW5pbXBsZW1lbnRlZE9wcyA9IGNoYW5nZXMuZmlsdGVyKG9wID0+ICEob3AuY29tbWFuZCBpbiBzdXBwb3J0ZWREaWZmT3BlcmF0aW9ucykpO1xuICAgICAgICBpZiAodW5pbXBsZW1lbnRlZE9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaW1wbGVtZW50ZWQ6ICR7dW5pbXBsZW1lbnRlZE9wcy5tYXAob3AgPT4gb3AuY29tbWFuZCkuam9pbignLCAnKX0uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGFuZ2VzLmZvckVhY2goKG9wKSA9PiB7XG4gICAgICAgICAgICBpZiAob3AuY29tbWFuZCA9PT0gJ3NldFRyYW5zaXRpb24nKSB7XG4gICAgICAgICAgICAgICAgLy8gYHRyYW5zaXRpb25gIGlzIGFsd2F5cyByZWFkIGRpcmVjdGx5IG9mZiBvZlxuICAgICAgICAgICAgICAgIC8vIGB0aGlzLnN0eWxlc2hlZXRgLCB3aGljaCB3ZSB1cGRhdGUgYmVsb3dcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAodGhpcyAgICAgKVtvcC5jb21tYW5kXS5hcHBseSh0aGlzLCBvcC5hcmdzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zdHlsZXNoZWV0ID0gbmV4dFN0YXRlO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGFkZEltYWdlKGlkICAgICAgICAsIGltYWdlICAgICAgICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLmdldEltYWdlKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZSgnZXJyb3InLCB7ZXJyb3I6IG5ldyBFcnJvcignQW4gaW1hZ2Ugd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMuJyl9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmltYWdlTWFuYWdlci5hZGRJbWFnZShpZCwgaW1hZ2UpO1xuICAgICAgICB0aGlzLmZpcmUoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzdHlsZSd9KTtcbiAgICB9XG5cbiAgICBnZXRJbWFnZShpZCAgICAgICAgKSAgICAgICAgICAgICAge1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZU1hbmFnZXIuZ2V0SW1hZ2UoaWQpO1xuICAgIH1cblxuICAgIHJlbW92ZUltYWdlKGlkICAgICAgICApIHtcbiAgICAgICAgaWYgKCF0aGlzLmdldEltYWdlKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZSgnZXJyb3InLCB7ZXJyb3I6IG5ldyBFcnJvcignTm8gaW1hZ2Ugd2l0aCB0aGlzIG5hbWUgZXhpc3RzLicpfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIucmVtb3ZlSW1hZ2UoaWQpO1xuICAgICAgICB0aGlzLmZpcmUoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzdHlsZSd9KTtcbiAgICB9XG5cbiAgICBhZGRTb3VyY2UoaWQgICAgICAgICwgc291cmNlICAgICAgICAgICAgICAgICAgICAgLCBvcHRpb25zICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBpZiAodGhpcy5zb3VyY2VDYWNoZXNbaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgaXMgYWxyZWFkeSBhIHNvdXJjZSB3aXRoIHRoaXMgSUQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc291cmNlLnR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHR5cGUgcHJvcGVydHkgbXVzdCBiZSBkZWZpbmVkLCBidXQgdGhlIG9ubHkgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIHdlcmUgZ2l2ZW46ICR7T2JqZWN0LmtleXMoc291cmNlKS5qb2luKCcsICcpfS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1aWx0SW5zID0gWyd2ZWN0b3InLCAncmFzdGVyJywgJ2dlb2pzb24nLCAndmlkZW8nLCAnaW1hZ2UnLCAnY2FudmFzJ107XG4gICAgICAgIGNvbnN0IHNob3VsZFZhbGlkYXRlID0gYnVpbHRJbnMuaW5kZXhPZihzb3VyY2UudHlwZSkgPj0gMDtcbiAgICAgICAgaWYgKHNob3VsZFZhbGlkYXRlICYmIHRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlU3R5bGUuc291cmNlLCBgc291cmNlcy4ke2lkfWAsIHNvdXJjZSwgbnVsbCwgb3B0aW9ucykpIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy5tYXAgJiYgdGhpcy5tYXAuX2NvbGxlY3RSZXNvdXJjZVRpbWluZykgKHNvdXJjZSAgICAgKS5jb2xsZWN0UmVzb3VyY2VUaW1pbmcgPSB0cnVlO1xuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHRoaXMuc291cmNlQ2FjaGVzW2lkXSA9IG5ldyBTb3VyY2VDYWNoZShpZCwgc291cmNlLCB0aGlzLmRpc3BhdGNoZXIpO1xuICAgICAgICBzb3VyY2VDYWNoZS5zdHlsZSA9IHRoaXM7XG4gICAgICAgIHNvdXJjZUNhY2hlLnNldEV2ZW50ZWRQYXJlbnQodGhpcywgKCkgPT4gKHtcbiAgICAgICAgICAgIGlzU291cmNlTG9hZGVkOiB0aGlzLmxvYWRlZCgpLFxuICAgICAgICAgICAgc291cmNlOiBzb3VyY2VDYWNoZS5zZXJpYWxpemUoKSxcbiAgICAgICAgICAgIHNvdXJjZUlkOiBpZFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgc291cmNlQ2FjaGUub25BZGQodGhpcy5tYXApO1xuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBzb3VyY2UgZnJvbSB0aGlzIHN0eWxlc2hlZXQsIGdpdmVuIGl0cyBpZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgaWQgb2YgdGhlIHNvdXJjZSB0byByZW1vdmVcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgbm8gc291cmNlIGlzIGZvdW5kIHdpdGggdGhlIGdpdmVuIElEXG4gICAgICovXG4gICAgcmVtb3ZlU291cmNlKGlkICAgICAgICApIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBpZiAodGhpcy5zb3VyY2VDYWNoZXNbaWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgaXMgbm8gc291cmNlIHdpdGggdGhpcyBJRCcpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9sYXllcnNbbGF5ZXJJZF0uc291cmNlID09PSBpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcmUoJ2Vycm9yJywge2Vycm9yOiBuZXcgRXJyb3IoYFNvdXJjZSBcIiR7aWR9XCIgY2Fubm90IGJlIHJlbW92ZWQgd2hpbGUgbGF5ZXIgXCIke2xheWVySWR9XCIgaXMgdXNpbmcgaXQuYCl9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5zb3VyY2VDYWNoZXNbaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5zb3VyY2VDYWNoZXNbaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5fdXBkYXRlZFNvdXJjZXNbaWRdO1xuICAgICAgICBzb3VyY2VDYWNoZS5maXJlKCdkYXRhJywge3NvdXJjZURhdGFUeXBlOiAnbWV0YWRhdGEnLCBkYXRhVHlwZTonc291cmNlJywgc291cmNlSWQ6IGlkfSk7XG4gICAgICAgIHNvdXJjZUNhY2hlLnNldEV2ZW50ZWRQYXJlbnQobnVsbCk7XG4gICAgICAgIHNvdXJjZUNhY2hlLmNsZWFyVGlsZXMoKTtcblxuICAgICAgICBpZiAoc291cmNlQ2FjaGUub25SZW1vdmUpIHNvdXJjZUNhY2hlLm9uUmVtb3ZlKHRoaXMubWFwKTtcbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBTZXQgdGhlIGRhdGEgb2YgYSBHZW9KU09OIHNvdXJjZSwgZ2l2ZW4gaXRzIGlkLlxuICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIGlkIG9mIHRoZSBzb3VyY2VcbiAgICAqIEBwYXJhbSB7R2VvSlNPTnxzdHJpbmd9IGRhdGEgR2VvSlNPTiBzb3VyY2VcbiAgICAqL1xuICAgIHNldEdlb0pTT05Tb3VyY2VEYXRhKGlkICAgICAgICAsIGRhdGEgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBhc3NlcnQodGhpcy5zb3VyY2VDYWNoZXNbaWRdICE9PSB1bmRlZmluZWQsICdUaGVyZSBpcyBubyBzb3VyY2Ugd2l0aCB0aGlzIElEJyk7XG4gICAgICAgIGNvbnN0IGdlb2pzb25Tb3VyY2UgICAgICAgICAgICAgICAgPSAodGhpcy5zb3VyY2VDYWNoZXNbaWRdLmdldFNvdXJjZSgpICAgICApO1xuICAgICAgICBhc3NlcnQoZ2VvanNvblNvdXJjZS50eXBlID09PSAnZ2VvanNvbicpO1xuXG4gICAgICAgIGdlb2pzb25Tb3VyY2Uuc2V0RGF0YShkYXRhKTtcbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgc291cmNlIGJ5IGlkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBpZCBvZiB0aGUgZGVzaXJlZCBzb3VyY2VcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBzb3VyY2VcbiAgICAgKi9cbiAgICBnZXRTb3VyY2UoaWQgICAgICAgICkgICAgICAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZUNhY2hlc1tpZF0gJiYgdGhpcy5zb3VyY2VDYWNoZXNbaWRdLmdldFNvdXJjZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGxheWVyIHRvIHRoZSBtYXAgc3R5bGUuIFRoZSBsYXllciB3aWxsIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgbGF5ZXIgd2l0aFxuICAgICAqIElEIGBiZWZvcmVgLCBvciBhcHBlbmRlZCBpZiBgYmVmb3JlYCBpcyBvbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYmVmb3JlXSBJRCBvZiBhbiBleGlzdGluZyBsYXllciB0byBpbnNlcnQgYmVmb3JlXG4gICAgICovXG4gICAgYWRkTGF5ZXIobGF5ZXJPYmplY3QgICAgICAgICAgICAgICAgICAgICwgYmVmb3JlICAgICAgICAgLCBvcHRpb25zICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBjb25zdCBpZCA9IGxheWVyT2JqZWN0LmlkO1xuXG4gICAgICAgIGlmICh0eXBlb2YgbGF5ZXJPYmplY3Quc291cmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhpcy5hZGRTb3VyY2UoaWQsIGxheWVyT2JqZWN0LnNvdXJjZSk7XG4gICAgICAgICAgICBsYXllck9iamVjdCA9IHV0aWwuY2xvbmUobGF5ZXJPYmplY3QpO1xuICAgICAgICAgICAgbGF5ZXJPYmplY3QgPSAodXRpbC5leHRlbmQobGF5ZXJPYmplY3QsIHtzb3VyY2U6IGlkfSkgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGlzIGxheWVyIGlzIG5vdCBpbiB0aGUgc3R5bGUubGF5ZXJzIGFycmF5LCBzbyB3ZSBwYXNzIGFuIGltcG9zc2libGUgYXJyYXkgaW5kZXhcbiAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlU3R5bGUubGF5ZXIsXG4gICAgICAgICAgICBgbGF5ZXJzLiR7aWR9YCwgbGF5ZXJPYmplY3QsIHthcnJheUluZGV4OiAtMX0sIG9wdGlvbnMpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSBTdHlsZUxheWVyLmNyZWF0ZShsYXllck9iamVjdCk7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlTGF5ZXIobGF5ZXIpO1xuXG4gICAgICAgIGxheWVyLnNldEV2ZW50ZWRQYXJlbnQodGhpcywge2xheWVyOiB7aWQ6IGlkfX0pO1xuXG5cbiAgICAgICAgY29uc3QgaW5kZXggPSBiZWZvcmUgPyB0aGlzLl9vcmRlci5pbmRleE9mKGJlZm9yZSkgOiB0aGlzLl9vcmRlci5sZW5ndGg7XG4gICAgICAgIGlmIChiZWZvcmUgJiYgaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywgeyBlcnJvcjogbmV3IEVycm9yKGBMYXllciB3aXRoIGlkIFwiJHtiZWZvcmV9XCIgZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBtYXAuYCl9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29yZGVyLnNwbGljZShpbmRleCwgMCwgaWQpO1xuICAgICAgICB0aGlzLl9sYXllck9yZGVyQ2hhbmdlZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5fbGF5ZXJzW2lkXSA9IGxheWVyO1xuXG4gICAgICAgIGlmICh0aGlzLl9yZW1vdmVkTGF5ZXJzW2lkXSAmJiBsYXllci5zb3VyY2UpIHtcbiAgICAgICAgICAgIC8vIElmLCBpbiB0aGUgY3VycmVudCBiYXRjaCwgd2UgaGF2ZSBhbHJlYWR5IHJlbW92ZWQgdGhpcyBsYXllclxuICAgICAgICAgICAgLy8gYW5kIHdlIGFyZSBub3cgcmUtYWRkaW5nIGl0IHdpdGggYSBkaWZmZXJlbnQgYHR5cGVgLCB0aGVuIHdlXG4gICAgICAgICAgICAvLyBuZWVkIHRvIGNsZWFyIChyYXRoZXIgdGhhbiBqdXN0IHJlbG9hZCkgdGhlIHVuZGVyeWxpbmcgc291cmNlJ3NcbiAgICAgICAgICAgIC8vIHRpbGVzLiAgT3RoZXJ3aXNlLCB0aWxlcyBtYXJrZWQgJ3JlbG9hZGluZycgd2lsbCBoYXZlIGJ1Y2tldHMgL1xuICAgICAgICAgICAgLy8gYnVmZmVycyB0aGF0IGFyZSBzZXQgdXAgZm9yIHRoZSBfcHJldmlvdXNfIHZlcnNpb24gb2YgdGhpc1xuICAgICAgICAgICAgLy8gbGF5ZXIsIGNhdXNpbmcsIGUuZy46XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMzYzM1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMuX3JlbW92ZWRMYXllcnNbaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3JlbW92ZWRMYXllcnNbaWRdO1xuICAgICAgICAgICAgaWYgKHJlbW92ZWQudHlwZSAhPT0gbGF5ZXIudHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWRTb3VyY2VzW2xheWVyLnNvdXJjZV0gPSAnY2xlYXInO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVkU291cmNlc1tsYXllci5zb3VyY2VdID0gJ3JlbG9hZCc7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXNbbGF5ZXIuc291cmNlXS5wYXVzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyKGxheWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyBhIGxheWVyIHRvIGEgZGlmZmVyZW50IHotcG9zaXRpb24uIFRoZSBsYXllciB3aWxsIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgbGF5ZXIgd2l0aFxuICAgICAqIElEIGBiZWZvcmVgLCBvciBhcHBlbmRlZCBpZiBgYmVmb3JlYCBpcyBvbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAgSUQgb2YgdGhlIGxheWVyIHRvIG1vdmVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2JlZm9yZV0gSUQgb2YgYW4gZXhpc3RpbmcgbGF5ZXIgdG8gaW5zZXJ0IGJlZm9yZVxuICAgICAqL1xuICAgIG1vdmVMYXllcihpZCAgICAgICAgLCBiZWZvcmUgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBUaGUgbGF5ZXIgJyR7aWR9JyBkb2VzIG5vdCBleGlzdCBpbiBgICtcbiAgICAgICAgICAgICAgICAgICAgYHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIG1vdmVkLmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fb3JkZXIuaW5kZXhPZihpZCk7XG4gICAgICAgIHRoaXMuX29yZGVyLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSBiZWZvcmUgPyB0aGlzLl9vcmRlci5pbmRleE9mKGJlZm9yZSkgOiB0aGlzLl9vcmRlci5sZW5ndGg7XG4gICAgICAgIGlmIChiZWZvcmUgJiYgbmV3SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywgeyBlcnJvcjogbmV3IEVycm9yKGBMYXllciB3aXRoIGlkIFwiJHtiZWZvcmV9XCIgZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBtYXAuYCl9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vcmRlci5zcGxpY2UobmV3SW5kZXgsIDAsIGlkKTtcblxuICAgICAgICB0aGlzLl9sYXllck9yZGVyQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBsYXllciB3aXRoIHRoZSBnaXZlbiBpZCBmcm9tIHRoZSBzdHlsZS5cbiAgICAgKlxuICAgICAqIElmIG5vIHN1Y2ggbGF5ZXIgZXhpc3RzLCBhbiBgZXJyb3JgIGV2ZW50IGlzIGZpcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIGlkIG9mIHRoZSBsYXllciB0byByZW1vdmVcbiAgICAgKiBAZmlyZXMgZXJyb3JcbiAgICAgKi9cbiAgICByZW1vdmVMYXllcihpZCAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBUaGUgbGF5ZXIgJyR7aWR9JyBkb2VzIG5vdCBleGlzdCBpbiBgICtcbiAgICAgICAgICAgICAgICAgICAgYHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIHJlbW92ZWQuYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGF5ZXIuc2V0RXZlbnRlZFBhcmVudChudWxsKTtcblxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX29yZGVyLmluZGV4T2YoaWQpO1xuICAgICAgICB0aGlzLl9vcmRlci5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgICAgIHRoaXMuX2xheWVyT3JkZXJDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3JlbW92ZWRMYXllcnNbaWRdID0gbGF5ZXI7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sYXllcnNbaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5fdXBkYXRlZExheWVyc1tpZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLl91cGRhdGVkUGFpbnRQcm9wc1tpZF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBzdHlsZSBsYXllciBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gYGlkYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIGlkIG9mIHRoZSBkZXNpcmVkIGxheWVyXG4gICAgICogQHJldHVybnMgez9PYmplY3R9IGEgbGF5ZXIsIGlmIG9uZSB3aXRoIHRoZSBnaXZlbiBgaWRgIGV4aXN0c1xuICAgICAqL1xuICAgIGdldExheWVyKGlkICAgICAgICApICAgICAgICAge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICB9XG5cbiAgICBzZXRMYXllclpvb21SYW5nZShsYXllcklkICAgICAgICAsIG1pbnpvb20gICAgICAgICAsIG1heHpvb20gICAgICAgICApIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXJJZCk7XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYFRoZSBsYXllciAnJHtsYXllcklkfScgZG9lcyBub3QgZXhpc3QgaW4gYCArXG4gICAgICAgICAgICAgICAgICAgIGB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBoYXZlIHpvb20gZXh0ZW50LmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYXllci5taW56b29tID09PSBtaW56b29tICYmIGxheWVyLm1heHpvb20gPT09IG1heHpvb20pIHJldHVybjtcblxuICAgICAgICBpZiAobWluem9vbSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsYXllci5taW56b29tID0gbWluem9vbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4em9vbSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsYXllci5tYXh6b29tID0gbWF4em9vbTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllcik7XG4gICAgfVxuXG4gICAgc2V0RmlsdGVyKGxheWVySWQgICAgICAgICwgZmlsdGVyICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcklkKTtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgVGhlIGxheWVyICcke2xheWVySWR9JyBkb2VzIG5vdCBleGlzdCBpbiBgICtcbiAgICAgICAgICAgICAgICAgICAgYHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIGZpbHRlcmVkLmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1dGlsLmRlZXBFcXVhbChsYXllci5maWx0ZXIsIGZpbHRlcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXIgPT09IG51bGwgfHwgZmlsdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxheWVyLmZpbHRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyKGxheWVyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLmZpbHRlciwgYGxheWVycy4ke2xheWVyLmlkfS5maWx0ZXJgLCBmaWx0ZXIpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsYXllci5maWx0ZXIgPSB1dGlsLmNsb25lKGZpbHRlcik7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyKGxheWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBsYXllcidzIGZpbHRlciBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXIgdGhlIGxheWVyIHRvIGluc3BlY3RcbiAgICAgKiBAcmV0dXJucyB7Kn0gdGhlIGxheWVyJ3MgZmlsdGVyLCBpZiBhbnlcbiAgICAgKi9cbiAgICBnZXRGaWx0ZXIobGF5ZXIgICAgICAgICkge1xuICAgICAgICByZXR1cm4gdXRpbC5jbG9uZSh0aGlzLmdldExheWVyKGxheWVyKS5maWx0ZXIpO1xuICAgIH1cblxuICAgIHNldExheW91dFByb3BlcnR5KGxheWVySWQgICAgICAgICwgbmFtZSAgICAgICAgLCB2YWx1ZSAgICAgKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVySWQpO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBUaGUgbGF5ZXIgJyR7bGF5ZXJJZH0nIGRvZXMgbm90IGV4aXN0IGluIGAgK1xuICAgICAgICAgICAgICAgICAgICBgdGhlIG1hcCdzIHN0eWxlIGFuZCBjYW5ub3QgYmUgc3R5bGVkLmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1dGlsLmRlZXBFcXVhbChsYXllci5nZXRMYXlvdXRQcm9wZXJ0eShuYW1lKSwgdmFsdWUpKSByZXR1cm47XG5cbiAgICAgICAgbGF5ZXIuc2V0TGF5b3V0UHJvcGVydHkobmFtZSwgdmFsdWUpO1xuICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgbGF5b3V0IHByb3BlcnR5J3MgdmFsdWUgZnJvbSBhIGdpdmVuIGxheWVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIHRoZSBsYXllciB0byBpbnNwZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBwcm9wZXJ0eVxuICAgICAqIEByZXR1cm5zIHsqfSB0aGUgcHJvcGVydHkgdmFsdWVcbiAgICAgKi9cbiAgICBnZXRMYXlvdXRQcm9wZXJ0eShsYXllciAgICAgICAgLCBuYW1lICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGF5ZXIobGF5ZXIpLmdldExheW91dFByb3BlcnR5KG5hbWUpO1xuICAgIH1cblxuICAgIHNldFBhaW50UHJvcGVydHkobGF5ZXJJZCAgICAgICAgLCBuYW1lICAgICAgICAsIHZhbHVlICAgICApIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXJJZCk7XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYFRoZSBsYXllciAnJHtsYXllcklkfScgZG9lcyBub3QgZXhpc3QgaW4gYCArXG4gICAgICAgICAgICAgICAgICAgIGB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSBzdHlsZWQuYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWwuZGVlcEVxdWFsKGxheWVyLmdldFBhaW50UHJvcGVydHkobmFtZSksIHZhbHVlKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHdhc0RhdGFEcml2ZW4gPSBsYXllci5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzW25hbWVdLnZhbHVlLmlzRGF0YURyaXZlbigpO1xuICAgICAgICBsYXllci5zZXRQYWludFByb3BlcnR5KG5hbWUsIHZhbHVlKTtcbiAgICAgICAgY29uc3QgaXNEYXRhRHJpdmVuID0gbGF5ZXIuX3RyYW5zaXRpb25hYmxlUGFpbnQuX3ZhbHVlc1tuYW1lXS52YWx1ZS5pc0RhdGFEcml2ZW4oKTtcblxuICAgICAgICBpZiAoaXNEYXRhRHJpdmVuIHx8IHdhc0RhdGFEcml2ZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyKGxheWVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NoYW5nZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl91cGRhdGVkUGFpbnRQcm9wc1tsYXllcklkXSA9IHRydWU7XG4gICAgfVxuXG4gICAgZ2V0UGFpbnRQcm9wZXJ0eShsYXllciAgICAgICAgLCBuYW1lICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGF5ZXIobGF5ZXIpLmdldFBhaW50UHJvcGVydHkobmFtZSk7XG4gICAgfVxuXG4gICAgZ2V0VHJhbnNpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHV0aWwuZXh0ZW5kKHsgZHVyYXRpb246IDMwMCwgZGVsYXk6IDAgfSxcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzaGVldCAmJiB0aGlzLnN0eWxlc2hlZXQudHJhbnNpdGlvbik7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4gdXRpbC5maWx0ZXJPYmplY3Qoe1xuICAgICAgICAgICAgdmVyc2lvbjogdGhpcy5zdHlsZXNoZWV0LnZlcnNpb24sXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnN0eWxlc2hlZXQubmFtZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLnN0eWxlc2hlZXQubWV0YWRhdGEsXG4gICAgICAgICAgICBsaWdodDogdGhpcy5zdHlsZXNoZWV0LmxpZ2h0LFxuICAgICAgICAgICAgY2VudGVyOiB0aGlzLnN0eWxlc2hlZXQuY2VudGVyLFxuICAgICAgICAgICAgem9vbTogdGhpcy5zdHlsZXNoZWV0Lnpvb20sXG4gICAgICAgICAgICBiZWFyaW5nOiB0aGlzLnN0eWxlc2hlZXQuYmVhcmluZyxcbiAgICAgICAgICAgIHBpdGNoOiB0aGlzLnN0eWxlc2hlZXQucGl0Y2gsXG4gICAgICAgICAgICBzcHJpdGU6IHRoaXMuc3R5bGVzaGVldC5zcHJpdGUsXG4gICAgICAgICAgICBnbHlwaHM6IHRoaXMuc3R5bGVzaGVldC5nbHlwaHMsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiB0aGlzLnN0eWxlc2hlZXQudHJhbnNpdGlvbixcbiAgICAgICAgICAgIHNvdXJjZXM6IHV0aWwubWFwT2JqZWN0KHRoaXMuc291cmNlQ2FjaGVzLCAoc291cmNlKSA9PiBzb3VyY2Uuc2VyaWFsaXplKCkpLFxuICAgICAgICAgICAgbGF5ZXJzOiB0aGlzLl9vcmRlci5tYXAoKGlkKSA9PiB0aGlzLl9sYXllcnNbaWRdLnNlcmlhbGl6ZSgpKVxuICAgICAgICB9LCAodmFsdWUpID0+IHsgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQ7IH0pO1xuICAgIH1cblxuICAgIF91cGRhdGVMYXllcihsYXllciAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLl91cGRhdGVkTGF5ZXJzW2xheWVyLmlkXSA9IHRydWU7XG4gICAgICAgIGlmIChsYXllci5zb3VyY2UgJiYgIXRoaXMuX3VwZGF0ZWRTb3VyY2VzW2xheWVyLnNvdXJjZV0pIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWRTb3VyY2VzW2xheWVyLnNvdXJjZV0gPSAncmVsb2FkJztcbiAgICAgICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW2xheWVyLnNvdXJjZV0ucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBfZmxhdHRlblJlbmRlcmVkRmVhdHVyZXMoc291cmNlUmVzdWx0cyAgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCBmZWF0dXJlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBsID0gdGhpcy5fb3JkZXIubGVuZ3RoIC0gMTsgbCA+PSAwOyBsLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVySWQgPSB0aGlzLl9vcmRlcltsXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlUmVzdWx0IG9mIHNvdXJjZVJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXllckZlYXR1cmVzID0gc291cmNlUmVzdWx0W2xheWVySWRdO1xuICAgICAgICAgICAgICAgIGlmIChsYXllckZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiBsYXllckZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcy5wdXNoKGZlYXR1cmUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmZWF0dXJlcztcbiAgICB9XG5cbiAgICBxdWVyeVJlbmRlcmVkRmVhdHVyZXMocXVlcnlHZW9tZXRyeSAgICAgLCBwYXJhbXMgICAgICwgem9vbSAgICAgICAgLCBiZWFyaW5nICAgICAgICApIHtcbiAgICAgICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMuZmlsdGVyKSB7XG4gICAgICAgICAgICB0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLmZpbHRlciwgJ3F1ZXJ5UmVuZGVyZWRGZWF0dXJlcy5maWx0ZXInLCBwYXJhbXMuZmlsdGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluY2x1ZGVkU291cmNlcyA9IHt9O1xuICAgICAgICBpZiAocGFyYW1zICYmIHBhcmFtcy5sYXllcnMpIHtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMubGF5ZXJzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCB7ZXJyb3I6ICdwYXJhbWV0ZXJzLmxheWVycyBtdXN0IGJlIGFuIEFycmF5Lid9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgb2YgcGFyYW1zLmxheWVycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5fbGF5ZXJzW2xheWVySWRdO1xuICAgICAgICAgICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBsYXllciBpcyBub3QgaW4gdGhlIHN0eWxlLmxheWVycyBhcnJheVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywge2Vycm9yOiBgVGhlIGxheWVyICcke2xheWVySWR9JyBkb2VzIG5vdCBleGlzdCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSBxdWVyaWVkIGZvciBmZWF0dXJlcy5gfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5jbHVkZWRTb3VyY2VzW2xheWVyLnNvdXJjZV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlUmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBpZiAocGFyYW1zLmxheWVycyAmJiAhaW5jbHVkZWRTb3VyY2VzW2lkXSkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gUXVlcnlGZWF0dXJlcy5yZW5kZXJlZCh0aGlzLnNvdXJjZUNhY2hlc1tpZF0sIHRoaXMuX2xheWVycywgcXVlcnlHZW9tZXRyeSwgcGFyYW1zLCB6b29tLCBiZWFyaW5nLCB0aGlzLnBsYWNlbWVudCA/IHRoaXMucGxhY2VtZW50LmNvbGxpc2lvbkluZGV4IDogbnVsbCk7XG4gICAgICAgICAgICBzb3VyY2VSZXN1bHRzLnB1c2gocmVzdWx0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZsYXR0ZW5SZW5kZXJlZEZlYXR1cmVzKHNvdXJjZVJlc3VsdHMpO1xuICAgIH1cblxuICAgIHF1ZXJ5U291cmNlRmVhdHVyZXMoc291cmNlSUQgICAgICAgICwgcGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBpZiAocGFyYW1zICYmIHBhcmFtcy5maWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlU3R5bGUuZmlsdGVyLCAncXVlcnlTb3VyY2VGZWF0dXJlcy5maWx0ZXInLCBwYXJhbXMuZmlsdGVyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHRoaXMuc291cmNlQ2FjaGVzW3NvdXJjZUlEXTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZUNhY2hlID8gUXVlcnlGZWF0dXJlcy5zb3VyY2Uoc291cmNlQ2FjaGUsIHBhcmFtcykgOiBbXTtcbiAgICB9XG5cbiAgICBhZGRTb3VyY2VUeXBlKG5hbWUgICAgICAgICwgU291cmNlVHlwZSAgICAgICAgICAgICAgICwgY2FsbGJhY2sgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGlmIChnZXRTb3VyY2VUeXBlKG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBBIHNvdXJjZSB0eXBlIGNhbGxlZCBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0cy5gKSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRTb3VyY2VUeXBlKG5hbWUsIFNvdXJjZVR5cGUpO1xuXG4gICAgICAgIGlmICghU291cmNlVHlwZS53b3JrZXJTb3VyY2VVUkwpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoJ2xvYWRXb3JrZXJTb3VyY2UnLCB7XG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgdXJsOiBTb3VyY2VUeXBlLndvcmtlclNvdXJjZVVSTFxuICAgICAgICB9LCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZ2V0TGlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpZ2h0LmdldExpZ2h0KCk7XG4gICAgfVxuXG4gICAgc2V0TGlnaHQobGlnaHRPcHRpb25zICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBjb25zdCBsaWdodCA9IHRoaXMubGlnaHQuZ2V0TGlnaHQoKTtcbiAgICAgICAgbGV0IF91cGRhdGUgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbGlnaHRPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAoIXV0aWwuZGVlcEVxdWFsKGxpZ2h0T3B0aW9uc1trZXldLCBsaWdodFtrZXldKSkge1xuICAgICAgICAgICAgICAgIF91cGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghX3VwZGF0ZSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICAgICAgICBub3c6IGJyb3dzZXIubm93KCksXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiB1dGlsLmV4dGVuZCh7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMCxcbiAgICAgICAgICAgICAgICBkZWxheTogMFxuICAgICAgICAgICAgfSwgdGhpcy5zdHlsZXNoZWV0LnRyYW5zaXRpb24pXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5saWdodC5zZXRMaWdodChsaWdodE9wdGlvbnMpO1xuICAgICAgICB0aGlzLmxpZ2h0LnVwZGF0ZVRyYW5zaXRpb25zKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZSh2YWxpZGF0ZSAgICAgICAgICAgICAgLCBrZXkgICAgICAgICwgdmFsdWUgICAgICwgcHJvcHMgICAgICwgb3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudmFsaWRhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3R5bGUuZW1pdEVycm9ycyh0aGlzLCB2YWxpZGF0ZS5jYWxsKHZhbGlkYXRlU3R5bGUsIHV0aWwuZXh0ZW5kKHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgc3R5bGU6IHRoaXMuc2VyaWFsaXplKCksXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IHN0eWxlU3BlY1xuICAgICAgICB9LCBwcm9wcykpKTtcbiAgICB9XG5cbiAgICBfcmVtb3ZlKCkge1xuICAgICAgICBydGxUZXh0UGx1Z2luLmV2ZW50ZWQub2ZmKCdwbHVnaW5BdmFpbGFibGUnLCB0aGlzLl9ydGxUZXh0UGx1Z2luQ2FsbGJhY2spO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tpZF0uY2xlYXJUaWxlcygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICBfY2xlYXJTb3VyY2UoaWQgICAgICAgICkge1xuICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tpZF0uY2xlYXJUaWxlcygpO1xuICAgIH1cblxuICAgIF9yZWxvYWRTb3VyY2UoaWQgICAgICAgICkge1xuICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tpZF0ucmVzdW1lKCk7XG4gICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW2lkXS5yZWxvYWQoKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlU291cmNlcyh0cmFuc2Zvcm0gICAgICAgICAgICkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tpZF0udXBkYXRlKHRyYW5zZm9ybSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZ2VuZXJhdGVDb2xsaXNpb25Cb3hlcygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLnNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgdGhpcy5fcmVsb2FkU291cmNlKGlkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVQbGFjZW1lbnQodHJhbnNmb3JtICAgICAgICAgICAsIHNob3dDb2xsaXNpb25Cb3hlcyAgICAgICAgICwgZmFkZUR1cmF0aW9uICAgICAgICApIHtcbiAgICAgICAgbGV0IHN5bWJvbEJ1Y2tldHNDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBwbGFjZW1lbnRDb21taXR0ZWQgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBsYXllclRpbGVzID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBsYXllcklEIG9mIHRoaXMuX29yZGVyKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZUxheWVyID0gdGhpcy5fbGF5ZXJzW2xheWVySURdO1xuICAgICAgICAgICAgaWYgKHN0eWxlTGF5ZXIudHlwZSAhPT0gJ3N5bWJvbCcpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBpZiAoIWxheWVyVGlsZXNbc3R5bGVMYXllci5zb3VyY2VdKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLnNvdXJjZUNhY2hlc1tzdHlsZUxheWVyLnNvdXJjZV07XG4gICAgICAgICAgICAgICAgbGF5ZXJUaWxlc1tzdHlsZUxheWVyLnNvdXJjZV0gPSBzb3VyY2VDYWNoZS5nZXRSZW5kZXJhYmxlSWRzKClcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoaWQpID0+IHNvdXJjZUNhY2hlLmdldFRpbGVCeUlEKGlkKSlcbiAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IChiLnRpbGVJRC5vdmVyc2NhbGVkWiAtIGEudGlsZUlELm92ZXJzY2FsZWRaKSB8fCAoYS50aWxlSUQuaXNMZXNzVGhhbihiLnRpbGVJRCkgPyAtMSA6IDEpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGF5ZXJCdWNrZXRzQ2hhbmdlZCA9IHRoaXMuY3Jvc3NUaWxlU3ltYm9sSW5kZXguYWRkTGF5ZXIoc3R5bGVMYXllciwgbGF5ZXJUaWxlc1tzdHlsZUxheWVyLnNvdXJjZV0pO1xuICAgICAgICAgICAgc3ltYm9sQnVja2V0c0NoYW5nZWQgPSBzeW1ib2xCdWNrZXRzQ2hhbmdlZCB8fCBsYXllckJ1Y2tldHNDaGFuZ2VkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3Jvc3NUaWxlU3ltYm9sSW5kZXgucHJ1bmVVbnVzZWRMYXllcnModGhpcy5fb3JkZXIpO1xuXG4gICAgICAgIC8vIEFueXRoaW5nIHRoYXQgY2hhbmdlcyBvdXIgXCJpbiBwcm9ncmVzc1wiIGxheWVyIGFuZCB0aWxlIGluZGljZXMgcmVxdWlyZXMgdXNcbiAgICAgICAgLy8gdG8gc3RhcnQgb3Zlci4gV2hlbiB3ZSBzdGFydCBvdmVyLCB3ZSBkbyBhIGZ1bGwgcGxhY2VtZW50IGluc3RlYWQgb2YgaW5jcmVtZW50YWxcbiAgICAgICAgLy8gdG8gcHJldmVudCBzdGFydmF0aW9uLlxuICAgICAgICAvLyBXZSBuZWVkIHRvIHJlc3RhcnQgcGxhY2VtZW50IHRvIGtlZXAgbGF5ZXIgaW5kaWNlcyBpbiBzeW5jLlxuICAgICAgICBjb25zdCBmb3JjZUZ1bGxQbGFjZW1lbnQgPSB0aGlzLl9sYXllck9yZGVyQ2hhbmdlZDtcblxuICAgICAgICBpZiAoZm9yY2VGdWxsUGxhY2VtZW50IHx8ICF0aGlzLnBhdXNlYWJsZVBsYWNlbWVudCB8fCAodGhpcy5wYXVzZWFibGVQbGFjZW1lbnQuaXNEb25lKCkgJiYgIXRoaXMucGxhY2VtZW50LnN0aWxsUmVjZW50KGJyb3dzZXIubm93KCkpKSkge1xuICAgICAgICAgICAgdGhpcy5wYXVzZWFibGVQbGFjZW1lbnQgPSBuZXcgUGF1c2VhYmxlUGxhY2VtZW50KHRyYW5zZm9ybSwgdGhpcy5fb3JkZXIsIGZvcmNlRnVsbFBsYWNlbWVudCwgc2hvd0NvbGxpc2lvbkJveGVzLCBmYWRlRHVyYXRpb24pO1xuICAgICAgICAgICAgdGhpcy5fbGF5ZXJPcmRlckNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5pc0RvbmUoKSkge1xuICAgICAgICAgICAgLy8gdGhlIGxhc3QgcGxhY2VtZW50IGZpbmlzaGVkIHJ1bm5pbmcsIGJ1dCB0aGUgbmV4dCBvbmUgaGFzbuKAmXRcbiAgICAgICAgICAgIC8vIHN0YXJ0ZWQgeWV0IGJlY2F1c2Ugb2YgdGhlIGBzdGlsbFJlY2VudGAgY2hlY2sgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIC8vIGFib3ZlLCBzbyBtYXJrIGl0IHN0YWxlIHRvIGVuc3VyZSB0aGF0IHdlIHJlcXVlc3QgYW5vdGhlclxuICAgICAgICAgICAgLy8gcmVuZGVyIGZyYW1lXG4gICAgICAgICAgICB0aGlzLnBsYWNlbWVudC5zZXRTdGFsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wYXVzZWFibGVQbGFjZW1lbnQuY29udGludWVQbGFjZW1lbnQodGhpcy5fb3JkZXIsIHRoaXMuX2xheWVycywgbGF5ZXJUaWxlcyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5pc0RvbmUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGxhY2VtZW50ID0gdGhpcy5wYXVzZWFibGVQbGFjZW1lbnQuY29tbWl0KHRoaXMucGxhY2VtZW50LCBicm93c2VyLm5vdygpKTtcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnRDb21taXR0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3ltYm9sQnVja2V0c0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgcGxhY2VtZW50IGdldHMgc3BsaXQgb3ZlciBtdWx0aXBsZSBmcmFtZXMgaXQgaXMgcG9zc2libGVcbiAgICAgICAgICAgICAgICAvLyB0aGVzZSBidWNrZXRzIHdlcmUgcHJvY2Vzc2VkIGJlZm9yZSB0aGV5IHdlcmUgY2hhbmdlZCBhbmQgc28gdGhlXG4gICAgICAgICAgICAgICAgLy8gcGxhY2VtZW50IGlzIGFscmVhZHkgc3RhbGUgd2hpbGUgaXQgaXMgaW4gcHJvZ3Jlc3NcbiAgICAgICAgICAgICAgICB0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5wbGFjZW1lbnQuc2V0U3RhbGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwbGFjZW1lbnRDb21taXR0ZWQgfHwgc3ltYm9sQnVja2V0c0NoYW5nZWQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXJJRCBvZiB0aGlzLl9vcmRlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlTGF5ZXIgPSB0aGlzLl9sYXllcnNbbGF5ZXJJRF07XG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlTGF5ZXIudHlwZSAhPT0gJ3N5bWJvbCcpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHRoaXMucGxhY2VtZW50LnVwZGF0ZUxheWVyT3BhY2l0aWVzKHN0eWxlTGF5ZXIsIGxheWVyVGlsZXNbc3R5bGVMYXllci5zb3VyY2VdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5lZWRzUmVuZGVyIGlzIGZhbHNlIHdoZW4gd2UgaGF2ZSBqdXN0IGZpbmlzaGVkIGEgcGxhY2VtZW50IHRoYXQgZGlkbid0IGNoYW5nZSB0aGUgdmlzaWJpbGl0eSBvZiBhbnkgc3ltYm9sc1xuICAgICAgICBjb25zdCBuZWVkc1JlcmVuZGVyID0gIXRoaXMucGF1c2VhYmxlUGxhY2VtZW50LmlzRG9uZSgpIHx8IHRoaXMucGxhY2VtZW50Lmhhc1RyYW5zaXRpb25zKGJyb3dzZXIubm93KCkpO1xuICAgICAgICByZXR1cm4gbmVlZHNSZXJlbmRlcjtcbiAgICB9XG5cbiAgICAvLyBDYWxsYmFja3MgZnJvbSB3ZWIgd29ya2Vyc1xuXG4gICAgZ2V0SW1hZ2VzKG1hcElkICAgICAgICAsIHBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICwgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyLmdldEltYWdlcyhwYXJhbXMuaWNvbnMsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBnZXRHbHlwaHMobWFwSWQgICAgICAgICwgcGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLmdseXBoTWFuYWdlci5nZXRHbHlwaHMocGFyYW1zLnN0YWNrcywgY2FsbGJhY2spO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTdHlsZTtcbiIsIi8vICAgICAgXG5cblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuY29uc3Qgc3R5bGVTcGVjID0gcmVxdWlyZSgnLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0Jyk7XG5jb25zdCB2YWxpZGF0ZVN0eWxlID0gcmVxdWlyZSgnLi92YWxpZGF0ZV9zdHlsZScpO1xuY29uc3QgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xuXG5jb25zdCB7XG4gICAgTGF5b3V0LFxuICAgIFRyYW5zaXRpb25hYmxlLFxuICAgIFRyYW5zaXRpb25pbmcsXG4gICAgUHJvcGVydGllc1xufSA9IHJlcXVpcmUoJy4vcHJvcGVydGllcycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuY29uc3QgVFJBTlNJVElPTl9TVUZGSVggPSAnLXRyYW5zaXRpb24nO1xuXG5jbGFzcyBTdHlsZUxheWVyIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IobGF5ZXIgICAgICAgICAgICAgICAgICAgICwgcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMuaWQgPSBsYXllci5pZDtcbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IGxheWVyLm1ldGFkYXRhO1xuICAgICAgICB0aGlzLnR5cGUgPSBsYXllci50eXBlO1xuICAgICAgICB0aGlzLm1pbnpvb20gPSBsYXllci5taW56b29tO1xuICAgICAgICB0aGlzLm1heHpvb20gPSBsYXllci5tYXh6b29tO1xuICAgICAgICB0aGlzLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG5cbiAgICAgICAgaWYgKGxheWVyLnR5cGUgIT09ICdiYWNrZ3JvdW5kJykge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBsYXllci5zb3VyY2U7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUxheWVyID0gbGF5ZXJbJ3NvdXJjZS1sYXllciddO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBsYXllci5maWx0ZXI7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9mZWF0dXJlRmlsdGVyID0gKCkgPT4gdHJ1ZTtcblxuICAgICAgICBpZiAocHJvcGVydGllcy5sYXlvdXQpIHtcbiAgICAgICAgICAgIHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0ID0gbmV3IExheW91dChwcm9wZXJ0aWVzLmxheW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50ID0gbmV3IFRyYW5zaXRpb25hYmxlKHByb3BlcnRpZXMucGFpbnQpO1xuXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gbGF5ZXIucGFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UGFpbnRQcm9wZXJ0eShwcm9wZXJ0eSwgbGF5ZXIucGFpbnRbcHJvcGVydHldLCB7dmFsaWRhdGU6IGZhbHNlfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBsYXllci5sYXlvdXQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0TGF5b3V0UHJvcGVydHkocHJvcGVydHksIGxheWVyLmxheW91dFtwcm9wZXJ0eV0sIHt2YWxpZGF0ZTogZmFsc2V9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25pbmdQYWludCA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQudW50cmFuc2l0aW9uZWQoKTtcbiAgICB9XG5cbiAgICBnZXRMYXlvdXRQcm9wZXJ0eShuYW1lICAgICAgICApIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICd2aXNpYmlsaXR5Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJpbGl0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl91bmV2YWx1YXRlZExheW91dC5nZXRWYWx1ZShuYW1lKTtcbiAgICB9XG5cbiAgICBzZXRMYXlvdXRQcm9wZXJ0eShuYW1lICAgICAgICAsIHZhbHVlICAgICAgICwgb3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gYGxheWVycy4ke3RoaXMuaWR9LmxheW91dC4ke25hbWV9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLmxheW91dFByb3BlcnR5LCBrZXksIG5hbWUsIHZhbHVlLCBvcHRpb25zKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuYW1lID09PSAndmlzaWJpbGl0eScpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJpbGl0eSA9IHZhbHVlID09PSAnbm9uZScgPyB2YWx1ZSA6ICd2aXNpYmxlJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0LnNldFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXRQYWludFByb3BlcnR5KG5hbWUgICAgICAgICkge1xuICAgICAgICBpZiAodXRpbC5lbmRzV2l0aChuYW1lLCBUUkFOU0lUSU9OX1NVRkZJWCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LmdldFRyYW5zaXRpb24obmFtZS5zbGljZSgwLCAtVFJBTlNJVElPTl9TVUZGSVgubGVuZ3RoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5nZXRWYWx1ZShuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFBhaW50UHJvcGVydHkobmFtZSAgICAgICAgLCB2YWx1ZSAgICAgICAsIG9wdGlvbnMgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGBsYXllcnMuJHt0aGlzLmlkfS5wYWludC4ke25hbWV9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLnBhaW50UHJvcGVydHksIGtleSwgbmFtZSwgdmFsdWUsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWwuZW5kc1dpdGgobmFtZSwgVFJBTlNJVElPTl9TVUZGSVgpKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LnNldFRyYW5zaXRpb24obmFtZS5zbGljZSgwLCAtVFJBTlNJVElPTl9TVUZGSVgubGVuZ3RoKSwgKHZhbHVlICAgICApIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LnNldFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzSGlkZGVuKHpvb20gICAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5taW56b29tICYmIHpvb20gPCB0aGlzLm1pbnpvb20pIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodGhpcy5tYXh6b29tICYmIHpvb20gPj0gdGhpcy5tYXh6b29tKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJpbGl0eSA9PT0gJ25vbmUnO1xuICAgIH1cblxuICAgIHVwZGF0ZVRyYW5zaXRpb25zKHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25pbmdQYWludCA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQudHJhbnNpdGlvbmVkKHBhcmFtZXRlcnMsIHRoaXMuX3RyYW5zaXRpb25pbmdQYWludCk7XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25pbmdQYWludC5oYXNUcmFuc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgcmVjYWxjdWxhdGUocGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0KSB7XG4gICAgICAgICAgICAodGhpcyAgICAgKS5sYXlvdXQgPSB0aGlzLl91bmV2YWx1YXRlZExheW91dC5wb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgKHRoaXMgICAgICkucGFpbnQgPSB0aGlzLl90cmFuc2l0aW9uaW5nUGFpbnQucG9zc2libHlFdmFsdWF0ZShwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCAgICAgICA9IHtcbiAgICAgICAgICAgICdpZCc6IHRoaXMuaWQsXG4gICAgICAgICAgICAndHlwZSc6IHRoaXMudHlwZSxcbiAgICAgICAgICAgICdzb3VyY2UnOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgICdzb3VyY2UtbGF5ZXInOiB0aGlzLnNvdXJjZUxheWVyLFxuICAgICAgICAgICAgJ21ldGFkYXRhJzogdGhpcy5tZXRhZGF0YSxcbiAgICAgICAgICAgICdtaW56b29tJzogdGhpcy5taW56b29tLFxuICAgICAgICAgICAgJ21heHpvb20nOiB0aGlzLm1heHpvb20sXG4gICAgICAgICAgICAnZmlsdGVyJzogdGhpcy5maWx0ZXIsXG4gICAgICAgICAgICAnbGF5b3V0JzogdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQgJiYgdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQuc2VyaWFsaXplKCksXG4gICAgICAgICAgICAncGFpbnQnOiB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50ICYmIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuc2VyaWFsaXplKClcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy52aXNpYmlsaXR5ID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIG91dHB1dC5sYXlvdXQgPSBvdXRwdXQubGF5b3V0IHx8IHt9O1xuICAgICAgICAgICAgb3V0cHV0LmxheW91dC52aXNpYmlsaXR5ID0gJ25vbmUnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHV0aWwuZmlsdGVyT2JqZWN0KG91dHB1dCwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgIShrZXkgPT09ICdsYXlvdXQnICYmICFPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoKSAmJlxuICAgICAgICAgICAgICAgICEoa2V5ID09PSAncGFpbnQnICYmICFPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlKHZhbGlkYXRlICAgICAgICAgICwga2V5ICAgICAgICAsIG5hbWUgICAgICAgICwgdmFsdWUgICAgICAgLCBvcHRpb25zICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudmFsaWRhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3R5bGUuZW1pdEVycm9ycyh0aGlzLCB2YWxpZGF0ZS5jYWxsKHZhbGlkYXRlU3R5bGUsIHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgbGF5ZXJUeXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBvYmplY3RLZXk6IG5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IHN0eWxlU3BlYyxcbiAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yNDA3XG4gICAgICAgICAgICBzdHlsZToge2dseXBoczogdHJ1ZSwgc3ByaXRlOiB0cnVlfVxuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgaGFzT2Zmc2NyZWVuUGFzcygpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJlc2l6ZSgpIHtcbiAgICAgICAgLy8gbm9vcFxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTdHlsZUxheWVyO1xuXG5jb25zdCBzdWJjbGFzc2VzID0ge1xuICAgICdjaXJjbGUnOiByZXF1aXJlKCcuL3N0eWxlX2xheWVyL2NpcmNsZV9zdHlsZV9sYXllcicpLFxuICAgICdoZWF0bWFwJzogcmVxdWlyZSgnLi9zdHlsZV9sYXllci9oZWF0bWFwX3N0eWxlX2xheWVyJyksXG4gICAgJ2hpbGxzaGFkZSc6IHJlcXVpcmUoJy4vc3R5bGVfbGF5ZXIvaGlsbHNoYWRlX3N0eWxlX2xheWVyJyksXG4gICAgJ2ZpbGwnOiByZXF1aXJlKCcuL3N0eWxlX2xheWVyL2ZpbGxfc3R5bGVfbGF5ZXInKSxcbiAgICAnZmlsbC1leHRydXNpb24nOiByZXF1aXJlKCcuL3N0eWxlX2xheWVyL2ZpbGxfZXh0cnVzaW9uX3N0eWxlX2xheWVyJyksXG4gICAgJ2xpbmUnOiByZXF1aXJlKCcuL3N0eWxlX2xheWVyL2xpbmVfc3R5bGVfbGF5ZXInKSxcbiAgICAnc3ltYm9sJzogcmVxdWlyZSgnLi9zdHlsZV9sYXllci9zeW1ib2xfc3R5bGVfbGF5ZXInKSxcbiAgICAnYmFja2dyb3VuZCc6IHJlcXVpcmUoJy4vc3R5bGVfbGF5ZXIvYmFja2dyb3VuZF9zdHlsZV9sYXllcicpLFxuICAgICdyYXN0ZXInOiByZXF1aXJlKCcuL3N0eWxlX2xheWVyL3Jhc3Rlcl9zdHlsZV9sYXllcicpXG59O1xuXG5TdHlsZUxheWVyLmNyZWF0ZSA9IGZ1bmN0aW9uKGxheWVyICAgICAgICAgICAgICAgICAgICApIHtcbiAgICByZXR1cm4gbmV3IHN1YmNsYXNzZXNbbGF5ZXIudHlwZV0obGF5ZXIpO1xufTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IFN0eWxlTGF5ZXIgPSByZXF1aXJlKCcuLi9zdHlsZV9sYXllcicpO1xuY29uc3QgcHJvcGVydGllcyA9IHJlcXVpcmUoJy4vYmFja2dyb3VuZF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJyk7XG5cbmNvbnN0IHtcbiAgICBUcmFuc2l0aW9uYWJsZSxcbiAgICBUcmFuc2l0aW9uaW5nLFxuICAgIFBvc3NpYmx5RXZhbHVhdGVkXG59ID0gcmVxdWlyZSgnLi4vcHJvcGVydGllcycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jbGFzcyBCYWNrZ3JvdW5kU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgc3VwZXIobGF5ZXIsIHByb3BlcnRpZXMpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrZ3JvdW5kU3R5bGVMYXllcjtcbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQuIEVkaXQgYnVpbGQvZ2VuZXJhdGUtc3R5bGUtY29kZS5qcywgdGhlbiBydW4gYHlhcm4gcnVuIGNvZGVnZW5gLlxuLy8gICAgICBcbi8qIGVzbGludC1kaXNhYmxlICovXG5cbmNvbnN0IHN0eWxlU3BlYyA9IHJlcXVpcmUoJy4uLy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdCcpO1xuXG5jb25zdCB7XG4gICAgUHJvcGVydGllcyxcbiAgICBEYXRhQ29uc3RhbnRQcm9wZXJ0eSxcbiAgICBEYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIEhlYXRtYXBDb2xvclByb3BlcnR5XG59ID0gcmVxdWlyZSgnLi4vcHJvcGVydGllcycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgIFxuXG5jb25zdCBwYWludCAgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcImJhY2tncm91bmQtY29sb3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2JhY2tncm91bmRcIl1bXCJiYWNrZ3JvdW5kLWNvbG9yXCJdKSxcbiAgICBcImJhY2tncm91bmQtcGF0dGVyblwiOiBuZXcgQ3Jvc3NGYWRlZFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2JhY2tncm91bmRcIl1bXCJiYWNrZ3JvdW5kLXBhdHRlcm5cIl0pLFxuICAgIFwiYmFja2dyb3VuZC1vcGFjaXR5XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9iYWNrZ3JvdW5kXCJdW1wiYmFja2dyb3VuZC1vcGFjaXR5XCJdKSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgcGFpbnQgfTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IFN0eWxlTGF5ZXIgPSByZXF1aXJlKCcuLi9zdHlsZV9sYXllcicpO1xuY29uc3QgQ2lyY2xlQnVja2V0ID0gcmVxdWlyZSgnLi4vLi4vZGF0YS9idWNrZXQvY2lyY2xlX2J1Y2tldCcpO1xuY29uc3Qge211bHRpUG9seWdvbkludGVyc2VjdHNCdWZmZXJlZE11bHRpUG9pbnR9ID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9pbnRlcnNlY3Rpb25fdGVzdHMnKTtcbmNvbnN0IHtnZXRNYXhpbXVtUGFpbnRWYWx1ZSwgdHJhbnNsYXRlRGlzdGFuY2UsIHRyYW5zbGF0ZX0gPSByZXF1aXJlKCcuLi9xdWVyeV91dGlscycpO1xuY29uc3QgcHJvcGVydGllcyA9IHJlcXVpcmUoJy4vY2lyY2xlX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMnKTtcblxuY29uc3Qge1xuICAgIFRyYW5zaXRpb25hYmxlLFxuICAgIFRyYW5zaXRpb25pbmcsXG4gICAgUG9zc2libHlFdmFsdWF0ZWRcbn0gPSByZXF1aXJlKCcuLi9wcm9wZXJ0aWVzJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jbGFzcyBDaXJjbGVTdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IobGF5ZXIgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgY3JlYXRlQnVja2V0KHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaXJjbGVCdWNrZXQocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcXVlcnlSYWRpdXMoYnVja2V0ICAgICAgICApICAgICAgICAge1xuICAgICAgICBjb25zdCBjaXJjbGVCdWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChidWNrZXQgICAgICk7XG4gICAgICAgIHJldHVybiBnZXRNYXhpbXVtUGFpbnRWYWx1ZSgnY2lyY2xlLXJhZGl1cycsIHRoaXMsIGNpcmNsZUJ1Y2tldCkgK1xuICAgICAgICAgICAgZ2V0TWF4aW11bVBhaW50VmFsdWUoJ2NpcmNsZS1zdHJva2Utd2lkdGgnLCB0aGlzLCBjaXJjbGVCdWNrZXQpICtcbiAgICAgICAgICAgIHRyYW5zbGF0ZURpc3RhbmNlKHRoaXMucGFpbnQuZ2V0KCdjaXJjbGUtdHJhbnNsYXRlJykpO1xuICAgIH1cblxuICAgIHF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUocXVlcnlHZW9tZXRyeSAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFyaW5nICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNUb1RpbGVVbml0cyAgICAgICAgKSAgICAgICAgICB7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRQb2x5Z29uID0gdHJhbnNsYXRlKHF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICB0aGlzLnBhaW50LmdldCgnY2lyY2xlLXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2NpcmNsZS10cmFuc2xhdGUtYW5jaG9yJyksXG4gICAgICAgICAgICBiZWFyaW5nLCBwaXhlbHNUb1RpbGVVbml0cyk7XG4gICAgICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMucGFpbnQuZ2V0KCdjaXJjbGUtcmFkaXVzJykuZXZhbHVhdGUoZmVhdHVyZSkgKiBwaXhlbHNUb1RpbGVVbml0cztcbiAgICAgICAgY29uc3Qgc3Ryb2tlID0gdGhpcy5wYWludC5nZXQoJ2NpcmNsZS1zdHJva2Utd2lkdGgnKS5ldmFsdWF0ZShmZWF0dXJlKSAqIHBpeGVsc1RvVGlsZVVuaXRzO1xuICAgICAgICByZXR1cm4gbXVsdGlQb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkTXVsdGlQb2ludCh0cmFuc2xhdGVkUG9seWdvbiwgZ2VvbWV0cnksIHJhZGl1cyArIHN0cm9rZSk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENpcmNsZVN0eWxlTGF5ZXI7XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0eWxlLWNvZGUuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vICAgICAgXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5jb25zdCBzdHlsZVNwZWMgPSByZXF1aXJlKCcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnKTtcblxuY29uc3Qge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWRQcm9wZXJ0eSxcbiAgICBIZWF0bWFwQ29sb3JQcm9wZXJ0eVxufSA9IHJlcXVpcmUoJy4uL3Byb3BlcnRpZXMnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgXG5cbmNvbnN0IHBhaW50ICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiY2lyY2xlLXJhZGl1c1wiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS1yYWRpdXNcIl0pLFxuICAgIFwiY2lyY2xlLWNvbG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLWNvbG9yXCJdKSxcbiAgICBcImNpcmNsZS1ibHVyXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLWJsdXJcIl0pLFxuICAgIFwiY2lyY2xlLW9wYWNpdHlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9jaXJjbGVcIl1bXCJjaXJjbGUtb3BhY2l0eVwiXSksXG4gICAgXCJjaXJjbGUtdHJhbnNsYXRlXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9jaXJjbGVcIl1bXCJjaXJjbGUtdHJhbnNsYXRlXCJdKSxcbiAgICBcImNpcmNsZS10cmFuc2xhdGUtYW5jaG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9jaXJjbGVcIl1bXCJjaXJjbGUtdHJhbnNsYXRlLWFuY2hvclwiXSksXG4gICAgXCJjaXJjbGUtcGl0Y2gtc2NhbGVcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS1waXRjaC1zY2FsZVwiXSksXG4gICAgXCJjaXJjbGUtcGl0Y2gtYWxpZ25tZW50XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9jaXJjbGVcIl1bXCJjaXJjbGUtcGl0Y2gtYWxpZ25tZW50XCJdKSxcbiAgICBcImNpcmNsZS1zdHJva2Utd2lkdGhcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9jaXJjbGVcIl1bXCJjaXJjbGUtc3Ryb2tlLXdpZHRoXCJdKSxcbiAgICBcImNpcmNsZS1zdHJva2UtY29sb3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9jaXJjbGVcIl1bXCJjaXJjbGUtc3Ryb2tlLWNvbG9yXCJdKSxcbiAgICBcImNpcmNsZS1zdHJva2Utb3BhY2l0eVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS1zdHJva2Utb3BhY2l0eVwiXSksXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSB7IHBhaW50IH07XG4iLCIvLyAgICAgIFxuXG5jb25zdCBTdHlsZUxheWVyID0gcmVxdWlyZSgnLi4vc3R5bGVfbGF5ZXInKTtcbmNvbnN0IEZpbGxFeHRydXNpb25CdWNrZXQgPSByZXF1aXJlKCcuLi8uLi9kYXRhL2J1Y2tldC9maWxsX2V4dHJ1c2lvbl9idWNrZXQnKTtcbmNvbnN0IHttdWx0aVBvbHlnb25JbnRlcnNlY3RzTXVsdGlQb2x5Z29ufSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvaW50ZXJzZWN0aW9uX3Rlc3RzJyk7XG5jb25zdCB7dHJhbnNsYXRlRGlzdGFuY2UsIHRyYW5zbGF0ZX0gPSByZXF1aXJlKCcuLi9xdWVyeV91dGlscycpO1xuY29uc3QgcHJvcGVydGllcyA9IHJlcXVpcmUoJy4vZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXJfcHJvcGVydGllcycpO1xuXG5jb25zdCB7XG4gICAgVHJhbnNpdGlvbmFibGUsXG4gICAgVHJhbnNpdGlvbmluZyxcbiAgICBQb3NzaWJseUV2YWx1YXRlZFxufSA9IHJlcXVpcmUoJy4uL3Byb3BlcnRpZXMnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNsYXNzIEZpbGxFeHRydXNpb25TdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgc3VwZXIobGF5ZXIsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIGNyZWF0ZUJ1Y2tldChwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICByZXR1cm4gbmV3IEZpbGxFeHRydXNpb25CdWNrZXQocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcXVlcnlSYWRpdXMoKSAgICAgICAgIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZURpc3RhbmNlKHRoaXMucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUnKSk7XG4gICAgfVxuXG4gICAgcXVlcnlJbnRlcnNlY3RzRmVhdHVyZShxdWVyeUdlb21ldHJ5ICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZSAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeSAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb20gICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYXJpbmcgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1RvVGlsZVVuaXRzICAgICAgICApICAgICAgICAgIHtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZFBvbHlnb24gPSB0cmFuc2xhdGUocXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUnKSxcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUtYW5jaG9yJyksXG4gICAgICAgICAgICBiZWFyaW5nLCBwaXhlbHNUb1RpbGVVbml0cyk7XG4gICAgICAgIHJldHVybiBtdWx0aVBvbHlnb25JbnRlcnNlY3RzTXVsdGlQb2x5Z29uKHRyYW5zbGF0ZWRQb2x5Z29uLCBnZW9tZXRyeSk7XG4gICAgfVxuXG4gICAgaGFzT2Zmc2NyZWVuUGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5JykgIT09IDAgJiYgdGhpcy52aXNpYmlsaXR5ICE9PSAnbm9uZSc7XG4gICAgfVxuXG4gICAgcmVzaXplKCkge1xuICAgICAgICBpZiAodGhpcy52aWV3cG9ydEZyYW1lKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0RnJhbWUuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy52aWV3cG9ydEZyYW1lID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBGaWxsRXh0cnVzaW9uU3R5bGVMYXllcjtcbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQuIEVkaXQgYnVpbGQvZ2VuZXJhdGUtc3R5bGUtY29kZS5qcywgdGhlbiBydW4gYHlhcm4gcnVuIGNvZGVnZW5gLlxuLy8gICAgICBcbi8qIGVzbGludC1kaXNhYmxlICovXG5cbmNvbnN0IHN0eWxlU3BlYyA9IHJlcXVpcmUoJy4uLy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdCcpO1xuXG5jb25zdCB7XG4gICAgUHJvcGVydGllcyxcbiAgICBEYXRhQ29uc3RhbnRQcm9wZXJ0eSxcbiAgICBEYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIEhlYXRtYXBDb2xvclByb3BlcnR5XG59ID0gcmVxdWlyZSgnLi4vcHJvcGVydGllcycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgIFxuXG5jb25zdCBwYWludCAgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcImZpbGwtZXh0cnVzaW9uLW9wYWNpdHlcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tb3BhY2l0eVwiXSksXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tY29sb3JcIl0pLFxuICAgIFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZVwiXSksXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUtYW5jaG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxuICAgIFwiZmlsbC1leHRydXNpb24tcGF0dGVyblwiOiBuZXcgQ3Jvc3NGYWRlZFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tcGF0dGVyblwiXSksXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1oZWlnaHRcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLWhlaWdodFwiXSksXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1iYXNlXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi1iYXNlXCJdKSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgcGFpbnQgfTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IFN0eWxlTGF5ZXIgPSByZXF1aXJlKCcuLi9zdHlsZV9sYXllcicpO1xuY29uc3QgRmlsbEJ1Y2tldCA9IHJlcXVpcmUoJy4uLy4uL2RhdGEvYnVja2V0L2ZpbGxfYnVja2V0Jyk7XG5jb25zdCB7bXVsdGlQb2x5Z29uSW50ZXJzZWN0c011bHRpUG9seWdvbn0gPSByZXF1aXJlKCcuLi8uLi91dGlsL2ludGVyc2VjdGlvbl90ZXN0cycpO1xuY29uc3Qge3RyYW5zbGF0ZURpc3RhbmNlLCB0cmFuc2xhdGV9ID0gcmVxdWlyZSgnLi4vcXVlcnlfdXRpbHMnKTtcbmNvbnN0IHByb3BlcnRpZXMgPSByZXF1aXJlKCcuL2ZpbGxfc3R5bGVfbGF5ZXJfcHJvcGVydGllcycpO1xuXG5jb25zdCB7XG4gICAgVHJhbnNpdGlvbmFibGUsXG4gICAgVHJhbnNpdGlvbmluZyxcbiAgICBQb3NzaWJseUV2YWx1YXRlZFxufSA9IHJlcXVpcmUoJy4uL3Byb3BlcnRpZXMnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNsYXNzIEZpbGxTdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IobGF5ZXIgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgcmVjYWxjdWxhdGUocGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5wYWludCA9IHRoaXMuX3RyYW5zaXRpb25pbmdQYWludC5wb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnMpO1xuXG4gICAgICAgIGlmICh0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LmdldFZhbHVlKCdmaWxsLW91dGxpbmUtY29sb3InKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnBhaW50Ll92YWx1ZXNbJ2ZpbGwtb3V0bGluZS1jb2xvciddID0gdGhpcy5wYWludC5fdmFsdWVzWydmaWxsLWNvbG9yJ107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVCdWNrZXQocGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICByZXR1cm4gbmV3IEZpbGxCdWNrZXQocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcXVlcnlSYWRpdXMoKSAgICAgICAgIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZURpc3RhbmNlKHRoaXMucGFpbnQuZ2V0KCdmaWxsLXRyYW5zbGF0ZScpKTtcbiAgICB9XG5cbiAgICBxdWVyeUludGVyc2VjdHNGZWF0dXJlKHF1ZXJ5R2VvbWV0cnkgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbSAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhcmluZyAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzVG9UaWxlVW5pdHMgICAgICAgICkgICAgICAgICAge1xuICAgICAgICBjb25zdCB0cmFuc2xhdGVkUG9seWdvbiA9IHRyYW5zbGF0ZShxdWVyeUdlb21ldHJ5LFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2ZpbGwtdHJhbnNsYXRlJyksXG4gICAgICAgICAgICB0aGlzLnBhaW50LmdldCgnZmlsbC10cmFuc2xhdGUtYW5jaG9yJyksXG4gICAgICAgICAgICBiZWFyaW5nLCBwaXhlbHNUb1RpbGVVbml0cyk7XG4gICAgICAgIHJldHVybiBtdWx0aVBvbHlnb25JbnRlcnNlY3RzTXVsdGlQb2x5Z29uKHRyYW5zbGF0ZWRQb2x5Z29uLCBnZW9tZXRyeSk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEZpbGxTdHlsZUxheWVyO1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyAgICAgIFxuLyogZXNsaW50LWRpc2FibGUgKi9cblxuY29uc3Qgc3R5bGVTcGVjID0gcmVxdWlyZSgnLi4vLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0Jyk7XG5cbmNvbnN0IHtcbiAgICBQcm9wZXJ0aWVzLFxuICAgIERhdGFDb25zdGFudFByb3BlcnR5LFxuICAgIERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkUHJvcGVydHksXG4gICAgSGVhdG1hcENvbG9yUHJvcGVydHlcbn0gPSByZXF1aXJlKCcuLi9wcm9wZXJ0aWVzJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICBcblxuY29uc3QgcGFpbnQgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJmaWxsLWFudGlhbGlhc1wiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbFwiXVtcImZpbGwtYW50aWFsaWFzXCJdKSxcbiAgICBcImZpbGwtb3BhY2l0eVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGxcIl1bXCJmaWxsLW9wYWNpdHlcIl0pLFxuICAgIFwiZmlsbC1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGxcIl1bXCJmaWxsLWNvbG9yXCJdKSxcbiAgICBcImZpbGwtb3V0bGluZS1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGxcIl1bXCJmaWxsLW91dGxpbmUtY29sb3JcIl0pLFxuICAgIFwiZmlsbC10cmFuc2xhdGVcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGxcIl1bXCJmaWxsLXRyYW5zbGF0ZVwiXSksXG4gICAgXCJmaWxsLXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGxcIl1bXCJmaWxsLXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxuICAgIFwiZmlsbC1wYXR0ZXJuXCI6IG5ldyBDcm9zc0ZhZGVkUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbFwiXVtcImZpbGwtcGF0dGVyblwiXSksXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSB7IHBhaW50IH07XG4iLCIvLyAgICAgIFxuXG5jb25zdCBTdHlsZUxheWVyID0gcmVxdWlyZSgnLi4vc3R5bGVfbGF5ZXInKTtcbmNvbnN0IEhlYXRtYXBCdWNrZXQgPSByZXF1aXJlKCcuLi8uLi9kYXRhL2J1Y2tldC9oZWF0bWFwX2J1Y2tldCcpO1xuY29uc3QgUkdCQUltYWdlID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9pbWFnZScpLlJHQkFJbWFnZTtcbmNvbnN0IHByb3BlcnRpZXMgPSByZXF1aXJlKCcuL2hlYXRtYXBfc3R5bGVfbGF5ZXJfcHJvcGVydGllcycpO1xuXG5jb25zdCB7XG4gICAgVHJhbnNpdGlvbmFibGUsXG4gICAgVHJhbnNpdGlvbmluZyxcbiAgICBQb3NzaWJseUV2YWx1YXRlZFxufSA9IHJlcXVpcmUoJy4uL3Byb3BlcnRpZXMnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jbGFzcyBIZWF0bWFwU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY3JlYXRlQnVja2V0KG9wdGlvbnMgICAgICkge1xuICAgICAgICByZXR1cm4gbmV3IEhlYXRtYXBCdWNrZXQob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IobGF5ZXIgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG5cbiAgICAgICAgLy8gbWFrZSBzdXJlIGNvbG9yIHJhbXAgdGV4dHVyZSBpcyBnZW5lcmF0ZWQgZm9yIGRlZmF1bHQgaGVhdG1hcCBjb2xvciB0b29cbiAgICAgICAgdGhpcy5fdXBkYXRlQ29sb3JSYW1wKCk7XG4gICAgfVxuXG4gICAgc2V0UGFpbnRQcm9wZXJ0eShuYW1lICAgICAgICAsIHZhbHVlICAgICAgICwgb3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBzdXBlci5zZXRQYWludFByb3BlcnR5KG5hbWUsIHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdoZWF0bWFwLWNvbG9yJykge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29sb3JSYW1wKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlQ29sb3JSYW1wKCkge1xuICAgICAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzWydoZWF0bWFwLWNvbG9yJ10udmFsdWUuZXhwcmVzc2lvbjtcbiAgICAgICAgY29uc3QgY29sb3JSYW1wRGF0YSA9IG5ldyBVaW50OEFycmF5KDI1NiAqIDQpO1xuICAgICAgICBjb25zdCBsZW4gPSBjb2xvclJhbXBEYXRhLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDQ7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgICAgICAgICAgY29uc3QgcHhDb2xvciA9IGV4cHJlc3Npb24uZXZhbHVhdGUoKHtoZWF0bWFwRGVuc2l0eTogaSAvIGxlbn0gICAgICkpO1xuICAgICAgICAgICAgLy8gdGhlIGNvbG9ycyBhcmUgYmVpbmcgdW5wcmVtdWx0aXBsaWVkIGJlY2F1c2UgQ29sb3IgdXNlc1xuICAgICAgICAgICAgLy8gcHJlbXVsdGlwbGllZCB2YWx1ZXMsIGFuZCB0aGUgVGV4dHVyZSBjbGFzcyBleHBlY3RzIHVucHJlbXVsdGlwbGllZCBvbmVzXG4gICAgICAgICAgICBjb2xvclJhbXBEYXRhW2kgKyAwXSA9IE1hdGguZmxvb3IocHhDb2xvci5yICogMjU1IC8gcHhDb2xvci5hKTtcbiAgICAgICAgICAgIGNvbG9yUmFtcERhdGFbaSArIDFdID0gTWF0aC5mbG9vcihweENvbG9yLmcgKiAyNTUgLyBweENvbG9yLmEpO1xuICAgICAgICAgICAgY29sb3JSYW1wRGF0YVtpICsgMl0gPSBNYXRoLmZsb29yKHB4Q29sb3IuYiAqIDI1NSAvIHB4Q29sb3IuYSk7XG4gICAgICAgICAgICBjb2xvclJhbXBEYXRhW2kgKyAzXSA9IE1hdGguZmxvb3IocHhDb2xvci5hICogMjU1KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbG9yUmFtcCA9IG5ldyBSR0JBSW1hZ2Uoe3dpZHRoOiAyNTYsIGhlaWdodDogMX0sIGNvbG9yUmFtcERhdGEpO1xuICAgICAgICB0aGlzLmNvbG9yUmFtcFRleHR1cmUgPSBudWxsO1xuICAgIH1cblxuICAgIHJlc2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGVhdG1hcEZibykge1xuICAgICAgICAgICAgdGhpcy5oZWF0bWFwRmJvLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuaGVhdG1hcEZibyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBxdWVyeVJhZGl1cygpICAgICAgICAge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBxdWVyeUludGVyc2VjdHNGZWF0dXJlKCkgICAgICAgICAgIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGhhc09mZnNjcmVlblBhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhaW50LmdldCgnaGVhdG1hcC1vcGFjaXR5JykgIT09IDAgJiYgdGhpcy52aXNpYmlsaXR5ICE9PSAnbm9uZSc7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEhlYXRtYXBTdHlsZUxheWVyO1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyAgICAgIFxuLyogZXNsaW50LWRpc2FibGUgKi9cblxuY29uc3Qgc3R5bGVTcGVjID0gcmVxdWlyZSgnLi4vLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0Jyk7XG5cbmNvbnN0IHtcbiAgICBQcm9wZXJ0aWVzLFxuICAgIERhdGFDb25zdGFudFByb3BlcnR5LFxuICAgIERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkUHJvcGVydHksXG4gICAgSGVhdG1hcENvbG9yUHJvcGVydHlcbn0gPSByZXF1aXJlKCcuLi9wcm9wZXJ0aWVzJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgXG5cbmNvbnN0IHBhaW50ICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiaGVhdG1hcC1yYWRpdXNcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oZWF0bWFwXCJdW1wiaGVhdG1hcC1yYWRpdXNcIl0pLFxuICAgIFwiaGVhdG1hcC13ZWlnaHRcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oZWF0bWFwXCJdW1wiaGVhdG1hcC13ZWlnaHRcIl0pLFxuICAgIFwiaGVhdG1hcC1pbnRlbnNpdHlcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hlYXRtYXBcIl1bXCJoZWF0bWFwLWludGVuc2l0eVwiXSksXG4gICAgXCJoZWF0bWFwLWNvbG9yXCI6IG5ldyBIZWF0bWFwQ29sb3JQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oZWF0bWFwXCJdW1wiaGVhdG1hcC1jb2xvclwiXSksXG4gICAgXCJoZWF0bWFwLW9wYWNpdHlcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hlYXRtYXBcIl1bXCJoZWF0bWFwLW9wYWNpdHlcIl0pLFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0geyBwYWludCB9O1xuIiwiLy8gICAgICBcblxuY29uc3QgU3R5bGVMYXllciA9IHJlcXVpcmUoJy4uL3N0eWxlX2xheWVyJyk7XG5jb25zdCBwcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi9oaWxsc2hhZGVfc3R5bGVfbGF5ZXJfcHJvcGVydGllcycpO1xuXG5jb25zdCB7XG4gICAgVHJhbnNpdGlvbmFibGUsXG4gICAgVHJhbnNpdGlvbmluZyxcbiAgICBQb3NzaWJseUV2YWx1YXRlZFxufSA9IHJlcXVpcmUoJy4uL3Byb3BlcnRpZXMnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jbGFzcyBIaWxsc2hhZGVTdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IobGF5ZXIgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgaGFzT2Zmc2NyZWVuUGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFpbnQuZ2V0KCdoaWxsc2hhZGUtZXhhZ2dlcmF0aW9uJykgIT09IDAgJiYgdGhpcy52aXNpYmlsaXR5ICE9PSAnbm9uZSc7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEhpbGxzaGFkZVN0eWxlTGF5ZXI7XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0eWxlLWNvZGUuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vICAgICAgXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5jb25zdCBzdHlsZVNwZWMgPSByZXF1aXJlKCcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnKTtcblxuY29uc3Qge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWRQcm9wZXJ0eSxcbiAgICBIZWF0bWFwQ29sb3JQcm9wZXJ0eVxufSA9IHJlcXVpcmUoJy4uL3Byb3BlcnRpZXMnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgXG5cbmNvbnN0IHBhaW50ICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1kaXJlY3Rpb25cIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hpbGxzaGFkZVwiXVtcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tZGlyZWN0aW9uXCJdKSxcbiAgICBcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tYW5jaG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oaWxsc2hhZGVcIl1bXCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWFuY2hvclwiXSksXG4gICAgXCJoaWxsc2hhZGUtZXhhZ2dlcmF0aW9uXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oaWxsc2hhZGVcIl1bXCJoaWxsc2hhZGUtZXhhZ2dlcmF0aW9uXCJdKSxcbiAgICBcImhpbGxzaGFkZS1zaGFkb3ctY29sb3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hpbGxzaGFkZVwiXVtcImhpbGxzaGFkZS1zaGFkb3ctY29sb3JcIl0pLFxuICAgIFwiaGlsbHNoYWRlLWhpZ2hsaWdodC1jb2xvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGlsbHNoYWRlXCJdW1wiaGlsbHNoYWRlLWhpZ2hsaWdodC1jb2xvclwiXSksXG4gICAgXCJoaWxsc2hhZGUtYWNjZW50LWNvbG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oaWxsc2hhZGVcIl1bXCJoaWxsc2hhZGUtYWNjZW50LWNvbG9yXCJdKSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgcGFpbnQgfTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IFBvaW50ID0gcmVxdWlyZSgnQG1hcGJveC9wb2ludC1nZW9tZXRyeScpO1xuXG5jb25zdCBTdHlsZUxheWVyID0gcmVxdWlyZSgnLi4vc3R5bGVfbGF5ZXInKTtcbmNvbnN0IExpbmVCdWNrZXQgPSByZXF1aXJlKCcuLi8uLi9kYXRhL2J1Y2tldC9saW5lX2J1Y2tldCcpO1xuY29uc3Qge211bHRpUG9seWdvbkludGVyc2VjdHNCdWZmZXJlZE11bHRpTGluZX0gPSByZXF1aXJlKCcuLi8uLi91dGlsL2ludGVyc2VjdGlvbl90ZXN0cycpO1xuY29uc3Qge2dldE1heGltdW1QYWludFZhbHVlLCB0cmFuc2xhdGVEaXN0YW5jZSwgdHJhbnNsYXRlfSA9IHJlcXVpcmUoJy4uL3F1ZXJ5X3V0aWxzJyk7XG5jb25zdCBwcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi9saW5lX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMnKTtcbmNvbnN0IHtleHRlbmR9ID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG5jb25zdCBFdmFsdWF0aW9uUGFyYW1ldGVycyA9IHJlcXVpcmUoJy4uL2V2YWx1YXRpb25fcGFyYW1ldGVycycpO1xuXG5jb25zdCB7XG4gICAgVHJhbnNpdGlvbmFibGUsXG4gICAgVHJhbnNpdGlvbmluZyxcbiAgICBMYXlvdXQsXG4gICAgUG9zc2libHlFdmFsdWF0ZWQsXG4gICAgRGF0YURyaXZlblByb3BlcnR5XG59ID0gcmVxdWlyZSgnLi4vcHJvcGVydGllcycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuY2xhc3MgTGluZUZsb29yd2lkdGhQcm9wZXJ0eSBleHRlbmRzIERhdGFEcml2ZW5Qcm9wZXJ0eSAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWUsIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgcGFyYW1ldGVycyA9IG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhNYXRoLmZsb29yKHBhcmFtZXRlcnMuem9vbSksIHtcbiAgICAgICAgICAgIG5vdzogcGFyYW1ldGVycy5ub3csXG4gICAgICAgICAgICBmYWRlRHVyYXRpb246IHBhcmFtZXRlcnMuZmFkZUR1cmF0aW9uLFxuICAgICAgICAgICAgem9vbUhpc3Rvcnk6IHBhcmFtZXRlcnMuem9vbUhpc3RvcnksXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiBwYXJhbWV0ZXJzLnRyYW5zaXRpb25cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzdXBlci5wb3NzaWJseUV2YWx1YXRlKHZhbHVlLCBwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZSh2YWx1ZSwgZ2xvYmFscywgZmVhdHVyZSkge1xuICAgICAgICBnbG9iYWxzID0gZXh0ZW5kKHt9LCBnbG9iYWxzLCB7em9vbTogTWF0aC5mbG9vcihnbG9iYWxzLnpvb20pfSk7XG4gICAgICAgIHJldHVybiBzdXBlci5ldmFsdWF0ZSh2YWx1ZSwgZ2xvYmFscywgZmVhdHVyZSk7XG4gICAgfVxufVxuXG5jb25zdCBsaW5lRmxvb3J3aWR0aFByb3BlcnR5ID0gbmV3IExpbmVGbG9vcndpZHRoUHJvcGVydHkocHJvcGVydGllcy5wYWludC5wcm9wZXJ0aWVzWydsaW5lLXdpZHRoJ10uc3BlY2lmaWNhdGlvbik7XG5saW5lRmxvb3J3aWR0aFByb3BlcnR5LnVzZUludGVnZXJab29tID0gdHJ1ZTtcblxuY2xhc3MgTGluZVN0eWxlTGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihsYXllciAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHN1cGVyKGxheWVyLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICByZWNhbGN1bGF0ZShwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBzdXBlci5yZWNhbGN1bGF0ZShwYXJhbWV0ZXJzKTtcblxuICAgICAgICAodGhpcy5wYWludC5fdmFsdWVzICAgICApWydsaW5lLWZsb29yd2lkdGgnXSA9XG4gICAgICAgICAgICBsaW5lRmxvb3J3aWR0aFByb3BlcnR5LnBvc3NpYmx5RXZhbHVhdGUodGhpcy5fdHJhbnNpdGlvbmluZ1BhaW50Ll92YWx1ZXNbJ2xpbmUtd2lkdGgnXS52YWx1ZSwgcGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgY3JlYXRlQnVja2V0KHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lQnVja2V0KHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHF1ZXJ5UmFkaXVzKGJ1Y2tldCAgICAgICAgKSAgICAgICAgIHtcbiAgICAgICAgY29uc3QgbGluZUJ1Y2tldCAgICAgICAgICAgICA9IChidWNrZXQgICAgICk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gZ2V0TGluZVdpZHRoKFxuICAgICAgICAgICAgZ2V0TWF4aW11bVBhaW50VmFsdWUoJ2xpbmUtd2lkdGgnLCB0aGlzLCBsaW5lQnVja2V0KSxcbiAgICAgICAgICAgIGdldE1heGltdW1QYWludFZhbHVlKCdsaW5lLWdhcC13aWR0aCcsIHRoaXMsIGxpbmVCdWNrZXQpKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gZ2V0TWF4aW11bVBhaW50VmFsdWUoJ2xpbmUtb2Zmc2V0JywgdGhpcywgbGluZUJ1Y2tldCk7XG4gICAgICAgIHJldHVybiB3aWR0aCAvIDIgKyBNYXRoLmFicyhvZmZzZXQpICsgdHJhbnNsYXRlRGlzdGFuY2UodGhpcy5wYWludC5nZXQoJ2xpbmUtdHJhbnNsYXRlJykpO1xuICAgIH1cblxuICAgIHF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUocXVlcnlHZW9tZXRyeSAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFyaW5nICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNUb1RpbGVVbml0cyAgICAgICAgKSAgICAgICAgICB7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRQb2x5Z29uID0gdHJhbnNsYXRlKHF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICB0aGlzLnBhaW50LmdldCgnbGluZS10cmFuc2xhdGUnKSxcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdsaW5lLXRyYW5zbGF0ZS1hbmNob3InKSxcbiAgICAgICAgICAgIGJlYXJpbmcsIHBpeGVsc1RvVGlsZVVuaXRzKTtcbiAgICAgICAgY29uc3QgaGFsZldpZHRoID0gcGl4ZWxzVG9UaWxlVW5pdHMgLyAyICogZ2V0TGluZVdpZHRoKFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2xpbmUtd2lkdGgnKS5ldmFsdWF0ZShmZWF0dXJlKSxcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdsaW5lLWdhcC13aWR0aCcpLmV2YWx1YXRlKGZlYXR1cmUpKTtcbiAgICAgICAgY29uc3QgbGluZU9mZnNldCA9IHRoaXMucGFpbnQuZ2V0KCdsaW5lLW9mZnNldCcpLmV2YWx1YXRlKGZlYXR1cmUpO1xuICAgICAgICBpZiAobGluZU9mZnNldCkge1xuICAgICAgICAgICAgZ2VvbWV0cnkgPSBvZmZzZXRMaW5lKGdlb21ldHJ5LCBsaW5lT2Zmc2V0ICogcGl4ZWxzVG9UaWxlVW5pdHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtdWx0aVBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRNdWx0aUxpbmUodHJhbnNsYXRlZFBvbHlnb24sIGdlb21ldHJ5LCBoYWxmV2lkdGgpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBMaW5lU3R5bGVMYXllcjtcblxuZnVuY3Rpb24gZ2V0TGluZVdpZHRoKGxpbmVXaWR0aCwgbGluZUdhcFdpZHRoKSB7XG4gICAgaWYgKGxpbmVHYXBXaWR0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGxpbmVHYXBXaWR0aCArIDIgKiBsaW5lV2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGxpbmVXaWR0aDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG9mZnNldExpbmUocmluZ3MsIG9mZnNldCkge1xuICAgIGNvbnN0IG5ld1JpbmdzID0gW107XG4gICAgY29uc3QgemVybyA9IG5ldyBQb2ludCgwLCAwKTtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IHJpbmdzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNvbnN0IHJpbmcgPSByaW5nc1trXTtcbiAgICAgICAgY29uc3QgbmV3UmluZyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSByaW5nW2kgLSAxXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSByaW5nW2ldO1xuICAgICAgICAgICAgY29uc3QgYyA9IHJpbmdbaSArIDFdO1xuICAgICAgICAgICAgY29uc3QgYVRvQiA9IGkgPT09IDAgPyB6ZXJvIDogYi5zdWIoYSkuX3VuaXQoKS5fcGVycCgpO1xuICAgICAgICAgICAgY29uc3QgYlRvQyA9IGkgPT09IHJpbmcubGVuZ3RoIC0gMSA/IHplcm8gOiBjLnN1YihiKS5fdW5pdCgpLl9wZXJwKCk7XG4gICAgICAgICAgICBjb25zdCBleHRydWRlID0gYVRvQi5fYWRkKGJUb0MpLl91bml0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvc0hhbGZBbmdsZSA9IGV4dHJ1ZGUueCAqIGJUb0MueCArIGV4dHJ1ZGUueSAqIGJUb0MueTtcbiAgICAgICAgICAgIGV4dHJ1ZGUuX211bHQoMSAvIGNvc0hhbGZBbmdsZSk7XG5cbiAgICAgICAgICAgIG5ld1JpbmcucHVzaChleHRydWRlLl9tdWx0KG9mZnNldCkuX2FkZChiKSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3UmluZ3MucHVzaChuZXdSaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1JpbmdzO1xufVxuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyAgICAgIFxuLyogZXNsaW50LWRpc2FibGUgKi9cblxuY29uc3Qgc3R5bGVTcGVjID0gcmVxdWlyZSgnLi4vLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0Jyk7XG5cbmNvbnN0IHtcbiAgICBQcm9wZXJ0aWVzLFxuICAgIERhdGFDb25zdGFudFByb3BlcnR5LFxuICAgIERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkUHJvcGVydHksXG4gICAgSGVhdG1hcENvbG9yUHJvcGVydHlcbn0gPSByZXF1aXJlKCcuLi9wcm9wZXJ0aWVzJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgXG5cbmNvbnN0IGxheW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJsaW5lLWNhcFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X2xpbmVcIl1bXCJsaW5lLWNhcFwiXSksXG4gICAgXCJsaW5lLWpvaW5cIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfbGluZVwiXVtcImxpbmUtam9pblwiXSksXG4gICAgXCJsaW5lLW1pdGVyLWxpbWl0XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfbGluZVwiXVtcImxpbmUtbWl0ZXItbGltaXRcIl0pLFxuICAgIFwibGluZS1yb3VuZC1saW1pdFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X2xpbmVcIl1bXCJsaW5lLXJvdW5kLWxpbWl0XCJdKSxcbn0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICBcblxuY29uc3QgcGFpbnQgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJsaW5lLW9wYWNpdHlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9saW5lXCJdW1wibGluZS1vcGFjaXR5XCJdKSxcbiAgICBcImxpbmUtY29sb3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9saW5lXCJdW1wibGluZS1jb2xvclwiXSksXG4gICAgXCJsaW5lLXRyYW5zbGF0ZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtdHJhbnNsYXRlXCJdKSxcbiAgICBcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiXSksXG4gICAgXCJsaW5lLXdpZHRoXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtd2lkdGhcIl0pLFxuICAgIFwibGluZS1nYXAtd2lkdGhcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9saW5lXCJdW1wibGluZS1nYXAtd2lkdGhcIl0pLFxuICAgIFwibGluZS1vZmZzZXRcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9saW5lXCJdW1wibGluZS1vZmZzZXRcIl0pLFxuICAgIFwibGluZS1ibHVyXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtYmx1clwiXSksXG4gICAgXCJsaW5lLWRhc2hhcnJheVwiOiBuZXcgQ3Jvc3NGYWRlZFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLWRhc2hhcnJheVwiXSksXG4gICAgXCJsaW5lLXBhdHRlcm5cIjogbmV3IENyb3NzRmFkZWRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9saW5lXCJdW1wibGluZS1wYXR0ZXJuXCJdKSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgcGFpbnQsIGxheW91dCB9O1xuIiwiLy8gICAgICBcblxuY29uc3QgU3R5bGVMYXllciA9IHJlcXVpcmUoJy4uL3N0eWxlX2xheWVyJyk7XG5jb25zdCBwcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi9yYXN0ZXJfc3R5bGVfbGF5ZXJfcHJvcGVydGllcycpO1xuXG5jb25zdCB7XG4gICAgVHJhbnNpdGlvbmFibGUsXG4gICAgVHJhbnNpdGlvbmluZyxcbiAgICBQb3NzaWJseUV2YWx1YXRlZFxufSA9IHJlcXVpcmUoJy4uL3Byb3BlcnRpZXMnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jbGFzcyBSYXN0ZXJTdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IobGF5ZXIgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJhc3RlclN0eWxlTGF5ZXI7XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0eWxlLWNvZGUuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vICAgICAgXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5jb25zdCBzdHlsZVNwZWMgPSByZXF1aXJlKCcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnKTtcblxuY29uc3Qge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWRQcm9wZXJ0eSxcbiAgICBIZWF0bWFwQ29sb3JQcm9wZXJ0eVxufSA9IHJlcXVpcmUoJy4uL3Byb3BlcnRpZXMnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgXG5cbmNvbnN0IHBhaW50ICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwicmFzdGVyLW9wYWNpdHlcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1vcGFjaXR5XCJdKSxcbiAgICBcInJhc3Rlci1odWUtcm90YXRlXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9yYXN0ZXJcIl1bXCJyYXN0ZXItaHVlLXJvdGF0ZVwiXSksXG4gICAgXCJyYXN0ZXItYnJpZ2h0bmVzcy1taW5cIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1icmlnaHRuZXNzLW1pblwiXSksXG4gICAgXCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXhcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1icmlnaHRuZXNzLW1heFwiXSksXG4gICAgXCJyYXN0ZXItc2F0dXJhdGlvblwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfcmFzdGVyXCJdW1wicmFzdGVyLXNhdHVyYXRpb25cIl0pLFxuICAgIFwicmFzdGVyLWNvbnRyYXN0XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9yYXN0ZXJcIl1bXCJyYXN0ZXItY29udHJhc3RcIl0pLFxuICAgIFwicmFzdGVyLWZhZGUtZHVyYXRpb25cIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1mYWRlLWR1cmF0aW9uXCJdKSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgcGFpbnQgfTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IFN0eWxlTGF5ZXIgPSByZXF1aXJlKCcuLi9zdHlsZV9sYXllcicpO1xuY29uc3QgU3ltYm9sQnVja2V0ID0gcmVxdWlyZSgnLi4vLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldCcpO1xuY29uc3QgcmVzb2x2ZVRva2VucyA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdG9rZW4nKTtcbmNvbnN0IHtpc0V4cHJlc3Npb259ID0gcmVxdWlyZSgnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uJyk7XG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcbmNvbnN0IHByb3BlcnRpZXMgPSByZXF1aXJlKCcuL3N5bWJvbF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJyk7XG5cbmNvbnN0IHtcbiAgICBUcmFuc2l0aW9uYWJsZSxcbiAgICBUcmFuc2l0aW9uaW5nLFxuICAgIExheW91dCxcbiAgICBQb3NzaWJseUV2YWx1YXRlZFxufSA9IHJlcXVpcmUoJy4uL3Byb3BlcnRpZXMnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNsYXNzIFN5bWJvbFN0eWxlTGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihsYXllciAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHN1cGVyKGxheWVyLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICByZWNhbGN1bGF0ZShwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBzdXBlci5yZWNhbGN1bGF0ZShwYXJhbWV0ZXJzKTtcblxuICAgICAgICBpZiAodGhpcy5sYXlvdXQuZ2V0KCdpY29uLXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnYXV0bycpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSA9PT0gJ2xpbmUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQuX3ZhbHVlc1snaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnQnXSA9ICdtYXAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5fdmFsdWVzWydpY29uLXJvdGF0aW9uLWFsaWdubWVudCddID0gJ3ZpZXdwb3J0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxheW91dC5nZXQoJ3RleHQtcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgaWYgKHRoaXMubGF5b3V0LmdldCgnc3ltYm9sLXBsYWNlbWVudCcpID09PSAnbGluZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5fdmFsdWVzWyd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCddID0gJ21hcCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Ll92YWx1ZXNbJ3RleHQtcm90YXRpb24tYWxpZ25tZW50J10gPSAndmlld3BvcnQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdW5zcGVjaWZpZWQsIGAqLXBpdGNoLWFsaWdubWVudGAgaW5oZXJpdHMgYCotcm90YXRpb24tYWxpZ25tZW50YFxuICAgICAgICBpZiAodGhpcy5sYXlvdXQuZ2V0KCd0ZXh0LXBpdGNoLWFsaWdubWVudCcpID09PSAnYXV0bycpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0Ll92YWx1ZXNbJ3RleHQtcGl0Y2gtYWxpZ25tZW50J10gPSB0aGlzLmxheW91dC5nZXQoJ3RleHQtcm90YXRpb24tYWxpZ25tZW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubGF5b3V0LmdldCgnaWNvbi1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dC5fdmFsdWVzWydpY29uLXBpdGNoLWFsaWdubWVudCddID0gdGhpcy5sYXlvdXQuZ2V0KCdpY29uLXJvdGF0aW9uLWFsaWdubWVudCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0VmFsdWVBbmRSZXNvbHZlVG9rZW5zKG5hbWUgICAsIGZlYXR1cmUgICAgICAgICApIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmxheW91dC5nZXQobmFtZSkuZXZhbHVhdGUoZmVhdHVyZSk7XG4gICAgICAgIGNvbnN0IHVuZXZhbHVhdGVkID0gdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQuX3ZhbHVlc1tuYW1lXTtcbiAgICAgICAgaWYgKCF1bmV2YWx1YXRlZC5pc0RhdGFEcml2ZW4oKSAmJiAhaXNFeHByZXNzaW9uKHVuZXZhbHVhdGVkLnZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVUb2tlbnMoZmVhdHVyZS5wcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgY3JlYXRlQnVja2V0KHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTeW1ib2xCdWNrZXQocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcXVlcnlSYWRpdXMoKSAgICAgICAgIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcXVlcnlJbnRlcnNlY3RzRmVhdHVyZSgpICAgICAgICAgIHtcbiAgICAgICAgYXNzZXJ0KGZhbHNlKTsgLy8gU2hvdWxkIHRha2UgYSBkaWZmZXJlbnQgcGF0aCBpbiBGZWF0dXJlSW5kZXhcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTeW1ib2xTdHlsZUxheWVyO1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyAgICAgIFxuLyogZXNsaW50LWRpc2FibGUgKi9cblxuY29uc3Qgc3R5bGVTcGVjID0gcmVxdWlyZSgnLi4vLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0Jyk7XG5cbmNvbnN0IHtcbiAgICBQcm9wZXJ0aWVzLFxuICAgIERhdGFDb25zdGFudFByb3BlcnR5LFxuICAgIERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkUHJvcGVydHksXG4gICAgSGVhdG1hcENvbG9yUHJvcGVydHlcbn0gPSByZXF1aXJlKCcuLi9wcm9wZXJ0aWVzJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICBcblxuY29uc3QgbGF5b3V0ICAgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcInN5bWJvbC1wbGFjZW1lbnRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJzeW1ib2wtcGxhY2VtZW50XCJdKSxcbiAgICBcInN5bWJvbC1zcGFjaW5nXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wic3ltYm9sLXNwYWNpbmdcIl0pLFxuICAgIFwic3ltYm9sLWF2b2lkLWVkZ2VzXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wic3ltYm9sLWF2b2lkLWVkZ2VzXCJdKSxcbiAgICBcImljb24tYWxsb3ctb3ZlcmxhcFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tYWxsb3ctb3ZlcmxhcFwiXSksXG4gICAgXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIl0pLFxuICAgIFwiaWNvbi1vcHRpb25hbFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tb3B0aW9uYWxcIl0pLFxuICAgIFwiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiXSksXG4gICAgXCJpY29uLXNpemVcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1zaXplXCJdKSxcbiAgICBcImljb24tdGV4dC1maXRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLXRleHQtZml0XCJdKSxcbiAgICBcImljb24tdGV4dC1maXQtcGFkZGluZ1wiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tdGV4dC1maXQtcGFkZGluZ1wiXSksXG4gICAgXCJpY29uLWltYWdlXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24taW1hZ2VcIl0pLFxuICAgIFwiaWNvbi1yb3RhdGVcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1yb3RhdGVcIl0pLFxuICAgIFwiaWNvbi1wYWRkaW5nXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1wYWRkaW5nXCJdKSxcbiAgICBcImljb24ta2VlcC11cHJpZ2h0XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1rZWVwLXVwcmlnaHRcIl0pLFxuICAgIFwiaWNvbi1vZmZzZXRcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1vZmZzZXRcIl0pLFxuICAgIFwiaWNvbi1hbmNob3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1hbmNob3JcIl0pLFxuICAgIFwiaWNvbi1waXRjaC1hbGlnbm1lbnRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLXBpdGNoLWFsaWdubWVudFwiXSksXG4gICAgXCJ0ZXh0LXBpdGNoLWFsaWdubWVudFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtcGl0Y2gtYWxpZ25tZW50XCJdKSxcbiAgICBcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIl0pLFxuICAgIFwidGV4dC1maWVsZFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LWZpZWxkXCJdKSxcbiAgICBcInRleHQtZm9udFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LWZvbnRcIl0pLFxuICAgIFwidGV4dC1zaXplXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtc2l6ZVwiXSksXG4gICAgXCJ0ZXh0LW1heC13aWR0aFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LW1heC13aWR0aFwiXSksXG4gICAgXCJ0ZXh0LWxpbmUtaGVpZ2h0XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1saW5lLWhlaWdodFwiXSksXG4gICAgXCJ0ZXh0LWxldHRlci1zcGFjaW5nXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtbGV0dGVyLXNwYWNpbmdcIl0pLFxuICAgIFwidGV4dC1qdXN0aWZ5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtanVzdGlmeVwiXSksXG4gICAgXCJ0ZXh0LWFuY2hvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LWFuY2hvclwiXSksXG4gICAgXCJ0ZXh0LW1heC1hbmdsZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtbWF4LWFuZ2xlXCJdKSxcbiAgICBcInRleHQtcm90YXRlXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtcm90YXRlXCJdKSxcbiAgICBcInRleHQtcGFkZGluZ1wiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtcGFkZGluZ1wiXSksXG4gICAgXCJ0ZXh0LWtlZXAtdXByaWdodFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQta2VlcC11cHJpZ2h0XCJdKSxcbiAgICBcInRleHQtdHJhbnNmb3JtXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtdHJhbnNmb3JtXCJdKSxcbiAgICBcInRleHQtb2Zmc2V0XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtb2Zmc2V0XCJdKSxcbiAgICBcInRleHQtYWxsb3ctb3ZlcmxhcFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtYWxsb3ctb3ZlcmxhcFwiXSksXG4gICAgXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIl0pLFxuICAgIFwidGV4dC1vcHRpb25hbFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtb3B0aW9uYWxcIl0pLFxufSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgXG5cbmNvbnN0IHBhaW50ICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiaWNvbi1vcGFjaXR5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1wiaWNvbi1vcGFjaXR5XCJdKSxcbiAgICBcImljb24tY29sb3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLWNvbG9yXCJdKSxcbiAgICBcImljb24taGFsby1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcImljb24taGFsby1jb2xvclwiXSksXG4gICAgXCJpY29uLWhhbG8td2lkdGhcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLWhhbG8td2lkdGhcIl0pLFxuICAgIFwiaWNvbi1oYWxvLWJsdXJcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLWhhbG8tYmx1clwiXSksXG4gICAgXCJpY29uLXRyYW5zbGF0ZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1wiaWNvbi10cmFuc2xhdGVcIl0pLFxuICAgIFwiaWNvbi10cmFuc2xhdGUtYW5jaG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxuICAgIFwidGV4dC1vcGFjaXR5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1widGV4dC1vcGFjaXR5XCJdKSxcbiAgICBcInRleHQtY29sb3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LWNvbG9yXCJdKSxcbiAgICBcInRleHQtaGFsby1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcInRleHQtaGFsby1jb2xvclwiXSksXG4gICAgXCJ0ZXh0LWhhbG8td2lkdGhcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LWhhbG8td2lkdGhcIl0pLFxuICAgIFwidGV4dC1oYWxvLWJsdXJcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LWhhbG8tYmx1clwiXSksXG4gICAgXCJ0ZXh0LXRyYW5zbGF0ZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1widGV4dC10cmFuc2xhdGVcIl0pLFxuICAgIFwidGV4dC10cmFuc2xhdGUtYW5jaG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0geyBwYWludCwgbGF5b3V0IH07XG4iLCIvLyAgICAgIFxuXG5jb25zdCBTdHlsZUxheWVyID0gcmVxdWlyZSgnLi9zdHlsZV9sYXllcicpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuY29uc3QgZmVhdHVyZUZpbHRlciA9IHJlcXVpcmUoJy4uL3N0eWxlLXNwZWMvZmVhdHVyZV9maWx0ZXInKTtcbmNvbnN0IGdyb3VwQnlMYXlvdXQgPSByZXF1aXJlKCcuLi9zdHlsZS1zcGVjL2dyb3VwX2J5X2xheW91dCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNsYXNzIFN0eWxlTGF5ZXJJbmRleCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IobGF5ZXJDb25maWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBpZiAobGF5ZXJDb25maWdzKSB7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2UobGF5ZXJDb25maWdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlcGxhY2UobGF5ZXJDb25maWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuX2xheWVyQ29uZmlncyA9IHt9O1xuICAgICAgICB0aGlzLl9sYXllcnMgPSB7fTtcbiAgICAgICAgdGhpcy51cGRhdGUobGF5ZXJDb25maWdzLCBbXSk7XG4gICAgfVxuXG4gICAgdXBkYXRlKGxheWVyQ29uZmlncyAgICAgICAgICAgICAgICAgICAgICAgICAgICwgcmVtb3ZlZElkcyAgICAgICAgICAgICAgICkge1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVyQ29uZmlnIG9mIGxheWVyQ29uZmlncykge1xuICAgICAgICAgICAgdGhpcy5fbGF5ZXJDb25maWdzW2xheWVyQ29uZmlnLmlkXSA9IGxheWVyQ29uZmlnO1xuXG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tsYXllckNvbmZpZy5pZF0gPSBTdHlsZUxheWVyLmNyZWF0ZShsYXllckNvbmZpZyk7XG4gICAgICAgICAgICBsYXllci5fZmVhdHVyZUZpbHRlciA9IGZlYXR1cmVGaWx0ZXIobGF5ZXIuZmlsdGVyKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHJlbW92ZWRJZHMpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9sYXllckNvbmZpZ3NbaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2xheWVyc1tpZF07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZhbWlsaWVzQnlTb3VyY2UgPSB7fTtcblxuICAgICAgICBjb25zdCBncm91cHMgPSBncm91cEJ5TGF5b3V0KHV0aWwudmFsdWVzKHRoaXMuX2xheWVyQ29uZmlncykpO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJDb25maWdzIG9mIGdyb3Vwcykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJzID0gbGF5ZXJDb25maWdzLm1hcCgobGF5ZXJDb25maWcpID0+IHRoaXMuX2xheWVyc1tsYXllckNvbmZpZy5pZF0pO1xuXG4gICAgICAgICAgICBjb25zdCBsYXllciA9IGxheWVyc1swXTtcbiAgICAgICAgICAgIGlmIChsYXllci52aXNpYmlsaXR5ID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc291cmNlSWQgPSBsYXllci5zb3VyY2UgfHwgJyc7XG4gICAgICAgICAgICBsZXQgc291cmNlR3JvdXAgPSB0aGlzLmZhbWlsaWVzQnlTb3VyY2Vbc291cmNlSWRdO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2VHcm91cCkge1xuICAgICAgICAgICAgICAgIHNvdXJjZUdyb3VwID0gdGhpcy5mYW1pbGllc0J5U291cmNlW3NvdXJjZUlkXSA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VMYXllcklkID0gbGF5ZXIuc291cmNlTGF5ZXIgfHwgJ19nZW9qc29uVGlsZUxheWVyJztcbiAgICAgICAgICAgIGxldCBzb3VyY2VMYXllckZhbWlsaWVzID0gc291cmNlR3JvdXBbc291cmNlTGF5ZXJJZF07XG4gICAgICAgICAgICBpZiAoIXNvdXJjZUxheWVyRmFtaWxpZXMpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VMYXllckZhbWlsaWVzID0gc291cmNlR3JvdXBbc291cmNlTGF5ZXJJZF0gPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc291cmNlTGF5ZXJGYW1pbGllcy5wdXNoKGxheWVycyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU3R5bGVMYXllckluZGV4O1xuIiwiLy8gICAgICBcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9zdHlsZS1zcGVjL3ZhbGlkYXRlX3N0eWxlLm1pbicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbm1vZHVsZS5leHBvcnRzLmVtaXRFcnJvcnMgPSBmdW5jdGlvbiAoZW1pdHRlciAgICAgICAgICwgZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIGZvciAoY29uc3Qge21lc3NhZ2V9IG9mIGVycm9ycykge1xuICAgICAgICAgICAgZW1pdHRlci5maXJlKCdlcnJvcicsIHsgZXJyb3I6IG5ldyBFcnJvcihtZXNzYWdlKSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbiIsIi8vICAgICAgXG5cbmNsYXNzIFpvb21IaXN0b3J5IHtcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5maXJzdCA9IHRydWU7XG4gICAgfVxuXG4gICAgdXBkYXRlKHogICAgICAgICwgbm93ICAgICAgICApIHtcbiAgICAgICAgY29uc3QgZmxvb3JaID0gTWF0aC5mbG9vcih6KTtcblxuICAgICAgICBpZiAodGhpcy5maXJzdCkge1xuICAgICAgICAgICAgdGhpcy5maXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5sYXN0SW50ZWdlclpvb20gPSBmbG9vclo7XG4gICAgICAgICAgICB0aGlzLmxhc3RJbnRlZ2VyWm9vbVRpbWUgPSAwO1xuICAgICAgICAgICAgdGhpcy5sYXN0Wm9vbSA9IHo7XG4gICAgICAgICAgICB0aGlzLmxhc3RGbG9vclpvb20gPSBmbG9vclo7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxhc3RGbG9vclpvb20gPiBmbG9vclopIHtcbiAgICAgICAgICAgIHRoaXMubGFzdEludGVnZXJab29tID0gZmxvb3JaICsgMTtcbiAgICAgICAgICAgIHRoaXMubGFzdEludGVnZXJab29tVGltZSA9IG5vdztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhc3RGbG9vclpvb20gPCBmbG9vclopIHtcbiAgICAgICAgICAgIHRoaXMubGFzdEludGVnZXJab29tID0gZmxvb3JaO1xuICAgICAgICAgICAgdGhpcy5sYXN0SW50ZWdlclpvb21UaW1lID0gbm93O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHogIT09IHRoaXMubGFzdFpvb20pIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFpvb20gPSB6O1xuICAgICAgICAgICAgdGhpcy5sYXN0Rmxvb3Jab29tID0gZmxvb3JaO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFpvb21IaXN0b3J5O1xuIiwiLy8gICAgICBcblxuY29uc3QgUG9pbnQgPSByZXF1aXJlKCdAbWFwYm94L3BvaW50LWdlb21ldHJ5Jyk7XG5jb25zdCB7cmVnaXN0ZXJ9ID0gcmVxdWlyZSgnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJyk7XG5cbmNsYXNzIEFuY2hvciBleHRlbmRzIFBvaW50IHtcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcih4ICAgICAgICAsIHkgICAgICAgICwgYW5nbGUgICAgICAgICwgc2VnbWVudCAgICAgICAgICkge1xuICAgICAgICBzdXBlcih4LCB5KTtcbiAgICAgICAgdGhpcy5hbmdsZSA9IGFuZ2xlO1xuICAgICAgICBpZiAoc2VnbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnQgPSBzZWdtZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQW5jaG9yKHRoaXMueCwgdGhpcy55LCB0aGlzLmFuZ2xlLCB0aGlzLnNlZ21lbnQpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0FuY2hvcicsIEFuY2hvcik7XG5cbm1vZHVsZS5leHBvcnRzID0gQW5jaG9yO1xuIiwiLy8gICAgICBcblxubW9kdWxlLmV4cG9ydHMgPSBjaGVja01heEFuZ2xlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbi8qKlxuICogTGFiZWxzIHBsYWNlZCBhcm91bmQgcmVhbGx5IHNoYXJwIGFuZ2xlcyBhcmVuJ3QgcmVhZGFibGUuIENoZWNrIGlmIGFueVxuICogcGFydCBvZiB0aGUgcG90ZW50aWFsIGxhYmVsIGhhcyBhIGNvbWJpbmVkIGFuZ2xlIHRoYXQgaXMgdG9vIGJpZy5cbiAqXG4gKiBAcGFyYW0gbGluZVxuICogQHBhcmFtIGFuY2hvciBUaGUgcG9pbnQgb24gdGhlIGxpbmUgYXJvdW5kIHdoaWNoIHRoZSBsYWJlbCBpcyBhbmNob3JlZC5cbiAqIEBwYXJhbSBsYWJlbExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBsYWJlbCBpbiBnZW9tZXRyeSB1bml0cy5cbiAqIEBwYXJhbSB3aW5kb3dTaXplIFRoZSBjaGVjayBmYWlscyBpZiB0aGUgY29tYmluZWQgYW5nbGVzIHdpdGhpbiBhIHBhcnQgb2YgdGhlIGxpbmUgdGhhdCBpcyBgd2luZG93U2l6ZWAgbG9uZyBpcyB0b28gYmlnLlxuICogQHBhcmFtIG1heEFuZ2xlIFRoZSBtYXhpbXVtIGNvbWJpbmVkIGFuZ2xlIHRoYXQgYW55IHdpbmRvdyBhbG9uZyB0aGUgbGFiZWwgaXMgYWxsb3dlZCB0byBoYXZlLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBsYWJlbCBzaG91bGQgYmUgcGxhY2VkXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja01heEFuZ2xlKGxpbmUgICAgICAgICAgICAgICwgYW5jaG9yICAgICAgICAsIGxhYmVsTGVuZ3RoICAgICAgICAsIHdpbmRvd1NpemUgICAgICAgICwgbWF4QW5nbGUgICAgICAgICkge1xuXG4gICAgLy8gaG9yaXpvbnRhbCBsYWJlbHMgYWx3YXlzIHBhc3NcbiAgICBpZiAoYW5jaG9yLnNlZ21lbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG5cbiAgICBsZXQgcCA9IGFuY2hvcjtcbiAgICBsZXQgaW5kZXggPSBhbmNob3Iuc2VnbWVudCArIDE7XG4gICAgbGV0IGFuY2hvckRpc3RhbmNlID0gMDtcblxuICAgIC8vIG1vdmUgYmFja3dhcmRzIGFsb25nIHRoZSBsaW5lIHRvIHRoZSBmaXJzdCBzZWdtZW50IHRoZSBsYWJlbCBhcHBlYXJzIG9uXG4gICAgd2hpbGUgKGFuY2hvckRpc3RhbmNlID4gLWxhYmVsTGVuZ3RoIC8gMikge1xuICAgICAgICBpbmRleC0tO1xuXG4gICAgICAgIC8vIHRoZXJlIGlzbid0IGVub3VnaCByb29tIGZvciB0aGUgbGFiZWwgYWZ0ZXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZVxuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgYW5jaG9yRGlzdGFuY2UgLT0gbGluZVtpbmRleF0uZGlzdChwKTtcbiAgICAgICAgcCA9IGxpbmVbaW5kZXhdO1xuICAgIH1cblxuICAgIGFuY2hvckRpc3RhbmNlICs9IGxpbmVbaW5kZXhdLmRpc3QobGluZVtpbmRleCArIDFdKTtcbiAgICBpbmRleCsrO1xuXG4gICAgLy8gc3RvcmUgcmVjZW50IGNvcm5lcnMgYW5kIHRoZWlyIHRvdGFsIGFuZ2xlIGRpZmZlcmVuY2VcbiAgICBjb25zdCByZWNlbnRDb3JuZXJzID0gW107XG4gICAgbGV0IHJlY2VudEFuZ2xlRGVsdGEgPSAwO1xuXG4gICAgLy8gbW92ZSBmb3J3YXJkcyBieSB0aGUgbGVuZ3RoIG9mIHRoZSBsYWJlbCBhbmQgY2hlY2sgYW5nbGVzIGFsb25nIHRoZSB3YXlcbiAgICB3aGlsZSAoYW5jaG9yRGlzdGFuY2UgPCBsYWJlbExlbmd0aCAvIDIpIHtcbiAgICAgICAgY29uc3QgcHJldiA9IGxpbmVbaW5kZXggLSAxXTtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IGxpbmVbaW5kZXhdO1xuICAgICAgICBjb25zdCBuZXh0ID0gbGluZVtpbmRleCArIDFdO1xuXG4gICAgICAgIC8vIHRoZXJlIGlzbid0IGVub3VnaCByb29tIGZvciB0aGUgbGFiZWwgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGxpbmVcbiAgICAgICAgaWYgKCFuZXh0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbGV0IGFuZ2xlRGVsdGEgPSBwcmV2LmFuZ2xlVG8oY3VycmVudCkgLSBjdXJyZW50LmFuZ2xlVG8obmV4dCk7XG4gICAgICAgIC8vIHJlc3RyaWN0IGFuZ2xlIHRvIC1waS4ucGkgcmFuZ2VcbiAgICAgICAgYW5nbGVEZWx0YSA9IE1hdGguYWJzKCgoYW5nbGVEZWx0YSArIDMgKiBNYXRoLlBJKSAlIChNYXRoLlBJICogMikpIC0gTWF0aC5QSSk7XG5cbiAgICAgICAgcmVjZW50Q29ybmVycy5wdXNoKHtcbiAgICAgICAgICAgIGRpc3RhbmNlOiBhbmNob3JEaXN0YW5jZSxcbiAgICAgICAgICAgIGFuZ2xlRGVsdGE6IGFuZ2xlRGVsdGFcbiAgICAgICAgfSk7XG4gICAgICAgIHJlY2VudEFuZ2xlRGVsdGEgKz0gYW5nbGVEZWx0YTtcblxuICAgICAgICAvLyByZW1vdmUgY29ybmVycyB0aGF0IGFyZSBmYXIgZW5vdWdoIGF3YXkgZnJvbSB0aGUgbGlzdCBvZiByZWNlbnQgYW5jaG9yc1xuICAgICAgICB3aGlsZSAoYW5jaG9yRGlzdGFuY2UgLSByZWNlbnRDb3JuZXJzWzBdLmRpc3RhbmNlID4gd2luZG93U2l6ZSkge1xuICAgICAgICAgICAgcmVjZW50QW5nbGVEZWx0YSAtPSByZWNlbnRDb3JuZXJzLnNoaWZ0KCkuYW5nbGVEZWx0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoZSBzdW0gb2YgYW5nbGVzIHdpdGhpbiB0aGUgd2luZG93IGFyZWEgZXhjZWVkcyB0aGUgbWF4aW11bSBhbGxvd2VkIHZhbHVlLiBjaGVjayBmYWlscy5cbiAgICAgICAgaWYgKHJlY2VudEFuZ2xlRGVsdGEgPiBtYXhBbmdsZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGFuY2hvckRpc3RhbmNlICs9IGN1cnJlbnQuZGlzdChuZXh0KTtcbiAgICB9XG5cbiAgICAvLyBubyBwYXJ0IG9mIHRoZSBsaW5lIGhhZCBhbiBhbmdsZSBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gYWxsb3dlZC4gY2hlY2sgcGFzc2VzLlxuICAgIHJldHVybiB0cnVlO1xufVxuIiwiLy8gICAgICBcblxuY29uc3QgUG9pbnQgPSByZXF1aXJlKCdAbWFwYm94L3BvaW50LWdlb21ldHJ5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xpcExpbmU7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGFydCBvZiBhIG11bHRpbGluZSB0aGF0IGludGVyc2VjdHMgd2l0aCB0aGUgcHJvdmlkZWQgcmVjdGFuZ3VsYXIgYm94LlxuICpcbiAqIEBwYXJhbSBsaW5lc1xuICogQHBhcmFtIHgxIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGJveFxuICogQHBhcmFtIHkxIHRoZSB0b3AgZWRnZSBvZiB0aGUgYm94XG4gKiBAcGFyYW0geDIgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGJveFxuICogQHBhcmFtIHkyIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgYm94XG4gKiBAcmV0dXJucyBsaW5lc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2xpcExpbmUobGluZXMgICAgICAgICAgICAgICAgICAgICAsIHgxICAgICAgICAsIHkxICAgICAgICAsIHgyICAgICAgICAsIHkyICAgICAgICApICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICBjb25zdCBjbGlwcGVkTGluZXMgPSBbXTtcblxuICAgIGZvciAobGV0IGwgPSAwOyBsIDwgbGluZXMubGVuZ3RoOyBsKyspIHtcbiAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2xdO1xuICAgICAgICBsZXQgY2xpcHBlZExpbmU7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgbGV0IHAwID0gbGluZVtpXTtcbiAgICAgICAgICAgIGxldCBwMSA9IGxpbmVbaSArIDFdO1xuXG5cbiAgICAgICAgICAgIGlmIChwMC54IDwgeDEgJiYgcDEueCA8IHgxKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAwLnggPCB4MSkge1xuICAgICAgICAgICAgICAgIHAwID0gbmV3IFBvaW50KHgxLCBwMC55ICsgKHAxLnkgLSBwMC55KSAqICgoeDEgLSBwMC54KSAvIChwMS54IC0gcDAueCkpKS5fcm91bmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDEueCA8IHgxKSB7XG4gICAgICAgICAgICAgICAgcDEgPSBuZXcgUG9pbnQoeDEsIHAwLnkgKyAocDEueSAtIHAwLnkpICogKCh4MSAtIHAwLngpIC8gKHAxLnggLSBwMC54KSkpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocDAueSA8IHkxICYmIHAxLnkgPCB5MSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMC55IDwgeTEpIHtcbiAgICAgICAgICAgICAgICBwMCA9IG5ldyBQb2ludChwMC54ICsgKHAxLnggLSBwMC54KSAqICgoeTEgLSBwMC55KSAvIChwMS55IC0gcDAueSkpLCB5MSkuX3JvdW5kKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAxLnkgPCB5MSkge1xuICAgICAgICAgICAgICAgIHAxID0gbmV3IFBvaW50KHAwLnggKyAocDEueCAtIHAwLngpICogKCh5MSAtIHAwLnkpIC8gKHAxLnkgLSBwMC55KSksIHkxKS5fcm91bmQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHAwLnggPj0geDIgJiYgcDEueCA+PSB4Mikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMC54ID49IHgyKSB7XG4gICAgICAgICAgICAgICAgcDAgPSBuZXcgUG9pbnQoeDIsIHAwLnkgKyAocDEueSAtIHAwLnkpICogKCh4MiAtIHAwLngpIC8gKHAxLnggLSBwMC54KSkpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMS54ID49IHgyKSB7XG4gICAgICAgICAgICAgICAgcDEgPSBuZXcgUG9pbnQoeDIsIHAwLnkgKyAocDEueSAtIHAwLnkpICogKCh4MiAtIHAwLngpIC8gKHAxLnggLSBwMC54KSkpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocDAueSA+PSB5MiAmJiBwMS55ID49IHkyKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAwLnkgPj0geTIpIHtcbiAgICAgICAgICAgICAgICBwMCA9IG5ldyBQb2ludChwMC54ICsgKHAxLnggLSBwMC54KSAqICgoeTIgLSBwMC55KSAvIChwMS55IC0gcDAueSkpLCB5MikuX3JvdW5kKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAxLnkgPj0geTIpIHtcbiAgICAgICAgICAgICAgICBwMSA9IG5ldyBQb2ludChwMC54ICsgKHAxLnggLSBwMC54KSAqICgoeTIgLSBwMC55KSAvIChwMS55IC0gcDAueSkpLCB5MikuX3JvdW5kKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghY2xpcHBlZExpbmUgfHwgIXAwLmVxdWFscyhjbGlwcGVkTGluZVtjbGlwcGVkTGluZS5sZW5ndGggLSAxXSkpIHtcbiAgICAgICAgICAgICAgICBjbGlwcGVkTGluZSA9IFtwMF07XG4gICAgICAgICAgICAgICAgY2xpcHBlZExpbmVzLnB1c2goY2xpcHBlZExpbmUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjbGlwcGVkTGluZS5wdXNoKHAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbGlwcGVkTGluZXM7XG59XG4iLCIvLyAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4vKipcbiAqIEEgQ29sbGlzaW9uRmVhdHVyZSByZXByZXNlbnRzIHRoZSBhcmVhIG9mIHRoZSB0aWxlIGNvdmVyZWQgYnkgYSBzaW5nbGUgbGFiZWwuXG4gKiBJdCBpcyB1c2VkIHdpdGggQ29sbGlzaW9uSW5kZXggdG8gY2hlY2sgaWYgdGhlIGxhYmVsIG92ZXJsYXBzIHdpdGggYW55XG4gKiBwcmV2aW91cyBsYWJlbHMuIEEgQ29sbGlzaW9uRmVhdHVyZSBpcyBtb3N0bHkganVzdCBhIHNldCBvZiBDb2xsaXNpb25Cb3hcbiAqIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQ29sbGlzaW9uRmVhdHVyZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBDb2xsaXNpb25GZWF0dXJlLCBhZGRpbmcgaXRzIGNvbGxpc2lvbiBib3ggZGF0YSB0byB0aGUgZ2l2ZW4gY29sbGlzaW9uQm94QXJyYXkgaW4gdGhlIHByb2Nlc3MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGluZSBUaGUgZ2VvbWV0cnkgdGhlIGxhYmVsIGlzIHBsYWNlZCBvbi5cbiAgICAgKiBAcGFyYW0gYW5jaG9yIFRoZSBwb2ludCBhbG9uZyB0aGUgbGluZSBhcm91bmQgd2hpY2ggdGhlIGxhYmVsIGlzIGFuY2hvcmVkLlxuICAgICAqIEBwYXJhbSBzaGFwZWQgVGhlIHRleHQgb3IgaWNvbiBzaGFwaW5nIHJlc3VsdHMuXG4gICAgICogQHBhcmFtIGJveFNjYWxlIEEgbWFnaWMgbnVtYmVyIHVzZWQgdG8gY29udmVydCBmcm9tIGdseXBoIG1ldHJpY3MgdW5pdHMgdG8gZ2VvbWV0cnkgdW5pdHMuXG4gICAgICogQHBhcmFtIHBhZGRpbmcgVGhlIGFtb3VudCBvZiBwYWRkaW5nIHRvIGFkZCBhcm91bmQgdGhlIGxhYmVsIGVkZ2VzLlxuICAgICAqIEBwYXJhbSBhbGlnbkxpbmUgV2hldGhlciB0aGUgbGFiZWwgaXMgYWxpZ25lZCB3aXRoIHRoZSBsaW5lIG9yIHRoZSB2aWV3cG9ydC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb2xsaXNpb25Cb3hBcnJheSAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgbGluZSAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgIGFuY2hvciAgICAgICAgLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleCAgICAgICAgLFxuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXggICAgICAgICxcbiAgICAgICAgICAgICAgICBidWNrZXRJbmRleCAgICAgICAgLFxuICAgICAgICAgICAgICAgIHNoYXBlZCAgICAgICAgLFxuICAgICAgICAgICAgICAgIGJveFNjYWxlICAgICAgICAsXG4gICAgICAgICAgICAgICAgcGFkZGluZyAgICAgICAgLFxuICAgICAgICAgICAgICAgIGFsaWduTGluZSAgICAgICAgICxcbiAgICAgICAgICAgICAgICBvdmVyc2NhbGluZyAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHkxID0gc2hhcGVkLnRvcCAqIGJveFNjYWxlIC0gcGFkZGluZztcbiAgICAgICAgY29uc3QgeTIgPSBzaGFwZWQuYm90dG9tICogYm94U2NhbGUgKyBwYWRkaW5nO1xuICAgICAgICBjb25zdCB4MSA9IHNoYXBlZC5sZWZ0ICogYm94U2NhbGUgLSBwYWRkaW5nO1xuICAgICAgICBjb25zdCB4MiA9IHNoYXBlZC5yaWdodCAqIGJveFNjYWxlICsgcGFkZGluZztcblxuICAgICAgICB0aGlzLmJveFN0YXJ0SW5kZXggPSBjb2xsaXNpb25Cb3hBcnJheS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKGFsaWduTGluZSkge1xuXG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0geTIgLSB5MTtcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHgyIC0geDE7XG5cbiAgICAgICAgICAgIGlmIChoZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gc2V0IG1pbmltdW0gYm94IGhlaWdodCB0byBhdm9pZCB2ZXJ5IG1hbnkgc21hbGwgbGFiZWxzXG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoMTAgKiBib3hTY2FsZSwgaGVpZ2h0KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX2FkZExpbmVDb2xsaXNpb25DaXJjbGVzKGNvbGxpc2lvbkJveEFycmF5LCBsaW5lLCBhbmNob3IsIChhbmNob3Iuc2VnbWVudCAgICAgKSwgbGVuZ3RoLCBoZWlnaHQsIGZlYXR1cmVJbmRleCwgc291cmNlTGF5ZXJJbmRleCwgYnVja2V0SW5kZXgsIG92ZXJzY2FsaW5nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29sbGlzaW9uQm94QXJyYXkuZW1wbGFjZUJhY2soYW5jaG9yLngsIGFuY2hvci55LCB4MSwgeTEsIHgyLCB5MiwgZmVhdHVyZUluZGV4LCBzb3VyY2VMYXllckluZGV4LCBidWNrZXRJbmRleCxcbiAgICAgICAgICAgICAgICAwLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYm94RW5kSW5kZXggPSBjb2xsaXNpb25Cb3hBcnJheS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgc2V0IG9mIENvbGxpc2lvbkJveCBvYmplY3RzIGZvciBhIGxpbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFiZWxMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgbGFiZWwgaW4gZ2VvbWV0cnkgdW5pdHMuXG4gICAgICogQHBhcmFtIGFuY2hvciBUaGUgcG9pbnQgYWxvbmcgdGhlIGxpbmUgYXJvdW5kIHdoaWNoIHRoZSBsYWJlbCBpcyBhbmNob3JlZC5cbiAgICAgKiBAcGFyYW0gYm94U2l6ZSBUaGUgc2l6ZSBvZiB0aGUgY29sbGlzaW9uIGJveGVzIHRoYXQgd2lsbCBiZSBjcmVhdGVkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2FkZExpbmVDb2xsaXNpb25DaXJjbGVzKGNvbGxpc2lvbkJveEFycmF5ICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvciAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudCAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxMZW5ndGggICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveFNpemUgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleCAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleCAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0SW5kZXggICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJzY2FsaW5nICAgICAgICApIHtcbiAgICAgICAgY29uc3Qgc3RlcCA9IGJveFNpemUgLyAyO1xuICAgICAgICBjb25zdCBuQm94ZXMgPSBNYXRoLmZsb29yKGxhYmVsTGVuZ3RoIC8gc3RlcCk7XG4gICAgICAgIC8vIFdlIGNhbGN1bGF0ZSBsaW5lIGNvbGxpc2lvbiBjaXJjbGVzIG91dCB0byAzMDAlIG9mIHdoYXQgd291bGQgbm9ybWFsbHkgYmUgb3VyXG4gICAgICAgIC8vIG1heCBzaXplLCB0byBhbGxvdyBjb2xsaXNpb24gZGV0ZWN0aW9uIHRvIHdvcmsgb24gbGFiZWxzIHRoYXQgZXhwYW5kIGFzXG4gICAgICAgIC8vIHRoZXkgbW92ZSBpbnRvIHRoZSBkaXN0YW5jZVxuICAgICAgICAvLyBWZXJ0aWNhbGx5IG9yaWVudGVkIGxhYmVscyBpbiB0aGUgZGlzdGFudCBmaWVsZCBjYW4gZXh0ZW5kIHBhc3QgdGhpcyBwYWRkaW5nXG4gICAgICAgIC8vIFRoaXMgaXMgYSBub3RpY2VhYmxlIHByb2JsZW0gaW4gb3ZlcnNjYWxlZCB0aWxlcyB3aGVyZSB0aGUgcGl0Y2ggMC1iYXNlZFxuICAgICAgICAvLyBzeW1ib2wgc3BhY2luZyB3aWxsIHB1dCBsYWJlbHMgdmVyeSBjbG9zZSB0b2dldGhlciBpbiBhIHBpdGNoZWQgbWFwLlxuICAgICAgICAvLyBUbyByZWR1Y2UgdGhlIGNvc3Qgb2YgYWRkaW5nIGV4dHJhIGNvbGxpc2lvbiBjaXJjbGVzLCB3ZSBzbG93bHkgaW5jcmVhc2VcbiAgICAgICAgLy8gdGhlbSBmb3Igb3ZlcnNjYWxlZCB0aWxlcy5cbiAgICAgICAgY29uc3Qgb3ZlcnNjYWxpbmdQYWRkaW5nRmFjdG9yID0gMSArIC40ICogTWF0aC5sb2cob3ZlcnNjYWxpbmcpIC8gTWF0aC5MTjI7XG4gICAgICAgIGNvbnN0IG5QaXRjaFBhZGRpbmdCb3hlcyA9IE1hdGguZmxvb3IobkJveGVzICogb3ZlcnNjYWxpbmdQYWRkaW5nRmFjdG9yIC8gMik7XG5cbiAgICAgICAgLy8gb2Zmc2V0IHRoZSBjZW50ZXIgb2YgdGhlIGZpcnN0IGJveCBieSBoYWxmIGEgYm94IHNvIHRoYXQgdGhlIGVkZ2Ugb2YgdGhlXG4gICAgICAgIC8vIGJveCBpcyBhdCB0aGUgZWRnZSBvZiB0aGUgbGFiZWwuXG4gICAgICAgIGNvbnN0IGZpcnN0Qm94T2Zmc2V0ID0gLWJveFNpemUgLyAyO1xuXG4gICAgICAgIGxldCBwID0gYW5jaG9yO1xuICAgICAgICBsZXQgaW5kZXggPSBzZWdtZW50ICsgMTtcbiAgICAgICAgbGV0IGFuY2hvckRpc3RhbmNlID0gZmlyc3RCb3hPZmZzZXQ7XG4gICAgICAgIGNvbnN0IGxhYmVsU3RhcnREaXN0YW5jZSA9IC1sYWJlbExlbmd0aCAvIDI7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdTdGFydERpc3RhbmNlID0gbGFiZWxTdGFydERpc3RhbmNlIC0gbGFiZWxMZW5ndGggLyA0O1xuICAgICAgICAvLyBtb3ZlIGJhY2t3YXJkcyBhbG9uZyB0aGUgbGluZSB0byB0aGUgZmlyc3Qgc2VnbWVudCB0aGUgbGFiZWwgYXBwZWFycyBvblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpbmRleC0tO1xuXG4gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvckRpc3RhbmNlID4gbGFiZWxTdGFydERpc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzbid0IGVub3VnaCByb29tIGZvciB0aGUgbGFiZWwgYWZ0ZXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZVxuICAgICAgICAgICAgICAgICAgICAvLyBjaGVja01heEFuZ2xlIHNob3VsZCBoYXZlIGFscmVhZHkgY2F1Z2h0IHRoaXNcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBsaW5lIGRvZXNuJ3QgZXh0ZW5kIGZhciBlbm91Z2ggYmFjayBmb3IgYWxsIG9mIG91ciBwYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2UgZ290IGZhciBlbm91Z2ggdG8gc2hvdyB0aGUgbGFiZWwgdW5kZXIgbW9zdCBjb25kaXRpb25zLlxuICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yRGlzdGFuY2UgLT0gbGluZVtpbmRleF0uZGlzdChwKTtcbiAgICAgICAgICAgICAgICBwID0gbGluZVtpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGFuY2hvckRpc3RhbmNlID4gcGFkZGluZ1N0YXJ0RGlzdGFuY2UpO1xuXG4gICAgICAgIGxldCBzZWdtZW50TGVuZ3RoID0gbGluZVtpbmRleF0uZGlzdChsaW5lW2luZGV4ICsgMV0pO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAtblBpdGNoUGFkZGluZ0JveGVzOyBpIDwgbkJveGVzICsgblBpdGNoUGFkZGluZ0JveGVzOyBpKyspIHtcblxuICAgICAgICAgICAgLy8gdGhlIGRpc3RhbmNlIHRoZSBib3ggd2lsbCBiZSBmcm9tIHRoZSBhbmNob3JcbiAgICAgICAgICAgIGNvbnN0IGJveE9mZnNldCA9IGkgKiBzdGVwO1xuICAgICAgICAgICAgbGV0IGJveERpc3RhbmNlVG9BbmNob3IgPSBsYWJlbFN0YXJ0RGlzdGFuY2UgKyBib3hPZmZzZXQ7XG5cbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIGRpc3RhbmNlIGJldHdlZW4gcGl0Y2ggcGFkZGluZyBib3hlcyBiaWdnZXJcbiAgICAgICAgICAgIGlmIChib3hPZmZzZXQgPCAwKSBib3hEaXN0YW5jZVRvQW5jaG9yICs9IGJveE9mZnNldDtcbiAgICAgICAgICAgIGlmIChib3hPZmZzZXQgPiBsYWJlbExlbmd0aCkgYm94RGlzdGFuY2VUb0FuY2hvciArPSBib3hPZmZzZXQgLSBsYWJlbExlbmd0aDtcblxuICAgICAgICAgICAgaWYgKGJveERpc3RhbmNlVG9BbmNob3IgPCBhbmNob3JEaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBsaW5lIGRvZXNuJ3QgZXh0ZW5kIGZhciBlbm91Z2ggYmFjayBmb3IgdGhpcyBib3gsIHNraXAgaXRcbiAgICAgICAgICAgICAgICAvLyAoVGhpcyBjb3VsZCBhbGxvdyBmb3IgbGluZSBjb2xsaXNpb25zIG9uIGRpc3RhbnQgdGlsZXMpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHRoZSBib3ggaXMgbm90IG9uIHRoZSBjdXJyZW50IHNlZ21lbnQuIE1vdmUgdG8gdGhlIG5leHQgc2VnbWVudC5cbiAgICAgICAgICAgIHdoaWxlIChhbmNob3JEaXN0YW5jZSArIHNlZ21lbnRMZW5ndGggPCBib3hEaXN0YW5jZVRvQW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yRGlzdGFuY2UgKz0gc2VnbWVudExlbmd0aDtcbiAgICAgICAgICAgICAgICBpbmRleCsrO1xuXG4gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXNuJ3QgZW5vdWdoIHJvb20gYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGxpbmUuXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA+PSBsaW5lLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2VnbWVudExlbmd0aCA9IGxpbmVbaW5kZXhdLmRpc3QobGluZVtpbmRleCArIDFdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhlIGRpc3RhbmNlIHRoZSBib3ggd2lsbCBiZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlZ21lbnRcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRCb3hEaXN0YW5jZSA9IGJveERpc3RhbmNlVG9BbmNob3IgLSBhbmNob3JEaXN0YW5jZTtcblxuICAgICAgICAgICAgY29uc3QgcDAgPSBsaW5lW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IHAxID0gbGluZVtpbmRleCArIDFdO1xuICAgICAgICAgICAgY29uc3QgYm94QW5jaG9yUG9pbnQgPSBwMS5zdWIocDApLl91bml0KCkuX211bHQoc2VnbWVudEJveERpc3RhbmNlKS5fYWRkKHAwKS5fcm91bmQoKTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIGJveCBpcyB3aXRoaW4gYm94U2l6ZSBvZiB0aGUgYW5jaG9yLCBmb3JjZSB0aGUgYm94IHRvIGJlIHVzZWRcbiAgICAgICAgICAgIC8vIChzbyBldmVuIDAtd2lkdGggbGFiZWxzIHVzZSBhdCBsZWFzdCBvbmUgYm94KVxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgLjggbXVsdGlwbGljYXRpb24gZ2l2ZXMgdXMgYSBsaXR0bGUgYml0IG9mIGNvbnNlcnZhdGl2ZVxuICAgICAgICAgICAgLy8gcGFkZGluZyBpbiBjaG9vc2luZyB3aGljaCBib3hlcyB0byB1c2UgKHNlZSBDb2xsaXNpb25JbmRleCNwbGFjZWRDb2xsaXNpb25DaXJjbGVzKVxuICAgICAgICAgICAgY29uc3QgcGFkZGVkQW5jaG9yRGlzdGFuY2UgPSBNYXRoLmFicyhib3hEaXN0YW5jZVRvQW5jaG9yIC0gZmlyc3RCb3hPZmZzZXQpIDwgc3RlcCA/XG4gICAgICAgICAgICAgICAgMCA6XG4gICAgICAgICAgICAgICAgKGJveERpc3RhbmNlVG9BbmNob3IgLSBmaXJzdEJveE9mZnNldCkgKiAwLjg7XG5cbiAgICAgICAgICAgIGNvbGxpc2lvbkJveEFycmF5LmVtcGxhY2VCYWNrKGJveEFuY2hvclBvaW50LngsIGJveEFuY2hvclBvaW50LnksXG4gICAgICAgICAgICAgICAgLWJveFNpemUgLyAyLCAtYm94U2l6ZSAvIDIsIGJveFNpemUgLyAyLCBib3hTaXplIC8gMixcbiAgICAgICAgICAgICAgICBmZWF0dXJlSW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIGJ1Y2tldEluZGV4LFxuICAgICAgICAgICAgICAgIGJveFNpemUgLyAyLCBwYWRkZWRBbmNob3JEaXN0YW5jZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29sbGlzaW9uRmVhdHVyZTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IFBvaW50ID0gcmVxdWlyZSgnQG1hcGJveC9wb2ludC1nZW9tZXRyeScpO1xuY29uc3QgaW50ZXJzZWN0aW9uVGVzdHMgPSByZXF1aXJlKCcuLi91dGlsL2ludGVyc2VjdGlvbl90ZXN0cycpO1xuXG5jb25zdCBHcmlkID0gcmVxdWlyZSgnLi9ncmlkX2luZGV4Jyk7XG5jb25zdCBnbG1hdHJpeCA9IHJlcXVpcmUoJ0BtYXBib3gvZ2wtbWF0cml4Jyk7XG5cbmNvbnN0IG1hdDQgPSBnbG1hdHJpeC5tYXQ0O1xuXG5jb25zdCBwcm9qZWN0aW9uID0gcmVxdWlyZSgnLi4vc3ltYm9sL3Byb2plY3Rpb24nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4vLyBXaGVuIGEgc3ltYm9sIGNyb3NzZXMgdGhlIGVkZ2UgdGhhdCBjYXVzZXMgaXQgdG8gYmUgaW5jbHVkZWQgaW5cbi8vIGNvbGxpc2lvbiBkZXRlY3Rpb24sIGl0IHdpbGwgY2F1c2UgY2hhbmdlcyBpbiB0aGUgc3ltYm9scyBhcm91bmRcbi8vIGl0LiBUaGlzIGNvbnN0YW50IHNwZWNpZmllcyBob3cgbWFueSBwaXhlbHMgdG8gcGFkIHRoZSBlZGdlIG9mXG4vLyB0aGUgdmlld3BvcnQgZm9yIGNvbGxpc2lvbiBkZXRlY3Rpb24gc28gdGhhdCB0aGUgYnVsayBvZiB0aGUgY2hhbmdlc1xuLy8gb2NjdXIgb2Zmc2NyZWVuLiBNYWtpbmcgdGhpcyBjb25zdGFudCBncmVhdGVyIGluY3JlYXNlcyBsYWJlbFxuLy8gc3RhYmlsaXR5LCBidXQgaXQncyBleHBlbnNpdmUuXG5jb25zdCB2aWV3cG9ydFBhZGRpbmcgPSAxMDA7XG5cbi8qKlxuICogQSBjb2xsaXNpb24gaW5kZXggdXNlZCB0byBwcmV2ZW50IHN5bWJvbHMgZnJvbSBvdmVybGFwcGluZy4gSXQga2VlcCB0cmFja3Mgb2ZcbiAqIHdoZXJlIHByZXZpb3VzIHN5bWJvbHMgaGF2ZSBiZWVuIHBsYWNlZCBhbmQgaXMgdXNlZCB0byBjaGVjayBpZiBhIG5ld1xuICogc3ltYm9sIG92ZXJsYXBzIHdpdGggYW55IHByZXZpb3VzbHkgYWRkZWQgc3ltYm9scy5cbiAqXG4gKiBUaGVyZSBhcmUgdHdvIHN0ZXBzIHRvIGluc2VydGlvbjogZmlyc3QgcGxhY2VDb2xsaXNpb25Cb3gvQ2lyY2xlcyBjaGVja3MgaWZcbiAqIHRoZXJlJ3Mgcm9vbSBmb3IgYSBzeW1ib2wsIHRoZW4gaW5zZXJ0Q29sbGlzaW9uQm94L0NpcmNsZXMgYWN0dWFsbHkgcHV0cyB0aGVcbiAqIHN5bWJvbCBpbiB0aGUgaW5kZXguIFRoZSB0d28gc3RlcCBwcm9jZXNzIGFsbG93cyBwYWlyZWQgc3ltYm9scyB0byBiZSBpbnNlcnRlZFxuICogdG9nZXRoZXIgZXZlbiBpZiB0aGV5IG92ZXJsYXAuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQ29sbGlzaW9uSW5kZXgge1xuICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICB0cmFuc2Zvcm0gICAgICAgICAgICxcbiAgICAgICAgZ3JpZCAgICAgICA9IG5ldyBHcmlkKHRyYW5zZm9ybS53aWR0aCArIDIgKiB2aWV3cG9ydFBhZGRpbmcsIHRyYW5zZm9ybS5oZWlnaHQgKyAyICogdmlld3BvcnRQYWRkaW5nLCAyNSksXG4gICAgICAgIGlnbm9yZWRHcmlkICAgICAgID0gbmV3IEdyaWQodHJhbnNmb3JtLndpZHRoICsgMiAqIHZpZXdwb3J0UGFkZGluZywgdHJhbnNmb3JtLmhlaWdodCArIDIgKiB2aWV3cG9ydFBhZGRpbmcsIDI1KVxuICAgICkge1xuICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcblxuICAgICAgICB0aGlzLmdyaWQgPSBncmlkO1xuICAgICAgICB0aGlzLmlnbm9yZWRHcmlkID0gaWdub3JlZEdyaWQ7XG4gICAgICAgIHRoaXMucGl0Y2hmYWN0b3IgPSBNYXRoLmNvcyh0cmFuc2Zvcm0uX3BpdGNoKSAqIHRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlO1xuXG4gICAgICAgIHRoaXMuc2NyZWVuUmlnaHRCb3VuZGFyeSA9IHRyYW5zZm9ybS53aWR0aCArIHZpZXdwb3J0UGFkZGluZztcbiAgICAgICAgdGhpcy5zY3JlZW5Cb3R0b21Cb3VuZGFyeSA9IHRyYW5zZm9ybS5oZWlnaHQgKyB2aWV3cG9ydFBhZGRpbmc7XG4gICAgfVxuXG4gICAgcGxhY2VDb2xsaXNpb25Cb3goY29sbGlzaW9uQm94ICAgICAgICAgICAgICAgICAgICAsIGFsbG93T3ZlcmxhcCAgICAgICAgICwgdGV4dFBpeGVsUmF0aW8gICAgICAgICwgcG9zTWF0cml4ICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgY29uc3QgcHJvamVjdGVkUG9pbnQgPSB0aGlzLnByb2plY3RBbmRHZXRQZXJzcGVjdGl2ZVJhdGlvKHBvc01hdHJpeCwgY29sbGlzaW9uQm94LmFuY2hvclBvaW50WCwgY29sbGlzaW9uQm94LmFuY2hvclBvaW50WSk7XG4gICAgICAgIGNvbnN0IHRpbGVUb1ZpZXdwb3J0ID0gdGV4dFBpeGVsUmF0aW8gKiBwcm9qZWN0ZWRQb2ludC5wZXJzcGVjdGl2ZVJhdGlvO1xuICAgICAgICBjb25zdCB0bFggPSBjb2xsaXNpb25Cb3gueDEgKiB0aWxlVG9WaWV3cG9ydCArIHByb2plY3RlZFBvaW50LnBvaW50Lng7XG4gICAgICAgIGNvbnN0IHRsWSA9IGNvbGxpc2lvbkJveC55MSAqIHRpbGVUb1ZpZXdwb3J0ICsgcHJvamVjdGVkUG9pbnQucG9pbnQueTtcbiAgICAgICAgY29uc3QgYnJYID0gY29sbGlzaW9uQm94LngyICogdGlsZVRvVmlld3BvcnQgKyBwcm9qZWN0ZWRQb2ludC5wb2ludC54O1xuICAgICAgICBjb25zdCBiclkgPSBjb2xsaXNpb25Cb3gueTIgKiB0aWxlVG9WaWV3cG9ydCArIHByb2plY3RlZFBvaW50LnBvaW50Lnk7XG5cbiAgICAgICAgaWYgKCFhbGxvd092ZXJsYXApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyaWQuaGl0VGVzdCh0bFgsIHRsWSwgYnJYLCBiclkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgYm94OiBbXSxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2NyZWVuOiBmYWxzZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJveDogW3RsWCwgdGxZLCBiclgsIGJyWV0sXG4gICAgICAgICAgICBvZmZzY3JlZW46IHRoaXMuaXNPZmZzY3JlZW4odGxYLCB0bFksIGJyWCwgYnJZKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGFwcHJveGltYXRlVGlsZURpc3RhbmNlKHRpbGVEaXN0YW5jZSAgICAgLCBsYXN0U2VnbWVudEFuZ2xlICAgICAgICAsIHBpeGVsc1RvVGlsZVVuaXRzICAgICAgICAsIGNhbWVyYVRvQW5jaG9yRGlzdGFuY2UgICAgICAgICwgcGl0Y2hXaXRoTWFwICAgICAgICAgKSAgICAgICAgIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHF1aWNrIGFuZCBkaXJ0eSBzb2x1dGlvbiBmb3IgY2hvc2luZyB3aGljaCBjb2xsaXNpb24gY2lyY2xlcyB0byB1c2UgKHNpbmNlIGNvbGxpc2lvbiBjaXJjbGVzIGFyZVxuICAgICAgICAvLyBsYWlkIG91dCBpbiB0aWxlIHVuaXRzKS4gSWRlYWxseSwgSSB0aGluayB3ZSBzaG91bGQgZ2VuZXJhdGUgY29sbGlzaW9uIGNpcmNsZXMgb24gdGhlIGZseSBpbiB2aWV3cG9ydCBjb29yZGluYXRlc1xuICAgICAgICAvLyBhdCB0aGUgdGltZSB3ZSBkbyBjb2xsaXNpb24gZGV0ZWN0aW9uLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzU0NzRcblxuICAgICAgICAvLyBpbmNpZGVuY2VTdHJldGNoIGlzIHRoZSByYXRpbyBvZiBob3cgbXVjaCB5IHNwYWNlIGEgbGFiZWwgdGFrZXMgdXAgb24gYSB0aWxlIHdoaWxlIGRyYXduIHBlcnBlbmRpY3VsYXIgdG8gdGhlIHZpZXdwb3J0IHZzXG4gICAgICAgIC8vICBob3cgbXVjaCBzcGFjZSBpdCB3b3VsZCB0YWtlIHVwIGlmIGl0IHdlcmUgZHJhd24gZmxhdCBvbiB0aGUgdGlsZVxuICAgICAgICAvLyBVc2luZyBsYXcgb2Ygc2luZXMsIGNhbWVyYV90b19hbmNob3Ivc2luKGdyb3VuZF9hbmdsZSkgPSBjYW1lcmFfdG9fY2VudGVyL3NpbihpbmNpZGVuY2VfYW5nbGUpXG4gICAgICAgIC8vIEluY2lkZW5jZSBhbmdsZSA5MCAtPiBoZWFkIG9uLCBzaW4oaW5jaWRlbmNlX2FuZ2xlKSA9IDEsIG5vIHN0cmV0Y2hcbiAgICAgICAgLy8gSW5jaWRlbmNlIGFuZ2xlIDEgLT4gdmVyeSBvYmxpcXVlLCBzaW4oaW5jaWRlbmNlX2FuZ2xlKSA9fiAwLCBsb3RzIG9mIHN0cmV0Y2hcbiAgICAgICAgLy8gZ3JvdW5kX2FuZ2xlID0gdV9waXRjaCArIFBJLzIgLT4gc2luKGdyb3VuZF9hbmdsZSkgPSBjb3ModV9waXRjaClcbiAgICAgICAgLy8gaW5jaWRlbmNlU3RyZXRjaCA9IDEgLyBzaW4oaW5jaWRlbmNlQW5nbGUpXG5cbiAgICAgICAgY29uc3QgaW5jaWRlbmNlU3RyZXRjaCA9IHBpdGNoV2l0aE1hcCA/IDEgOiBjYW1lcmFUb0FuY2hvckRpc3RhbmNlIC8gdGhpcy5waXRjaGZhY3RvcjtcbiAgICAgICAgY29uc3QgbGFzdFNlZ21lbnRUaWxlID0gdGlsZURpc3RhbmNlLmxhc3RTZWdtZW50Vmlld3BvcnREaXN0YW5jZSAqIHBpeGVsc1RvVGlsZVVuaXRzO1xuICAgICAgICByZXR1cm4gdGlsZURpc3RhbmNlLnByZXZUaWxlRGlzdGFuY2UgK1xuICAgICAgICAgICAgbGFzdFNlZ21lbnRUaWxlICtcbiAgICAgICAgICAgIChpbmNpZGVuY2VTdHJldGNoIC0gMSkgKiBsYXN0U2VnbWVudFRpbGUgKiBNYXRoLmFicyhNYXRoLnNpbihsYXN0U2VnbWVudEFuZ2xlKSk7XG4gICAgfVxuXG4gICAgcGxhY2VDb2xsaXNpb25DaXJjbGVzKGNvbGxpc2lvbkNpcmNsZXMgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93T3ZlcmxhcCAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFBpeGVsUmF0aW8gICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lVmVydGV4QXJyYXkgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhPZmZzZXRBcnJheSAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemUgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zTWF0cml4ICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFBsYW5lTWF0cml4ICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Q29sbGlzaW9uQ2lyY2xlcyAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hXaXRoTWFwICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgIGNvbnN0IHBsYWNlZENvbGxpc2lvbkNpcmNsZXMgPSBbXTtcblxuICAgICAgICBjb25zdCBwcm9qZWN0ZWRBbmNob3IgPSB0aGlzLnByb2plY3RBbmNob3IocG9zTWF0cml4LCBzeW1ib2wuYW5jaG9yWCwgc3ltYm9sLmFuY2hvclkpO1xuXG4gICAgICAgIGNvbnN0IHByb2plY3Rpb25DYWNoZSA9IHt9O1xuICAgICAgICBjb25zdCBmb250U2NhbGUgPSBmb250U2l6ZSAvIDI0O1xuICAgICAgICBjb25zdCBsaW5lT2Zmc2V0WCA9IHN5bWJvbC5saW5lT2Zmc2V0WCAqIGZvbnRTaXplO1xuICAgICAgICBjb25zdCBsaW5lT2Zmc2V0WSA9IHN5bWJvbC5saW5lT2Zmc2V0WSAqIGZvbnRTaXplO1xuXG4gICAgICAgIGNvbnN0IHRpbGVVbml0QW5jaG9yUG9pbnQgPSBuZXcgUG9pbnQoc3ltYm9sLmFuY2hvclgsIHN5bWJvbC5hbmNob3JZKTtcbiAgICAgICAgLy8gcHJvamVjdGlvbi5wcm9qZWN0IGdlbmVyYXRlcyBOREMgY29vcmRpbmF0ZXMsIGFzIG9wcG9zZWQgdG8gdGhlXG4gICAgICAgIC8vIHBpeGVsLWJhc2VkIGdyaWQgY29vcmRpbmF0ZXMgZ2VuZXJhdGVkIGJ5IHRoaXMucHJvamVjdFBvaW50XG4gICAgICAgIGNvbnN0IGxhYmVsUGxhbmVBbmNob3JQb2ludCA9XG4gICAgICAgICAgICBwcm9qZWN0aW9uLnByb2plY3QodGlsZVVuaXRBbmNob3JQb2ludCwgbGFiZWxQbGFuZU1hdHJpeCkucG9pbnQ7XG4gICAgICAgIGNvbnN0IGZpcnN0QW5kTGFzdEdseXBoID0gcHJvamVjdGlvbi5wbGFjZUZpcnN0QW5kTGFzdEdseXBoKFxuICAgICAgICAgICAgZm9udFNjYWxlLFxuICAgICAgICAgICAgZ2x5cGhPZmZzZXRBcnJheSxcbiAgICAgICAgICAgIGxpbmVPZmZzZXRYLFxuICAgICAgICAgICAgbGluZU9mZnNldFksXG4gICAgICAgICAgICAvKmZsaXAqLyBmYWxzZSxcbiAgICAgICAgICAgIGxhYmVsUGxhbmVBbmNob3JQb2ludCxcbiAgICAgICAgICAgIHRpbGVVbml0QW5jaG9yUG9pbnQsXG4gICAgICAgICAgICBzeW1ib2wsXG4gICAgICAgICAgICBsaW5lVmVydGV4QXJyYXksXG4gICAgICAgICAgICBsYWJlbFBsYW5lTWF0cml4LFxuICAgICAgICAgICAgcHJvamVjdGlvbkNhY2hlLFxuICAgICAgICAgICAgLypyZXR1cm4gdGlsZSBkaXN0YW5jZSovIHRydWUpO1xuXG4gICAgICAgIGxldCBjb2xsaXNpb25EZXRlY3RlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgZW50aXJlbHlPZmZzY3JlZW4gPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IHRpbGVUb1ZpZXdwb3J0ID0gcHJvamVjdGVkQW5jaG9yLnBlcnNwZWN0aXZlUmF0aW8gKiB0ZXh0UGl4ZWxSYXRpbztcbiAgICAgICAgLy8gcGl4ZWxzVG9UaWxlVW5pdHMgaXMgdXNlZCBmb3IgdHJhbnNsYXRpbmcgbGluZSBnZW9tZXRyeSB0byB0aWxlIHVuaXRzXG4gICAgICAgIC8vIC4uLiBzbyB3ZSBjYXJlIGFib3V0ICdzY2FsZScgYnV0IG5vdCAncGVyc3BlY3RpdmVSYXRpbydcbiAgICAgICAgLy8gZXF1aXZhbGVudCB0byBwaXhlbF90b190aWxlX3VuaXRzXG4gICAgICAgIGNvbnN0IHBpeGVsc1RvVGlsZVVuaXRzID0gMSAvICh0ZXh0UGl4ZWxSYXRpbyAqIHNjYWxlKTtcblxuICAgICAgICBsZXQgZmlyc3RUaWxlRGlzdGFuY2UgPSAwLCBsYXN0VGlsZURpc3RhbmNlID0gMDtcbiAgICAgICAgaWYgKGZpcnN0QW5kTGFzdEdseXBoKSB7XG4gICAgICAgICAgICBmaXJzdFRpbGVEaXN0YW5jZSA9IHRoaXMuYXBwcm94aW1hdGVUaWxlRGlzdGFuY2UoZmlyc3RBbmRMYXN0R2x5cGguZmlyc3QudGlsZURpc3RhbmNlLCBmaXJzdEFuZExhc3RHbHlwaC5maXJzdC5hbmdsZSwgcGl4ZWxzVG9UaWxlVW5pdHMsIHByb2plY3RlZEFuY2hvci5jYW1lcmFEaXN0YW5jZSwgcGl0Y2hXaXRoTWFwKTtcbiAgICAgICAgICAgIGxhc3RUaWxlRGlzdGFuY2UgPSB0aGlzLmFwcHJveGltYXRlVGlsZURpc3RhbmNlKGZpcnN0QW5kTGFzdEdseXBoLmxhc3QudGlsZURpc3RhbmNlLCBmaXJzdEFuZExhc3RHbHlwaC5sYXN0LmFuZ2xlLCBwaXhlbHNUb1RpbGVVbml0cywgcHJvamVjdGVkQW5jaG9yLmNhbWVyYURpc3RhbmNlLCBwaXRjaFdpdGhNYXApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb2xsaXNpb25DaXJjbGVzLmxlbmd0aDsgayArPSA1KSB7XG4gICAgICAgICAgICBjb25zdCBhbmNob3JQb2ludFggPSBjb2xsaXNpb25DaXJjbGVzW2tdO1xuICAgICAgICAgICAgY29uc3QgYW5jaG9yUG9pbnRZID0gY29sbGlzaW9uQ2lyY2xlc1trICsgMV07XG4gICAgICAgICAgICBjb25zdCB0aWxlVW5pdFJhZGl1cyA9IGNvbGxpc2lvbkNpcmNsZXNbayArIDJdO1xuICAgICAgICAgICAgY29uc3QgYm94U2lnbmVkRGlzdGFuY2VGcm9tQW5jaG9yID0gY29sbGlzaW9uQ2lyY2xlc1trICsgM107XG4gICAgICAgICAgICBpZiAoIWZpcnN0QW5kTGFzdEdseXBoIHx8XG4gICAgICAgICAgICAgICAgKGJveFNpZ25lZERpc3RhbmNlRnJvbUFuY2hvciA8IC1maXJzdFRpbGVEaXN0YW5jZSkgfHxcbiAgICAgICAgICAgICAgICAoYm94U2lnbmVkRGlzdGFuY2VGcm9tQW5jaG9yID4gbGFzdFRpbGVEaXN0YW5jZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgbGFiZWwgZWl0aGVyIGRvZXNuJ3QgZml0IG9uIGl0cyBsaW5lIG9yIHdlXG4gICAgICAgICAgICAgICAgLy8gZG9uJ3QgbmVlZCB0byB1c2UgdGhpcyBjaXJjbGUgYmVjYXVzZSB0aGUgbGFiZWxcbiAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IGV4dGVuZCB0aGlzIGZhci4gRWl0aGVyIHdheSwgbWFyayB0aGUgY2lyY2xlIHVudXNlZC5cbiAgICAgICAgICAgICAgICBtYXJrQ29sbGlzaW9uQ2lyY2xlVXNlZChjb2xsaXNpb25DaXJjbGVzLCBrLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByb2plY3RlZFBvaW50ID0gdGhpcy5wcm9qZWN0UG9pbnQocG9zTWF0cml4LCBhbmNob3JQb2ludFgsIGFuY2hvclBvaW50WSk7XG4gICAgICAgICAgICBjb25zdCByYWRpdXMgPSB0aWxlVW5pdFJhZGl1cyAqIHRpbGVUb1ZpZXdwb3J0O1xuXG4gICAgICAgICAgICBjb25zdCBhdExlYXN0T25lQ2lyY2xlUGxhY2VkID0gcGxhY2VkQ29sbGlzaW9uQ2lyY2xlcy5sZW5ndGggPiAwO1xuICAgICAgICAgICAgaWYgKGF0TGVhc3RPbmVDaXJjbGVQbGFjZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkeCA9IHByb2plY3RlZFBvaW50LnggLSBwbGFjZWRDb2xsaXNpb25DaXJjbGVzW3BsYWNlZENvbGxpc2lvbkNpcmNsZXMubGVuZ3RoIC0gNF07XG4gICAgICAgICAgICAgICAgY29uc3QgZHkgPSBwcm9qZWN0ZWRQb2ludC55IC0gcGxhY2VkQ29sbGlzaW9uQ2lyY2xlc1twbGFjZWRDb2xsaXNpb25DaXJjbGVzLmxlbmd0aCAtIDNdO1xuICAgICAgICAgICAgICAgIC8vIFRoZSBjaXJjbGUgZWRnZXMgdG91Y2ggd2hlbiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGVpciBjZW50ZXJzIGlzIDJ4IHRoZSByYWRpdXNcbiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBkaXN0YW5jZSBpcyAxeCB0aGUgcmFkaXVzLCB0aGV5J3JlIGRvdWJsZWQgdXAsIGFuZCB3ZSBjb3VsZCByZW1vdmVcbiAgICAgICAgICAgICAgICAvLyBldmVyeSBvdGhlciBjaXJjbGUgd2hpbGUga2VlcGluZyB0aGVtIGFsbCBpbiB0b3VjaC5cbiAgICAgICAgICAgICAgICAvLyBXZSBhY3R1YWxseSBzdGFydCByZW1vdmluZyBjaXJjbGVzIHdoZW4gdGhlIGRpc3RhbmNlIGlzIOKImjJ4IHRoZSByYWRpdXM6XG4gICAgICAgICAgICAgICAgLy8gIHRoaW5uaW5nIHRoZSBudW1iZXIgb2YgY2lyY2xlcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGlzIGEgbWFqb3IgcGVyZm9ybWFuY2Ugd2luLFxuICAgICAgICAgICAgICAgIC8vICBhbmQgdGhlIHNtYWxsIGdhcHMgaW50cm9kdWNlZCBkb24ndCBtYWtlIGEgdmVyeSBub3RpY2VhYmxlIGRpZmZlcmVuY2UuXG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VkVG9vRGVuc2VseSA9IHJhZGl1cyAqIHJhZGl1cyAqIDIgPiBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgICAgICAgICAgICAgICBpZiAocGxhY2VkVG9vRGVuc2VseSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdExlYXN0T25lTW9yZUNpcmNsZSA9IChrICsgOCkgPCBjb2xsaXNpb25DaXJjbGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0TGVhc3RPbmVNb3JlQ2lyY2xlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0Qm94RGlzdGFuY2VUb0FuY2hvciA9IGNvbGxpc2lvbkNpcmNsZXNbayArIDhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuZXh0Qm94RGlzdGFuY2VUb0FuY2hvciA+IC1maXJzdFRpbGVEaXN0YW5jZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZXh0Qm94RGlzdGFuY2VUb0FuY2hvciA8IGxhc3RUaWxlRGlzdGFuY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGlkZSBzaWduaWZpY2FudGx5IG92ZXJsYXBwaW5nIGNpcmNsZXMsIHVubGVzcyB0aGlzIGlzIHRoZSBsYXN0IG9uZSB3ZSBjYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UsIGluIHdoaWNoIGNhc2Ugd2Ugd2FudCB0byBrZWVwIGl0IGluIHBsYWNlIGV2ZW4gaWYgaXQncyB0aWdodGx5IHBhY2tlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIG9uZSBiZWZvcmUgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya0NvbGxpc2lvbkNpcmNsZVVzZWQoY29sbGlzaW9uQ2lyY2xlcywgaywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY29sbGlzaW9uQm94QXJyYXlJbmRleCA9IGsgLyA1O1xuICAgICAgICAgICAgcGxhY2VkQ29sbGlzaW9uQ2lyY2xlcy5wdXNoKHByb2plY3RlZFBvaW50LngsIHByb2plY3RlZFBvaW50LnksIHJhZGl1cywgY29sbGlzaW9uQm94QXJyYXlJbmRleCk7XG4gICAgICAgICAgICBtYXJrQ29sbGlzaW9uQ2lyY2xlVXNlZChjb2xsaXNpb25DaXJjbGVzLCBrLCB0cnVlKTtcblxuICAgICAgICAgICAgZW50aXJlbHlPZmZzY3JlZW4gPSBlbnRpcmVseU9mZnNjcmVlbiAmJiB0aGlzLmlzT2Zmc2NyZWVuKHByb2plY3RlZFBvaW50LnggLSByYWRpdXMsIHByb2plY3RlZFBvaW50LnkgLSByYWRpdXMsIHByb2plY3RlZFBvaW50LnggKyByYWRpdXMsIHByb2plY3RlZFBvaW50LnkgKyByYWRpdXMpO1xuXG4gICAgICAgICAgICBpZiAoIWFsbG93T3ZlcmxhcCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdyaWQuaGl0VGVzdENpcmNsZShwcm9qZWN0ZWRQb2ludC54LCBwcm9qZWN0ZWRQb2ludC55LCByYWRpdXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2hvd0NvbGxpc2lvbkNpcmNsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2NyZWVuOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGVhcmx5IGV4aXQgaWYgd2UncmUgc2hvd2luZyB0aGUgZGVidWcgY2lyY2xlcyBiZWNhdXNlIHdlIHN0aWxsIHdhbnQgdG8gY2FsY3VsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBjaXJjbGVzIGFyZSBpbiB1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkRldGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjaXJjbGVzOiBjb2xsaXNpb25EZXRlY3RlZCA/IFtdIDogcGxhY2VkQ29sbGlzaW9uQ2lyY2xlcyxcbiAgICAgICAgICAgIG9mZnNjcmVlbjogZW50aXJlbHlPZmZzY3JlZW5cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCZWNhdXNlIHRoZSBnZW9tZXRyaWVzIGluIHRoZSBDb2xsaXNpb25JbmRleCBhcmUgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgc2hhcGUgb2ZcbiAgICAgKiBzeW1ib2xzIG9uIHRoZSBtYXAsIHdlIHVzZSB0aGUgQ29sbGlzaW9uSW5kZXggdG8gbG9vayB1cCB0aGUgc3ltYm9sIHBhcnQgb2ZcbiAgICAgKiBgcXVlcnlSZW5kZXJlZEZlYXR1cmVzYC4gTm9uLXN5bWJvbCBmZWF0dXJlcyBhcmUgbG9va2VkIHVwIHRpbGUtYnktdGlsZSwgYW5kXG4gICAgICogaGlzdG9yaWNhbGx5IGNvbGxpc2lvbnMgd2VyZSBoYW5kbGVkIHBlci10aWxlLlxuICAgICAqXG4gICAgICogRm9yIHRoaXMgcmVhc29uLCBgcXVlcnlSZW5kZXJlZFN5bWJvbHNgIHN0aWxsIHRha2VzIHRpbGUgY29vcmRpbmF0ZSBpbnB1dHMgYW5kXG4gICAgICogY29udmVydHMgdGhlbSBiYWNrIHRvIHZpZXdwb3J0IGNvb3JkaW5hdGVzLiBUaGUgY2hhbmdlIHRvIGEgdmlld3BvcnQgY29vcmRpbmF0ZVxuICAgICAqIENvbGxpc2lvbkluZGV4IG1lYW5zIGl0J3Mgbm93IHBvc3NpYmxlIHRvIHJlLWRlc2lnbiBxdWVyeVJlbmRlcmVkU3ltYm9scyB0b1xuICAgICAqIHJ1biBlbnRpcmVseSBpbiB2aWV3cG9ydCBjb29yZGluYXRlcywgc2F2aW5nIHVubmVjZXNzYXJ5IGNvbnZlcnNpb25zLlxuICAgICAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNTQ3NVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBxdWVyeVJlbmRlcmVkU3ltYm9scyhxdWVyeUdlb21ldHJ5ICAgICAsIHRpbGVDb29yZCAgICAgICAgICAgICAgICAgICwgdGV4dFBpeGVsUmF0aW8gICAgICAgICwgY29sbGlzaW9uQm94QXJyYXkgICAgICAgICAgICAgICAgICAgLCBzb3VyY2VJRCAgICAgICAgLCBidWNrZXRJbnN0YW5jZUlkcyAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCBzb3VyY2VMYXllckZlYXR1cmVzID0ge307XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgICAgIGlmIChxdWVyeUdlb21ldHJ5Lmxlbmd0aCA9PT0gMCB8fCAodGhpcy5ncmlkLmtleXNMZW5ndGgoKSA9PT0gMCAmJiB0aGlzLmlnbm9yZWRHcmlkLmtleXNMZW5ndGgoKSA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3NNYXRyaXggPSB0aGlzLnRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgodGlsZUNvb3JkLnRvVW53cmFwcGVkKCkpO1xuXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gW107XG4gICAgICAgIGxldCBtaW5YID0gSW5maW5pdHk7XG4gICAgICAgIGxldCBtaW5ZID0gSW5maW5pdHk7XG4gICAgICAgIGxldCBtYXhYID0gLUluZmluaXR5O1xuICAgICAgICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWVyeUdlb21ldHJ5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByaW5nID0gcXVlcnlHZW9tZXRyeVtpXTtcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcmluZy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLnByb2plY3RQb2ludChwb3NNYXRyaXgsIHJpbmdba10ueCwgcmluZ1trXS55KTtcbiAgICAgICAgICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgcC54KTtcbiAgICAgICAgICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgcC55KTtcbiAgICAgICAgICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgcC54KTtcbiAgICAgICAgICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgcC55KTtcbiAgICAgICAgICAgICAgICBxdWVyeS5wdXNoKHApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGlsZUlEID0gdGlsZUNvb3JkLmtleTtcblxuICAgICAgICBjb25zdCB0aGlzVGlsZUZlYXR1cmVzID0gW107XG4gICAgICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5ncmlkLnF1ZXJ5KG1pblgsIG1pblksIG1heFgsIG1heFkpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBPbmx5IGluY2x1ZGUgcmVzdWx0cyBmcm9tIHRoZSBtYXRjaGluZyBzb3VyY2UsIHRpbGUgYW5kIHZlcnNpb24gb2YgdGhlIGJ1Y2tldCB0aGF0IHdhcyBpbmRleGVkXG4gICAgICAgICAgICBpZiAoZmVhdHVyZXNbaV0uc291cmNlSUQgPT09IHNvdXJjZUlEICYmXG4gICAgICAgICAgICAgICAgZmVhdHVyZXNbaV0udGlsZUlEID09PSB0aWxlSUQgJiZcbiAgICAgICAgICAgICAgICBidWNrZXRJbnN0YW5jZUlkc1tmZWF0dXJlc1tpXS5idWNrZXRJbnN0YW5jZUlkXSkge1xuICAgICAgICAgICAgICAgIHRoaXNUaWxlRmVhdHVyZXMucHVzaChmZWF0dXJlc1tpXS5ib3hJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWdub3JlZEZlYXR1cmVzID0gdGhpcy5pZ25vcmVkR3JpZC5xdWVyeShtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZ25vcmVkRmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpZ25vcmVkRmVhdHVyZXNbaV0uc291cmNlSUQgPT09IHNvdXJjZUlEICYmXG4gICAgICAgICAgICAgICAgaWdub3JlZEZlYXR1cmVzW2ldLnRpbGVJRCA9PT0gdGlsZUlEICYmXG4gICAgICAgICAgICAgICAgYnVja2V0SW5zdGFuY2VJZHNbaWdub3JlZEZlYXR1cmVzW2ldLmJ1Y2tldEluc3RhbmNlSWRdKSB7XG4gICAgICAgICAgICAgICAgdGhpc1RpbGVGZWF0dXJlcy5wdXNoKGlnbm9yZWRGZWF0dXJlc1tpXS5ib3hJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXNUaWxlRmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NraW5nID0gY29sbGlzaW9uQm94QXJyYXkuZ2V0KHRoaXNUaWxlRmVhdHVyZXNbaV0pO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSBibG9ja2luZy5zb3VyY2VMYXllckluZGV4O1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZUluZGV4ID0gYmxvY2tpbmcuZmVhdHVyZUluZGV4O1xuICAgICAgICAgICAgY29uc3QgYnVja2V0SW5kZXggPSBibG9ja2luZy5idWNrZXRJbmRleDtcblxuICAgICAgICAgICAgLy8gU2tpcCBhbHJlYWR5IHNlZW4gZmVhdHVyZXMuXG4gICAgICAgICAgICBpZiAoc291cmNlTGF5ZXJGZWF0dXJlc1tzb3VyY2VMYXllcl0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVyRmVhdHVyZXNbc291cmNlTGF5ZXJdID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc291cmNlTGF5ZXJGZWF0dXJlc1tzb3VyY2VMYXllcl1bZmVhdHVyZUluZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc291cmNlTGF5ZXJGZWF0dXJlc1tzb3VyY2VMYXllcl1bZmVhdHVyZUluZGV4XSA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNvdXJjZUxheWVyRmVhdHVyZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVJbmRleF1bYnVja2V0SW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHF1ZXJ5IGludGVyc2VjdHMgd2l0aCB0aGUgZmVhdHVyZSBib3hcbiAgICAgICAgICAgIC8vIFwiQ29sbGlzaW9uIENpcmNsZXNcIiBmb3IgbGluZSBsYWJlbHMgYXJlIHRyZWF0ZWQgYXMgYm94ZXMgaGVyZVxuICAgICAgICAgICAgLy8gU2luY2UgdGhlcmUncyBubyBhY3R1YWwgY29sbGlzaW9uIHRha2luZyBwbGFjZSwgdGhlIGNpcmNsZSB2cy4gc3F1YXJlXG4gICAgICAgICAgICAvLyBkaXN0aW5jdGlvbiBkb2Vzbid0IG1hdHRlciBhcyBtdWNoLCBhbmQgYm94IGdlb21ldHJ5IGlzIGVhc2llclxuICAgICAgICAgICAgLy8gdG8gd29yayB3aXRoLlxuICAgICAgICAgICAgY29uc3QgcHJvamVjdGVkUG9pbnQgPSB0aGlzLnByb2plY3RBbmRHZXRQZXJzcGVjdGl2ZVJhdGlvKHBvc01hdHJpeCwgYmxvY2tpbmcuYW5jaG9yUG9pbnRYLCBibG9ja2luZy5hbmNob3JQb2ludFkpO1xuICAgICAgICAgICAgY29uc3QgdGlsZVRvVmlld3BvcnQgPSB0ZXh0UGl4ZWxSYXRpbyAqIHByb2plY3RlZFBvaW50LnBlcnNwZWN0aXZlUmF0aW87XG4gICAgICAgICAgICBjb25zdCB4MSA9IGJsb2NraW5nLngxICogdGlsZVRvVmlld3BvcnQgKyBwcm9qZWN0ZWRQb2ludC5wb2ludC54O1xuICAgICAgICAgICAgY29uc3QgeTEgPSBibG9ja2luZy55MSAqIHRpbGVUb1ZpZXdwb3J0ICsgcHJvamVjdGVkUG9pbnQucG9pbnQueTtcbiAgICAgICAgICAgIGNvbnN0IHgyID0gYmxvY2tpbmcueDIgKiB0aWxlVG9WaWV3cG9ydCArIHByb2plY3RlZFBvaW50LnBvaW50Lng7XG4gICAgICAgICAgICBjb25zdCB5MiA9IGJsb2NraW5nLnkyICogdGlsZVRvVmlld3BvcnQgKyBwcm9qZWN0ZWRQb2ludC5wb2ludC55O1xuICAgICAgICAgICAgY29uc3QgYmJveCA9IFtcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQoeDEsIHkxKSxcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQoeDIsIHkxKSxcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQoeDIsIHkyKSxcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQoeDEsIHkyKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGlmICghaW50ZXJzZWN0aW9uVGVzdHMucG9seWdvbkludGVyc2VjdHNQb2x5Z29uKHF1ZXJ5LCBiYm94KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzb3VyY2VMYXllckZlYXR1cmVzW3NvdXJjZUxheWVyXVtmZWF0dXJlSW5kZXhdW2J1Y2tldEluZGV4XSA9IHRydWU7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzVGlsZUZlYXR1cmVzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaW5zZXJ0Q29sbGlzaW9uQm94KGNvbGxpc2lvbkJveCAgICAgICAgICAgICAgICwgaWdub3JlUGxhY2VtZW50ICAgICAgICAgLCB0aWxlSUQgICAgICAgICwgc291cmNlSUQgICAgICAgICwgYnVja2V0SW5zdGFuY2VJZCAgICAgICAgLCBib3hTdGFydEluZGV4ICAgICAgICApIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IGlnbm9yZVBsYWNlbWVudCA/IHRoaXMuaWdub3JlZEdyaWQgOiB0aGlzLmdyaWQ7XG5cbiAgICAgICAgY29uc3Qga2V5ID0geyB0aWxlSUQ6IHRpbGVJRCwgc291cmNlSUQ6IHNvdXJjZUlELCBidWNrZXRJbnN0YW5jZUlkOiBidWNrZXRJbnN0YW5jZUlkLCBib3hJbmRleDogYm94U3RhcnRJbmRleCB9O1xuICAgICAgICBncmlkLmluc2VydChrZXksIGNvbGxpc2lvbkJveFswXSwgY29sbGlzaW9uQm94WzFdLCBjb2xsaXNpb25Cb3hbMl0sIGNvbGxpc2lvbkJveFszXSk7XG4gICAgfVxuXG4gICAgaW5zZXJ0Q29sbGlzaW9uQ2lyY2xlcyhjb2xsaXNpb25DaXJjbGVzICAgICAgICAgICAgICAgLCBpZ25vcmVQbGFjZW1lbnQgICAgICAgICAsIHRpbGVJRCAgICAgICAgLCBzb3VyY2VJRCAgICAgICAgLCBidWNrZXRJbnN0YW5jZUlkICAgICAgICAsIGJveFN0YXJ0SW5kZXggICAgICAgICkge1xuICAgICAgICBjb25zdCBncmlkID0gaWdub3JlUGxhY2VtZW50ID8gdGhpcy5pZ25vcmVkR3JpZCA6IHRoaXMuZ3JpZDtcblxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvbGxpc2lvbkNpcmNsZXMubGVuZ3RoOyBrICs9IDQpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHsgdGlsZUlEOiB0aWxlSUQsIHNvdXJjZUlEOiBzb3VyY2VJRCwgYnVja2V0SW5zdGFuY2VJZDogYnVja2V0SW5zdGFuY2VJZCwgYm94SW5kZXg6IGJveFN0YXJ0SW5kZXggKyBjb2xsaXNpb25DaXJjbGVzW2sgKyAzXSB9O1xuICAgICAgICAgICAgZ3JpZC5pbnNlcnRDaXJjbGUoa2V5LCBjb2xsaXNpb25DaXJjbGVzW2tdLCBjb2xsaXNpb25DaXJjbGVzW2sgKyAxXSwgY29sbGlzaW9uQ2lyY2xlc1trICsgMl0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvamVjdEFuY2hvcihwb3NNYXRyaXggICAgICAsIHggICAgICAgICwgeSAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHAgPSBbeCwgeSwgMCwgMV07XG4gICAgICAgIHByb2plY3Rpb24ueHlUcmFuc2Zvcm1NYXQ0KHAsIHAsIHBvc01hdHJpeCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwZXJzcGVjdGl2ZVJhdGlvOiAwLjUgKyAwLjUgKiAodGhpcy50cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSAvIHBbM10pLFxuICAgICAgICAgICAgY2FtZXJhRGlzdGFuY2U6IHBbM11cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcm9qZWN0UG9pbnQocG9zTWF0cml4ICAgICAgLCB4ICAgICAgICAsIHkgICAgICAgICkge1xuICAgICAgICBjb25zdCBwID0gW3gsIHksIDAsIDFdO1xuICAgICAgICBwcm9qZWN0aW9uLnh5VHJhbnNmb3JtTWF0NChwLCBwLCBwb3NNYXRyaXgpO1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KFxuICAgICAgICAgICAgKCgocFswXSAvIHBbM10gKyAxKSAvIDIpICogdGhpcy50cmFuc2Zvcm0ud2lkdGgpICsgdmlld3BvcnRQYWRkaW5nLFxuICAgICAgICAgICAgKCgoLXBbMV0gLyBwWzNdICsgMSkgLyAyKSAqIHRoaXMudHJhbnNmb3JtLmhlaWdodCkgKyB2aWV3cG9ydFBhZGRpbmdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm9qZWN0QW5kR2V0UGVyc3BlY3RpdmVSYXRpbyhwb3NNYXRyaXggICAgICAsIHggICAgICAgICwgeSAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHAgPSBbeCwgeSwgMCwgMV07XG4gICAgICAgIHByb2plY3Rpb24ueHlUcmFuc2Zvcm1NYXQ0KHAsIHAsIHBvc01hdHJpeCk7XG4gICAgICAgIGNvbnN0IGEgPSBuZXcgUG9pbnQoXG4gICAgICAgICAgICAoKChwWzBdIC8gcFszXSArIDEpIC8gMikgKiB0aGlzLnRyYW5zZm9ybS53aWR0aCkgKyB2aWV3cG9ydFBhZGRpbmcsXG4gICAgICAgICAgICAoKCgtcFsxXSAvIHBbM10gKyAxKSAvIDIpICogdGhpcy50cmFuc2Zvcm0uaGVpZ2h0KSArIHZpZXdwb3J0UGFkZGluZ1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcG9pbnQ6IGEsXG4gICAgICAgICAgICAvLyBTZWUgcGVyc3BlY3RpdmUgcmF0aW8gY29tbWVudCBpbiBzeW1ib2xfc2RmLnZlcnRleFxuICAgICAgICAgICAgLy8gV2UncmUgZG9pbmcgY29sbGlzaW9uIGRldGVjdGlvbiBpbiB2aWV3cG9ydCBzcGFjZSBzbyB3ZSBuZWVkXG4gICAgICAgICAgICAvLyB0byBzY2FsZSBkb3duIGJveGVzIGluIHRoZSBkaXN0YW5jZVxuICAgICAgICAgICAgcGVyc3BlY3RpdmVSYXRpbzogMC41ICsgMC41ICogKHRoaXMudHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgLyBwWzNdKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlzT2Zmc2NyZWVuKHgxICAgICAgICAsIHkxICAgICAgICAsIHgyICAgICAgICAsIHkyICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIHgyIDwgdmlld3BvcnRQYWRkaW5nIHx8IHgxID49IHRoaXMuc2NyZWVuUmlnaHRCb3VuZGFyeSB8fCB5MiA8IHZpZXdwb3J0UGFkZGluZyB8fCB5MSA+IHRoaXMuc2NyZWVuQm90dG9tQm91bmRhcnk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBtYXJrQ29sbGlzaW9uQ2lyY2xlVXNlZChjb2xsaXNpb25DaXJjbGVzICAgICAgICAgICAgICAgLCBpbmRleCAgICAgICAgLCB1c2VkICAgICAgICAgKSB7XG4gICAgY29sbGlzaW9uQ2lyY2xlc1tpbmRleCArIDRdID0gdXNlZCA/IDEgOiAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbGxpc2lvbkluZGV4O1xuIiwiLy8gICAgICBcblxuY29uc3QgRVhURU5UID0gcmVxdWlyZSgnLi4vZGF0YS9leHRlbnQnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4vKlxuICAgIFRoZSBDcm9zc1RpbGVTeW1ib2xJbmRleCBnZW5lcmFsbHkgd29ya3Mgb24gdGhlIGFzc3VtcHRpb24gdGhhdFxuICAgIGEgY29uY2VwdHVhbCBcInVuaXF1ZSBzeW1ib2xcIiBjYW4gYmUgaWRlbnRpZmllZCBieSB0aGUgdGV4dCBvZlxuICAgIHRoZSBsYWJlbCBjb21iaW5lZCB3aXRoIHRoZSBhbmNob3IgcG9pbnQuIFRoZSBnb2FsIGlzIHRvIGFzc2lnblxuICAgIHRoZXNlIGNvbmNlcHR1YWwgXCJ1bmlxdWUgc3ltYm9sc1wiIGEgc2hhcmVkIGNyb3NzVGlsZUlEIHRoYXQgY2FuIGJlXG4gICAgdXNlZCBieSBQbGFjZW1lbnQgdG8ga2VlcCBmYWRpbmcgb3BhY2l0eSBzdGF0ZXMgY29uc2lzdGVudCBhbmQgdG9cbiAgICBkZWR1cGxpY2F0ZSBsYWJlbHMuXG5cbiAgICBUaGUgQ3Jvc3NUaWxlU3ltYm9sSW5kZXggaW5kZXhlcyBhbGwgdGhlIGN1cnJlbnQgc3ltYm9sIGluc3RhbmNlcyBhbmRcbiAgICB0aGVpciBjcm9zc1RpbGVJRHMuIFdoZW4gYSBzeW1ib2wgYnVja2V0IGdldHMgYWRkZWQgb3IgdXBkYXRlZCwgdGhlXG4gICAgaW5kZXggYXNzaWducyBhIGNyb3NzVGlsZUlEIHRvIGVhY2ggb2YgaXQncyBzeW1ib2wgaW5zdGFuY2VzIGJ5IGVpdGhlclxuICAgIG1hdGNoaW5nIGl0IHdpdGggYW4gZXhpc3RpbmcgaWQgb3IgYXNzaWduaW5nIGEgbmV3IG9uZS5cbiovXG5cbi8vIFJvdW5kIGFuY2hvciBwb3NpdGlvbnMgdG8gcm91Z2hseSA0IHBpeGVsIGdyaWRcbmNvbnN0IHJvdW5kaW5nRmFjdG9yID0gNTEyIC8gRVhURU5UIC8gMjtcblxuY2xhc3MgVGlsZUxheWVySW5kZXgge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgXG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKHRpbGVJRCAgICAgICAgICAgICAgICAgICwgc3ltYm9sSW5zdGFuY2VzICAgICAgICAgICAgICAgICAgICAgICAsIGJ1Y2tldEluc3RhbmNlSWQgICAgICAgICkge1xuICAgICAgICB0aGlzLnRpbGVJRCA9IHRpbGVJRDtcbiAgICAgICAgdGhpcy5pbmRleGVkU3ltYm9sSW5zdGFuY2VzID0ge307XG4gICAgICAgIHRoaXMuYnVja2V0SW5zdGFuY2VJZCA9IGJ1Y2tldEluc3RhbmNlSWQ7XG5cbiAgICAgICAgZm9yIChjb25zdCBzeW1ib2xJbnN0YW5jZSBvZiBzeW1ib2xJbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHN5bWJvbEluc3RhbmNlLmtleTtcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmRleGVkU3ltYm9sSW5zdGFuY2VzW2tleV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4ZWRTeW1ib2xJbnN0YW5jZXNba2V5XSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhpcyB0aWxlIG1heSBoYXZlIG11bHRpcGxlIHN5bWJvbCBpbnN0YW5jZXMgd2l0aCB0aGUgc2FtZSBrZXlcbiAgICAgICAgICAgIC8vIFN0b3JlIGVhY2ggb25lIGFsb25nIHdpdGggaXRzIGNvb3JkaW5hdGVzXG4gICAgICAgICAgICB0aGlzLmluZGV4ZWRTeW1ib2xJbnN0YW5jZXNba2V5XS5wdXNoKHtcbiAgICAgICAgICAgICAgICBjcm9zc1RpbGVJRDogc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQsXG4gICAgICAgICAgICAgICAgY29vcmQ6IHRoaXMuZ2V0U2NhbGVkQ29vcmRpbmF0ZXMoc3ltYm9sSW5zdGFuY2UsIHRpbGVJRClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29udmVydHMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBpbnB1dCBzeW1ib2wgaW5zdGFuY2UgaW50byBjb29yZGluYXRlcyB0aGF0IGJlIGNhbiBjb21wYXJlZFxuICAgIC8vIGFnYWluc3Qgb3RoZXIgc3ltYm9scyBpbiB0aGlzIGluZGV4LiBDb29yZGluYXRlcyBhcmU6XG4gICAgLy8gKDEpIHdvcmxkLWJhc2VkIChzbyBhZnRlciBjb252ZXJzaW9uIHRoZSBzb3VyY2UgdGlsZSBpcyBpcnJlbGV2YW50KVxuICAgIC8vICgyKSBjb252ZXJ0ZWQgdG8gdGhlIHotc2NhbGUgb2YgdGhpcyBUaWxlTGF5ZXJJbmRleFxuICAgIC8vICgzKSBkb3duLXNhbXBsZWQgYnkgXCJyb3VuZGluZ0ZhY3RvclwiIGZyb20gdGlsZSBjb29yZGluYXRlIHByZWNpc2lvbiBpbiBvcmRlciB0byBiZVxuICAgIC8vICAgICBtb3JlIHRvbGVyYW50IG9mIHNtYWxsIGRpZmZlcmVuY2VzIGJldHdlZW4gdGlsZXMuXG4gICAgZ2V0U2NhbGVkQ29vcmRpbmF0ZXMoc3ltYm9sSW5zdGFuY2UgICAgICAgICAgICAgICAgLCBjaGlsZFRpbGVJRCAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCB6RGlmZmVyZW5jZSA9IGNoaWxkVGlsZUlELmNhbm9uaWNhbC56IC0gdGhpcy50aWxlSUQuY2Fub25pY2FsLno7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gcm91bmRpbmdGYWN0b3IgLyBNYXRoLnBvdygyLCB6RGlmZmVyZW5jZSk7XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IHN5bWJvbEluc3RhbmNlLmFuY2hvcjtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IE1hdGguZmxvb3IoKGNoaWxkVGlsZUlELmNhbm9uaWNhbC54ICogRVhURU5UICsgYW5jaG9yLngpICogc2NhbGUpLFxuICAgICAgICAgICAgeTogTWF0aC5mbG9vcigoY2hpbGRUaWxlSUQuY2Fub25pY2FsLnkgKiBFWFRFTlQgKyBhbmNob3IueSkgKiBzY2FsZSlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmaW5kTWF0Y2hlcyhzeW1ib2xJbnN0YW5jZXMgICAgICAgICAgICAgICAgICAgICAgICwgbmV3VGlsZUlEICAgICAgICAgICAgICAgICAgLCB6b29tQ3Jvc3NUaWxlSURzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCB0b2xlcmFuY2UgPSB0aGlzLnRpbGVJRC5jYW5vbmljYWwueiA8IG5ld1RpbGVJRC5jYW5vbmljYWwueiA/IDEgOiBNYXRoLnBvdygyLCB0aGlzLnRpbGVJRC5jYW5vbmljYWwueiAtIG5ld1RpbGVJRC5jYW5vbmljYWwueik7XG5cbiAgICAgICAgZm9yIChjb25zdCBzeW1ib2xJbnN0YW5jZSBvZiBzeW1ib2xJbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIGlmIChzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRCkge1xuICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGFzIGEgbWF0Y2gsIHNraXBcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW5kZXhlZEluc3RhbmNlcyA9IHRoaXMuaW5kZXhlZFN5bWJvbEluc3RhbmNlc1tzeW1ib2xJbnN0YW5jZS5rZXldO1xuICAgICAgICAgICAgaWYgKCFpbmRleGVkSW5zdGFuY2VzKSB7XG4gICAgICAgICAgICAgICAgLy8gTm8gc3ltYm9sIHdpdGggdGhpcyBrZXkgaW4gdGhpcyBidWNrZXRcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc2NhbGVkU3ltYm9sQ29vcmQgPSB0aGlzLmdldFNjYWxlZENvb3JkaW5hdGVzKHN5bWJvbEluc3RhbmNlLCBuZXdUaWxlSUQpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRoaXNUaWxlU3ltYm9sIG9mIGluZGV4ZWRJbnN0YW5jZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYW55IHN5bWJvbCB3aXRoIHRoZSBzYW1lIGtleXMgd2hvc2UgY29vcmRpbmF0ZXMgYXJlIHdpdGhpbiAxXG4gICAgICAgICAgICAgICAgLy8gZ3JpZCB1bml0LiAod2l0aCBhIDRweCBncmlkLCB0aGlzIGNvdmVycyBhIDEycHggYnkgMTJweCBhcmVhKVxuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyh0aGlzVGlsZVN5bWJvbC5jb29yZC54IC0gc2NhbGVkU3ltYm9sQ29vcmQueCkgPD0gdG9sZXJhbmNlICYmXG4gICAgICAgICAgICAgICAgICAgIE1hdGguYWJzKHRoaXNUaWxlU3ltYm9sLmNvb3JkLnkgLSBzY2FsZWRTeW1ib2xDb29yZC55KSA8PSB0b2xlcmFuY2UgJiZcbiAgICAgICAgICAgICAgICAgICAgIXpvb21Dcm9zc1RpbGVJRHNbdGhpc1RpbGVTeW1ib2wuY3Jvc3NUaWxlSURdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9uY2Ugd2UndmUgbWFya2VkIG91cnNlbHZlcyBkdXBsaWNhdGUgYWdhaW5zdCB0aGlzIHBhcmVudCBzeW1ib2wsXG4gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGxldCBhbnkgb3RoZXIgc3ltYm9scyBhdCB0aGUgc2FtZSB6b29tIGxldmVsIGR1cGxpY2F0ZSBhZ2FpbnN0XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzYW1lIHBhcmVudCAoc2VlIGlzc3VlICM1OTkzKVxuICAgICAgICAgICAgICAgICAgICB6b29tQ3Jvc3NUaWxlSURzW3RoaXNUaWxlU3ltYm9sLmNyb3NzVGlsZUlEXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEID0gdGhpc1RpbGVTeW1ib2wuY3Jvc3NUaWxlSUQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgQ3Jvc3NUaWxlSURzIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm1heENyb3NzVGlsZUlEID0gMDtcbiAgICB9XG4gICAgZ2VuZXJhdGUoKSB7XG4gICAgICAgIHJldHVybiArK3RoaXMubWF4Q3Jvc3NUaWxlSUQ7XG4gICAgfVxufVxuXG5jbGFzcyBDcm9zc1RpbGVTeW1ib2xMYXllckluZGV4IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaW5kZXhlcyA9IHt9O1xuICAgICAgICB0aGlzLnVzZWRDcm9zc1RpbGVJRHMgPSB7fTtcbiAgICB9XG5cbiAgICBhZGRCdWNrZXQodGlsZUlEICAgICAgICAgICAgICAgICAgLCBidWNrZXQgICAgICAgICAgICAgICwgY3Jvc3NUaWxlSURzICAgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXhlc1t0aWxlSUQub3ZlcnNjYWxlZFpdICYmXG4gICAgICAgICAgICB0aGlzLmluZGV4ZXNbdGlsZUlELm92ZXJzY2FsZWRaXVt0aWxlSUQua2V5XSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXhlc1t0aWxlSUQub3ZlcnNjYWxlZFpdW3RpbGVJRC5rZXldLmJ1Y2tldEluc3RhbmNlSWQgPT09XG4gICAgICAgICAgICAgICAgYnVja2V0LmJ1Y2tldEluc3RhbmNlSWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFdlJ3JlIHJlcGxhY2luZyB0aGlzIGJ1Y2tldCB3aXRoIGFuIHVwZGF0ZWQgdmVyc2lvblxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgb2xkIGJ1Y2tldCdzIFwidXNlZCBjcm9zc1RpbGVJRHNcIiBub3cgc28gdGhhdFxuICAgICAgICAgICAgICAgIC8vIHRoZSBuZXcgYnVja2V0IGNhbiBjbGFpbSB0aGVtLlxuICAgICAgICAgICAgICAgIC8vIFRoZSBvbGQgaW5kZXggZW50cmllcyB0aGVtc2VsdmVzIHN0aWNrIGFyb3VuZCB1bnRpbFxuICAgICAgICAgICAgICAgIC8vICdyZW1vdmVTdGFsZUJ1Y2tldHMnIGlzIGNhbGxlZC5cbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUJ1Y2tldENyb3NzVGlsZUlEcyh0aWxlSUQub3ZlcnNjYWxlZFosXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhlc1t0aWxlSUQub3ZlcnNjYWxlZFpdW3RpbGVJRC5rZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgc3ltYm9sSW5zdGFuY2Ugb2YgYnVja2V0LnN5bWJvbEluc3RhbmNlcykge1xuICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnVzZWRDcm9zc1RpbGVJRHNbdGlsZUlELm92ZXJzY2FsZWRaXSkge1xuICAgICAgICAgICAgdGhpcy51c2VkQ3Jvc3NUaWxlSURzW3RpbGVJRC5vdmVyc2NhbGVkWl0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB6b29tQ3Jvc3NUaWxlSURzID0gdGhpcy51c2VkQ3Jvc3NUaWxlSURzW3RpbGVJRC5vdmVyc2NhbGVkWl07XG5cbiAgICAgICAgZm9yIChjb25zdCB6b29tIGluIHRoaXMuaW5kZXhlcykge1xuICAgICAgICAgICAgY29uc3Qgem9vbUluZGV4ZXMgPSB0aGlzLmluZGV4ZXNbem9vbV07XG4gICAgICAgICAgICBpZiAoTnVtYmVyKHpvb20pID4gdGlsZUlELm92ZXJzY2FsZWRaKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiB6b29tSW5kZXhlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEluZGV4ID0gem9vbUluZGV4ZXNbaWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleC50aWxlSUQuaXNDaGlsZE9mKHRpbGVJRCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkSW5kZXguZmluZE1hdGNoZXMoYnVja2V0LnN5bWJvbEluc3RhbmNlcywgdGlsZUlELCB6b29tQ3Jvc3NUaWxlSURzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Q29vcmQgPSB0aWxlSUQuc2NhbGVkVG8oTnVtYmVyKHpvb20pKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJbmRleCA9IHpvb21JbmRleGVzW3BhcmVudENvb3JkLmtleV07XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEluZGV4LmZpbmRNYXRjaGVzKGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMsIHRpbGVJRCwgem9vbUNyb3NzVGlsZUlEcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBzeW1ib2xJbnN0YW5jZSBvZiBidWNrZXQuc3ltYm9sSW5zdGFuY2VzKSB7XG4gICAgICAgICAgICBpZiAoIXN5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEKSB7XG4gICAgICAgICAgICAgICAgLy8gc3ltYm9sIGRpZCBub3QgbWF0Y2ggYW55IGtub3duIHN5bWJvbCwgYXNzaWduIGEgbmV3IGlkXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQgPSBjcm9zc1RpbGVJRHMuZ2VuZXJhdGUoKTtcbiAgICAgICAgICAgICAgICB6b29tQ3Jvc3NUaWxlSURzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGV4ZXNbdGlsZUlELm92ZXJzY2FsZWRaXVt0aWxlSUQua2V5XSA9IG5ldyBUaWxlTGF5ZXJJbmRleCh0aWxlSUQsIGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMsIGJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZW1vdmVCdWNrZXRDcm9zc1RpbGVJRHMoem9vbSAgICAgICAgICAgICAgICAgLCByZW1vdmVkQnVja2V0ICAgICAgICAgICAgICAgICkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiByZW1vdmVkQnVja2V0LmluZGV4ZWRTeW1ib2xJbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ltYm9sSW5zdGFuY2Ugb2YgcmVtb3ZlZEJ1Y2tldC5pbmRleGVkU3ltYm9sSW5zdGFuY2VzW2tleV0pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy51c2VkQ3Jvc3NUaWxlSURzW3pvb21dW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZVN0YWxlQnVja2V0cyhjdXJyZW50SURzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgbGV0IHRpbGVzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IHogaW4gdGhpcy5pbmRleGVzKSB7XG4gICAgICAgICAgICBjb25zdCB6b29tSW5kZXhlcyA9IHRoaXMuaW5kZXhlc1t6XTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGlsZUtleSBpbiB6b29tSW5kZXhlcykge1xuICAgICAgICAgICAgICAgIGlmICghY3VycmVudElEc1t6b29tSW5kZXhlc1t0aWxlS2V5XS5idWNrZXRJbnN0YW5jZUlkXSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUJ1Y2tldENyb3NzVGlsZUlEcyh6LCB6b29tSW5kZXhlc1t0aWxlS2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB6b29tSW5kZXhlc1t0aWxlS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZXNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRpbGVzQ2hhbmdlZDtcbiAgICB9XG59XG5cbmNsYXNzIENyb3NzVGlsZVN5bWJvbEluZGV4IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubGF5ZXJJbmRleGVzID0ge307XG4gICAgICAgIHRoaXMuY3Jvc3NUaWxlSURzID0gbmV3IENyb3NzVGlsZUlEcygpO1xuICAgICAgICB0aGlzLm1heEJ1Y2tldEluc3RhbmNlSWQgPSAwO1xuICAgIH1cblxuICAgIGFkZExheWVyKHN0eWxlTGF5ZXIgICAgICAgICAgICAsIHRpbGVzICAgICAgICAgICAgICkge1xuICAgICAgICBsZXQgbGF5ZXJJbmRleCA9IHRoaXMubGF5ZXJJbmRleGVzW3N0eWxlTGF5ZXIuaWRdO1xuICAgICAgICBpZiAobGF5ZXJJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsYXllckluZGV4ID0gdGhpcy5sYXllckluZGV4ZXNbc3R5bGVMYXllci5pZF0gPSBuZXcgQ3Jvc3NUaWxlU3ltYm9sTGF5ZXJJbmRleCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN5bWJvbEJ1Y2tldHNDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRCdWNrZXRJRHMgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IHRpbGUgb2YgdGlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEJ1Y2tldCA9ICgodGlsZS5nZXRCdWNrZXQoc3R5bGVMYXllcikgICAgICkgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIXN5bWJvbEJ1Y2tldCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGlmICghc3ltYm9sQnVja2V0LmJ1Y2tldEluc3RhbmNlSWQpIHtcbiAgICAgICAgICAgICAgICBzeW1ib2xCdWNrZXQuYnVja2V0SW5zdGFuY2VJZCA9ICsrdGhpcy5tYXhCdWNrZXRJbnN0YW5jZUlkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGF5ZXJJbmRleC5hZGRCdWNrZXQodGlsZS50aWxlSUQsIHN5bWJvbEJ1Y2tldCwgdGhpcy5jcm9zc1RpbGVJRHMpKSB7XG4gICAgICAgICAgICAgICAgc3ltYm9sQnVja2V0c0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudEJ1Y2tldElEc1tzeW1ib2xCdWNrZXQuYnVja2V0SW5zdGFuY2VJZF0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxheWVySW5kZXgucmVtb3ZlU3RhbGVCdWNrZXRzKGN1cnJlbnRCdWNrZXRJRHMpKSB7XG4gICAgICAgICAgICBzeW1ib2xCdWNrZXRzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3ltYm9sQnVja2V0c0NoYW5nZWQ7XG4gICAgfVxuXG4gICAgcHJ1bmVVbnVzZWRMYXllcnModXNlZExheWVycyAgICAgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCB1c2VkTGF5ZXJNYXAgPSB7fTtcbiAgICAgICAgdXNlZExheWVycy5mb3JFYWNoKCh1c2VkTGF5ZXIpID0+IHtcbiAgICAgICAgICAgIHVzZWRMYXllck1hcFt1c2VkTGF5ZXJdID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiB0aGlzLmxheWVySW5kZXhlcykge1xuICAgICAgICAgICAgaWYgKCF1c2VkTGF5ZXJNYXBbbGF5ZXJJZF0pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5sYXllckluZGV4ZXNbbGF5ZXJJZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ3Jvc3NUaWxlU3ltYm9sSW5kZXg7XG4iLCIvLyAgICAgIFxuXG5jb25zdCBpbnRlcnBvbGF0ZSA9IHJlcXVpcmUoJy4uL3N0eWxlLXNwZWMvdXRpbC9pbnRlcnBvbGF0ZScpLm51bWJlcjtcbmNvbnN0IEFuY2hvciA9IHJlcXVpcmUoJy4uL3N5bWJvbC9hbmNob3InKTtcbmNvbnN0IGNoZWNrTWF4QW5nbGUgPSByZXF1aXJlKCcuL2NoZWNrX21heF9hbmdsZScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRBbmNob3JzO1xuXG5mdW5jdGlvbiBnZXRBbmNob3JzKGxpbmUgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgc3BhY2luZyAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICBtYXhBbmdsZSAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICBzaGFwZWRUZXh0ICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVkSWNvbiAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICBnbHlwaFNpemUgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgYm94U2NhbGUgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcnNjYWxpbmcgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgdGlsZUV4dGVudCAgICAgICAgKSB7XG5cbiAgICAvLyBSZXNhbXBsZSBhIGxpbmUgdG8gZ2V0IGFuY2hvciBwb2ludHMgZm9yIGxhYmVscyBhbmQgY2hlY2sgdGhhdCBlYWNoXG4gICAgLy8gcG90ZW50aWFsIGxhYmVsIHBhc3NlcyB0ZXh0LW1heC1hbmdsZSBjaGVjayBhbmQgaGFzIGVub3VnaCBmcm9vbSB0byBmaXRcbiAgICAvLyBvbiB0aGUgbGluZS5cblxuICAgIGNvbnN0IGFuZ2xlV2luZG93U2l6ZSA9IHNoYXBlZFRleHQgP1xuICAgICAgICAzIC8gNSAqIGdseXBoU2l6ZSAqIGJveFNjYWxlIDpcbiAgICAgICAgMDtcblxuICAgIGNvbnN0IGxhYmVsTGVuZ3RoID0gTWF0aC5tYXgoXG4gICAgICAgIHNoYXBlZFRleHQgPyBzaGFwZWRUZXh0LnJpZ2h0IC0gc2hhcGVkVGV4dC5sZWZ0IDogMCxcbiAgICAgICAgc2hhcGVkSWNvbiA/IHNoYXBlZEljb24ucmlnaHQgLSBzaGFwZWRJY29uLmxlZnQgOiAwKTtcblxuICAgIC8vIElzIHRoZSBsaW5lIGNvbnRpbnVlZCBmcm9tIG91dHNpZGUgdGhlIHRpbGUgYm91bmRhcnk/XG4gICAgY29uc3QgaXNMaW5lQ29udGludWVkID0gbGluZVswXS54ID09PSAwIHx8IGxpbmVbMF0ueCA9PT0gdGlsZUV4dGVudCB8fCBsaW5lWzBdLnkgPT09IDAgfHwgbGluZVswXS55ID09PSB0aWxlRXh0ZW50O1xuXG4gICAgLy8gSXMgdGhlIGxhYmVsIGxvbmcsIHJlbGF0aXZlIHRvIHRoZSBzcGFjaW5nP1xuICAgIC8vIElmIHNvLCBhZGp1c3QgdGhlIHNwYWNpbmcgc28gdGhlcmUgaXMgYWx3YXlzIGEgbWluaW11bSBzcGFjZSBvZiBgc3BhY2luZyAvIDRgIGJldHdlZW4gbGFiZWwgZWRnZXMuXG4gICAgaWYgKHNwYWNpbmcgLSBsYWJlbExlbmd0aCAqIGJveFNjYWxlICA8IHNwYWNpbmcgLyA0KSB7XG4gICAgICAgIHNwYWNpbmcgPSBsYWJlbExlbmd0aCAqIGJveFNjYWxlICsgc3BhY2luZyAvIDQ7XG4gICAgfVxuXG4gICAgLy8gT2Zmc2V0IHRoZSBmaXJzdCBhbmNob3IgYnk6XG4gICAgLy8gRWl0aGVyIGhhbGYgdGhlIGxhYmVsIGxlbmd0aCBwbHVzIGEgZml4ZWQgZXh0cmEgb2Zmc2V0IGlmIHRoZSBsaW5lIGlzIG5vdCBjb250aW51ZWRcbiAgICAvLyBPciBoYWxmIHRoZSBzcGFjaW5nIGlmIHRoZSBsaW5lIGlzIGNvbnRpbnVlZC5cblxuICAgIC8vIEZvciBub24tY29udGludWVkIGxpbmVzLCBhZGQgYSBiaXQgb2YgZml4ZWQgZXh0cmEgb2Zmc2V0IHRvIGF2b2lkIGNvbGxpc2lvbnMgYXQgVCBpbnRlcnNlY3Rpb25zLlxuICAgIGNvbnN0IGZpeGVkRXh0cmFPZmZzZXQgPSBnbHlwaFNpemUgKiAyO1xuXG4gICAgY29uc3Qgb2Zmc2V0ID0gIWlzTGluZUNvbnRpbnVlZCA/XG4gICAgICAgICgobGFiZWxMZW5ndGggLyAyICsgZml4ZWRFeHRyYU9mZnNldCkgKiBib3hTY2FsZSAqIG92ZXJzY2FsaW5nKSAlIHNwYWNpbmcgOlxuICAgICAgICAoc3BhY2luZyAvIDIgKiBvdmVyc2NhbGluZykgJSBzcGFjaW5nO1xuXG4gICAgcmV0dXJuIHJlc2FtcGxlKGxpbmUsIG9mZnNldCwgc3BhY2luZywgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSwgbGFiZWxMZW5ndGggKiBib3hTY2FsZSwgaXNMaW5lQ29udGludWVkLCBmYWxzZSwgdGlsZUV4dGVudCk7XG59XG5cblxuZnVuY3Rpb24gcmVzYW1wbGUobGluZSwgb2Zmc2V0LCBzcGFjaW5nLCBhbmdsZVdpbmRvd1NpemUsIG1heEFuZ2xlLCBsYWJlbExlbmd0aCwgaXNMaW5lQ29udGludWVkLCBwbGFjZUF0TWlkZGxlLCB0aWxlRXh0ZW50KSB7XG5cbiAgICBjb25zdCBoYWxmTGFiZWxMZW5ndGggPSBsYWJlbExlbmd0aCAvIDI7XG4gICAgbGV0IGxpbmVMZW5ndGggPSAwO1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbGluZS5sZW5ndGggLSAxOyBrKyspIHtcbiAgICAgICAgbGluZUxlbmd0aCArPSBsaW5lW2tdLmRpc3QobGluZVtrICsgMV0pO1xuICAgIH1cblxuICAgIGxldCBkaXN0YW5jZSA9IDAsXG4gICAgICAgIG1hcmtlZERpc3RhbmNlID0gb2Zmc2V0IC0gc3BhY2luZztcblxuICAgIGxldCBhbmNob3JzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMTsgaSsrKSB7XG5cbiAgICAgICAgY29uc3QgYSA9IGxpbmVbaV0sXG4gICAgICAgICAgICBiID0gbGluZVtpICsgMV07XG5cbiAgICAgICAgY29uc3Qgc2VnbWVudERpc3QgPSBhLmRpc3QoYiksXG4gICAgICAgICAgICBhbmdsZSA9IGIuYW5nbGVUbyhhKTtcblxuICAgICAgICB3aGlsZSAobWFya2VkRGlzdGFuY2UgKyBzcGFjaW5nIDwgZGlzdGFuY2UgKyBzZWdtZW50RGlzdCkge1xuICAgICAgICAgICAgbWFya2VkRGlzdGFuY2UgKz0gc3BhY2luZztcblxuICAgICAgICAgICAgY29uc3QgdCA9IChtYXJrZWREaXN0YW5jZSAtIGRpc3RhbmNlKSAvIHNlZ21lbnREaXN0LFxuICAgICAgICAgICAgICAgIHggPSBpbnRlcnBvbGF0ZShhLngsIGIueCwgdCksXG4gICAgICAgICAgICAgICAgeSA9IGludGVycG9sYXRlKGEueSwgYi55LCB0KTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgcG9pbnQgaXMgd2l0aGluIHRoZSB0aWxlIGJvdW5kYXJpZXMgYW5kIHRoYXRcbiAgICAgICAgICAgIC8vIHRoZSBsYWJlbCB3b3VsZCBmaXQgYmVmb3JlIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgbGluZVxuICAgICAgICAgICAgLy8gaWYgcGxhY2VkIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICBpZiAoeCA+PSAwICYmIHggPCB0aWxlRXh0ZW50ICYmIHkgPj0gMCAmJiB5IDwgdGlsZUV4dGVudCAmJlxuICAgICAgICAgICAgICAgICAgICBtYXJrZWREaXN0YW5jZSAtIGhhbGZMYWJlbExlbmd0aCA+PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlZERpc3RhbmNlICsgaGFsZkxhYmVsTGVuZ3RoIDw9IGxpbmVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbmNob3IgPSBuZXcgQW5jaG9yKHgsIHksIGFuZ2xlLCBpKTtcbiAgICAgICAgICAgICAgICBhbmNob3IuX3JvdW5kKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWFuZ2xlV2luZG93U2l6ZSB8fCBjaGVja01heEFuZ2xlKGxpbmUsIGFuY2hvciwgbGFiZWxMZW5ndGgsIGFuZ2xlV2luZG93U2l6ZSwgbWF4QW5nbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuY2hvcnMucHVzaChhbmNob3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3RhbmNlICs9IHNlZ21lbnREaXN0O1xuICAgIH1cblxuICAgIGlmICghcGxhY2VBdE1pZGRsZSAmJiAhYW5jaG9ycy5sZW5ndGggJiYgIWlzTGluZUNvbnRpbnVlZCkge1xuICAgICAgICAvLyBUaGUgZmlyc3QgYXR0ZW1wdCBhdCBmaW5kaW5nIGFuY2hvcnMgYXQgd2hpY2ggbGFiZWxzIGNhbiBiZSBwbGFjZWQgZmFpbGVkLlxuICAgICAgICAvLyBUcnkgYWdhaW4sIGJ1dCB0aGlzIHRpbWUganVzdCB0cnkgcGxhY2luZyBvbmUgYW5jaG9yIGF0IHRoZSBtaWRkbGUgb2YgdGhlIGxpbmUuXG4gICAgICAgIC8vIFRoaXMgaGFzIHRoZSBtb3N0IGVmZmVjdCBmb3Igc2hvcnQgbGluZXMgaW4gb3ZlcnNjYWxlZCB0aWxlcywgc2luY2UgdGhlXG4gICAgICAgIC8vIGluaXRpYWwgb2Zmc2V0IHVzZWQgaW4gb3ZlcnNjYWxlZCB0aWxlcyBpcyBjYWxjdWxhdGVkIHRvIGFsaWduIGxhYmVscyB3aXRoIHBvc2l0aW9ucyBpblxuICAgICAgICAvLyBwYXJlbnQgdGlsZXMgaW5zdGVhZCBvZiBwbGFjaW5nIHRoZSBsYWJlbCBhcyBjbG9zZSB0byB0aGUgYmVnaW5uaW5nIGFzIHBvc3NpYmxlLlxuICAgICAgICBhbmNob3JzID0gcmVzYW1wbGUobGluZSwgZGlzdGFuY2UgLyAyLCBzcGFjaW5nLCBhbmdsZVdpbmRvd1NpemUsIG1heEFuZ2xlLCBsYWJlbExlbmd0aCwgaXNMaW5lQ29udGludWVkLCB0cnVlLCB0aWxlRXh0ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYW5jaG9ycztcbn1cbiIsIi8vICAgICAgXG5cbi8qKlxuICogR3JpZEluZGV4IGlzIGEgZGF0YSBzdHJ1Y3R1cmUgZm9yIHRlc3RpbmcgdGhlIGludGVyc2VjdGlvbiBvZlxuICogY2lyY2xlcyBhbmQgcmVjdGFuZ2xlcyBpbiBhIDJkIHBsYW5lLlxuICogSXQgaXMgb3B0aW1pemVkIGZvciByYXBpZCBpbnNlcnRpb24gYW5kIHF1ZXJ5aW5nLlxuICogR3JpZEluZGV4IHNwbGl0cyB0aGUgcGxhbmUgaW50byBhIHNldCBvZiBcImNlbGxzXCIgYW5kIGtlZXBzIHRyYWNrXG4gKiBvZiB3aGljaCBnZW9tZXRyaWVzIGludGVyc2VjdCB3aXRoIGVhY2ggY2VsbC4gQXQgcXVlcnkgdGltZSxcbiAqIGZ1bGwgZ2VvbWV0cnkgY29tcGFyaXNvbnMgYXJlIG9ubHkgZG9uZSBmb3IgaXRlbXMgdGhhdCBzaGFyZVxuICogYXQgbGVhc3Qgb25lIGNlbGwuIEFzIGxvbmcgYXMgdGhlIGdlb21ldHJpZXMgYXJlIHJlbGF0aXZlbHlcbiAqIHVuaWZvcm1seSBkaXN0cmlidXRlZCBhY3Jvc3MgdGhlIHBsYW5lLCB0aGlzIGdyZWF0bHkgcmVkdWNlc1xuICogdGhlIG51bWJlciBvZiBjb21wYXJpc29ucyBuZWNlc3NhcnkuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgR3JpZEluZGV4IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvciAod2lkdGggICAgICAgICwgaGVpZ2h0ICAgICAgICAsIGNlbGxTaXplICAgICAgICApIHtcbiAgICAgICAgY29uc3QgYm94Q2VsbHMgPSB0aGlzLmJveENlbGxzID0gW107XG4gICAgICAgIGNvbnN0IGNpcmNsZUNlbGxzID0gdGhpcy5jaXJjbGVDZWxscyA9IFtdO1xuXG4gICAgICAgIC8vIE1vcmUgY2VsbHMgLT4gZmV3ZXIgZ2VvbWV0cmllcyB0byBjaGVjayBwZXIgY2VsbCwgYnV0IGl0ZW1zIHRlbmRcbiAgICAgICAgLy8gdG8gYmUgc3BsaXQgYWNyb3NzIG1vcmUgY2VsbHMuXG4gICAgICAgIC8vIFN3ZWV0IHNwb3QgYWxsb3dzIG1vc3Qgc21hbGwgaXRlbXMgdG8gZml0IGluIG9uZSBjZWxsXG4gICAgICAgIHRoaXMueENlbGxDb3VudCA9IE1hdGguY2VpbCh3aWR0aCAvIGNlbGxTaXplKTtcbiAgICAgICAgdGhpcy55Q2VsbENvdW50ID0gTWF0aC5jZWlsKGhlaWdodCAvIGNlbGxTaXplKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMueENlbGxDb3VudCAqIHRoaXMueUNlbGxDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBib3hDZWxscy5wdXNoKFtdKTtcbiAgICAgICAgICAgIGNpcmNsZUNlbGxzLnB1c2goW10pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2lyY2xlS2V5cyA9IFtdO1xuICAgICAgICB0aGlzLmJveEtleXMgPSBbXTtcbiAgICAgICAgdGhpcy5iYm94ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5jaXJjbGVzID0gW107XG5cbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGhpcy54U2NhbGUgPSB0aGlzLnhDZWxsQ291bnQgLyB3aWR0aDtcbiAgICAgICAgdGhpcy55U2NhbGUgPSB0aGlzLnlDZWxsQ291bnQgLyBoZWlnaHQ7XG4gICAgICAgIHRoaXMuYm94VWlkID0gMDtcbiAgICAgICAgdGhpcy5jaXJjbGVVaWQgPSAwO1xuICAgIH1cblxuICAgIGtleXNMZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJveEtleXMubGVuZ3RoICsgdGhpcy5jaXJjbGVLZXlzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBpbnNlcnQoa2V5ICAgICAsIHgxICAgICAgICAsIHkxICAgICAgICAsIHgyICAgICAgICAsIHkyICAgICAgICApIHtcbiAgICAgICAgdGhpcy5fZm9yRWFjaENlbGwoeDEsIHkxLCB4MiwgeTIsIHRoaXMuX2luc2VydEJveENlbGwsIHRoaXMuYm94VWlkKyspO1xuICAgICAgICB0aGlzLmJveEtleXMucHVzaChrZXkpO1xuICAgICAgICB0aGlzLmJib3hlcy5wdXNoKHgxKTtcbiAgICAgICAgdGhpcy5iYm94ZXMucHVzaCh5MSk7XG4gICAgICAgIHRoaXMuYmJveGVzLnB1c2goeDIpO1xuICAgICAgICB0aGlzLmJib3hlcy5wdXNoKHkyKTtcbiAgICB9XG5cbiAgICBpbnNlcnRDaXJjbGUoa2V5ICAgICAsIHggICAgICAgICwgeSAgICAgICAgLCByYWRpdXMgICAgICAgICkge1xuICAgICAgICAvLyBJbnNlcnQgY2lyY2xlIGludG8gZ3JpZCBmb3IgYWxsIGNlbGxzIGluIHRoZSBjaXJjdW1zY3JpYmluZyBzcXVhcmVcbiAgICAgICAgLy8gSXQncyBtb3JlIHRoYW4gbmVjZXNzYXJ5IChieSBhIGZhY3RvciBvZiA0L1BJKSwgYnV0IGZhc3QgdG8gaW5zZXJ0XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDZWxsKHggLSByYWRpdXMsIHkgLSByYWRpdXMsIHggKyByYWRpdXMsIHkgKyByYWRpdXMsIHRoaXMuX2luc2VydENpcmNsZUNlbGwsIHRoaXMuY2lyY2xlVWlkKyspO1xuICAgICAgICB0aGlzLmNpcmNsZUtleXMucHVzaChrZXkpO1xuICAgICAgICB0aGlzLmNpcmNsZXMucHVzaCh4KTtcbiAgICAgICAgdGhpcy5jaXJjbGVzLnB1c2goeSk7XG4gICAgICAgIHRoaXMuY2lyY2xlcy5wdXNoKHJhZGl1cyk7XG4gICAgfVxuXG4gICAgX2luc2VydEJveENlbGwoeDEgICAgICAgICwgeTEgICAgICAgICwgeDIgICAgICAgICwgeTIgICAgICAgICwgY2VsbEluZGV4ICAgICAgICAsIHVpZCAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuYm94Q2VsbHNbY2VsbEluZGV4XS5wdXNoKHVpZCk7XG4gICAgfVxuXG4gICAgX2luc2VydENpcmNsZUNlbGwoeDEgICAgICAgICwgeTEgICAgICAgICwgeDIgICAgICAgICwgeTIgICAgICAgICwgY2VsbEluZGV4ICAgICAgICAsIHVpZCAgICAgICAgKSAge1xuICAgICAgICB0aGlzLmNpcmNsZUNlbGxzW2NlbGxJbmRleF0ucHVzaCh1aWQpO1xuICAgIH1cblxuICAgIF9xdWVyeSh4MSAgICAgICAgLCB5MSAgICAgICAgLCB4MiAgICAgICAgLCB5MiAgICAgICAgLCBoaXRUZXN0ICAgICAgICAgKSB7XG4gICAgICAgIGlmICh4MiA8IDAgfHwgeDEgPiB0aGlzLndpZHRoIHx8IHkyIDwgMCB8fCB5MSA+IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gaGl0VGVzdCA/IGZhbHNlIDogW107XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBpZiAoeDEgPD0gMCAmJiB5MSA8PSAwICYmIHRoaXMud2lkdGggPD0geDIgJiYgdGhpcy5oZWlnaHQgPD0geTIpIHtcbiAgICAgICAgICAgIC8vIFdlIHVzZSBgQXJyYXkjc2xpY2VgIGJlY2F1c2UgYHRoaXMua2V5c2AgbWF5IGJlIGEgYEludDMyQXJyYXlgIGFuZFxuICAgICAgICAgICAgLy8gc29tZSBicm93c2VycyAoU2FmYXJpIGFuZCBJRSkgZG8gbm90IHN1cHBvcnQgYFR5cGVkQXJyYXkjc2xpY2VgXG4gICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9UeXBlZEFycmF5L3NsaWNlI0Jyb3dzZXJfY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgcmVzdWx0ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5ib3hLZXlzKS5jb25jYXQodGhpcy5jaXJjbGVLZXlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5QXJncyA9IHtcbiAgICAgICAgICAgICAgICBoaXRUZXN0LFxuICAgICAgICAgICAgICAgIHNlZW5VaWRzOiB7IGJveDoge30sIGNpcmNsZToge30gfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX2ZvckVhY2hDZWxsKHgxLCB5MSwgeDIsIHkyLCB0aGlzLl9xdWVyeUNlbGwsIHJlc3VsdCwgcXVlcnlBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGl0VGVzdCA/IHJlc3VsdC5sZW5ndGggPiAwIDogcmVzdWx0O1xuICAgIH1cblxuICAgIF9xdWVyeUNpcmNsZSh4ICAgICAgICAsIHkgICAgICAgICwgcmFkaXVzICAgICAgICAsIGhpdFRlc3QgICAgICAgICApIHtcbiAgICAgICAgLy8gSW5zZXJ0IGNpcmNsZSBpbnRvIGdyaWQgZm9yIGFsbCBjZWxscyBpbiB0aGUgY2lyY3Vtc2NyaWJpbmcgc3F1YXJlXG4gICAgICAgIC8vIEl0J3MgbW9yZSB0aGFuIG5lY2Vzc2FyeSAoYnkgYSBmYWN0b3Igb2YgNC9QSSksIGJ1dCBmYXN0IHRvIGluc2VydFxuICAgICAgICBjb25zdCB4MSA9IHggLSByYWRpdXM7XG4gICAgICAgIGNvbnN0IHgyID0geCArIHJhZGl1cztcbiAgICAgICAgY29uc3QgeTEgPSB5IC0gcmFkaXVzO1xuICAgICAgICBjb25zdCB5MiA9IHkgKyByYWRpdXM7XG4gICAgICAgIGlmICh4MiA8IDAgfHwgeDEgPiB0aGlzLndpZHRoIHx8IHkyIDwgMCB8fCB5MSA+IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gaGl0VGVzdCA/IGZhbHNlIDogW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCb3ggcXVlcnkgZWFybHkgZXhpdHMgaWYgdGhlIGJvdW5kaW5nIGJveCBpcyBsYXJnZXIgdGhhbiB0aGUgZ3JpZCwgYnV0IHdlIGRvbid0IGRvXG4gICAgICAgIC8vIHRoZSBlcXVpdmFsZW50IGNhbGN1bGF0aW9uIGZvciBjaXJjbGUgcXVlcmllcyBiZWNhdXNlIGVhcmx5IGV4aXQgaXMgbGVzcyBsaWtlbHlcbiAgICAgICAgLy8gYW5kIHRoZSBjYWxjdWxhdGlvbiBpcyBtb3JlIGV4cGVuc2l2ZVxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgY29uc3QgcXVlcnlBcmdzID0ge1xuICAgICAgICAgICAgaGl0VGVzdCxcbiAgICAgICAgICAgIGNpcmNsZTogeyB4OiB4LCB5OiB5LCByYWRpdXM6IHJhZGl1cyB9LFxuICAgICAgICAgICAgc2VlblVpZHM6IHsgYm94OiB7fSwgY2lyY2xlOiB7fSB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDZWxsKHgxLCB5MSwgeDIsIHkyLCB0aGlzLl9xdWVyeUNlbGxDaXJjbGUsIHJlc3VsdCwgcXVlcnlBcmdzKTtcbiAgICAgICAgcmV0dXJuIGhpdFRlc3QgPyByZXN1bHQubGVuZ3RoID4gMCA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICBxdWVyeSh4MSAgICAgICAgLCB5MSAgICAgICAgLCB4MiAgICAgICAgLCB5MiAgICAgICAgKSAgICAgICAgICAgICB7XG4gICAgICAgIHJldHVybiAodGhpcy5fcXVlcnkoeDEsIHkxLCB4MiwgeTIsIGZhbHNlKSAgICAgKTtcbiAgICB9XG5cbiAgICBoaXRUZXN0KHgxICAgICAgICAsIHkxICAgICAgICAsIHgyICAgICAgICAsIHkyICAgICAgICApICAgICAgICAgICB7XG4gICAgICAgIHJldHVybiAodGhpcy5fcXVlcnkoeDEsIHkxLCB4MiwgeTIsIHRydWUpICAgICApO1xuICAgIH1cblxuICAgIGhpdFRlc3RDaXJjbGUoeCAgICAgICAgLCB5ICAgICAgICAsIHJhZGl1cyAgICAgICAgKSAgICAgICAgICB7XG4gICAgICAgIHJldHVybiAodGhpcy5fcXVlcnlDaXJjbGUoeCwgeSwgcmFkaXVzLCB0cnVlKSAgICAgKTtcbiAgICB9XG5cbiAgICBfcXVlcnlDZWxsKHgxICAgICAgICAsIHkxICAgICAgICAsIHgyICAgICAgICAsIHkyICAgICAgICAsIGNlbGxJbmRleCAgICAgICAgLCByZXN1bHQgICAgICwgcXVlcnlBcmdzICAgICApIHtcbiAgICAgICAgY29uc3Qgc2VlblVpZHMgPSBxdWVyeUFyZ3Muc2VlblVpZHM7XG4gICAgICAgIGNvbnN0IGJveENlbGwgPSB0aGlzLmJveENlbGxzW2NlbGxJbmRleF07XG4gICAgICAgIGlmIChib3hDZWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBiYm94ZXMgPSB0aGlzLmJib3hlcztcbiAgICAgICAgICAgIGZvciAoY29uc3QgYm94VWlkIG9mIGJveENlbGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNlZW5VaWRzLmJveFtib3hVaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZW5VaWRzLmJveFtib3hVaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYm94VWlkICogNDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh4MSA8PSBiYm94ZXNbb2Zmc2V0ICsgMl0pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoeTEgPD0gYmJveGVzW29mZnNldCArIDNdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKHgyID49IGJib3hlc1tvZmZzZXQgKyAwXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICh5MiA+PSBiYm94ZXNbb2Zmc2V0ICsgMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnlBcmdzLmhpdFRlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5ib3hLZXlzW2JveFVpZF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNpcmNsZUNlbGwgPSB0aGlzLmNpcmNsZUNlbGxzW2NlbGxJbmRleF07XG4gICAgICAgIGlmIChjaXJjbGVDZWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBjaXJjbGVzID0gdGhpcy5jaXJjbGVzO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaXJjbGVVaWQgb2YgY2lyY2xlQ2VsbCkge1xuICAgICAgICAgICAgICAgIGlmICghc2VlblVpZHMuY2lyY2xlW2NpcmNsZVVpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2VlblVpZHMuY2lyY2xlW2NpcmNsZVVpZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBjaXJjbGVVaWQgKiAzO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2lyY2xlQW5kUmVjdENvbGxpZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVzW29mZnNldF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVzW29mZnNldCArIDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlc1tvZmZzZXQgKyAyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHgxLFxuICAgICAgICAgICAgICAgICAgICAgICAgeTEsXG4gICAgICAgICAgICAgICAgICAgICAgICB4MixcbiAgICAgICAgICAgICAgICAgICAgICAgIHkyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5QXJncy5oaXRUZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY2lyY2xlS2V5c1tjaXJjbGVVaWRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9xdWVyeUNlbGxDaXJjbGUoeDEgICAgICAgICwgeTEgICAgICAgICwgeDIgICAgICAgICwgeTIgICAgICAgICwgY2VsbEluZGV4ICAgICAgICAsIHJlc3VsdCAgICAgLCBxdWVyeUFyZ3MgICAgICkge1xuICAgICAgICBjb25zdCBjaXJjbGUgPSBxdWVyeUFyZ3MuY2lyY2xlO1xuICAgICAgICBjb25zdCBzZWVuVWlkcyA9IHF1ZXJ5QXJncy5zZWVuVWlkcztcbiAgICAgICAgY29uc3QgYm94Q2VsbCA9IHRoaXMuYm94Q2VsbHNbY2VsbEluZGV4XTtcbiAgICAgICAgaWYgKGJveENlbGwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGJib3hlcyA9IHRoaXMuYmJveGVzO1xuICAgICAgICAgICAgZm9yIChjb25zdCBib3hVaWQgb2YgYm94Q2VsbCkge1xuICAgICAgICAgICAgICAgIGlmICghc2VlblVpZHMuYm94W2JveFVpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2VlblVpZHMuYm94W2JveFVpZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBib3hVaWQgKiA0O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2lyY2xlQW5kUmVjdENvbGxpZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGUueCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZS55LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlLnJhZGl1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJib3hlc1tvZmZzZXQgKyAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJib3hlc1tvZmZzZXQgKyAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJib3hlc1tvZmZzZXQgKyAyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJib3hlc1tvZmZzZXQgKyAzXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaXJjbGVDZWxsID0gdGhpcy5jaXJjbGVDZWxsc1tjZWxsSW5kZXhdO1xuICAgICAgICBpZiAoY2lyY2xlQ2VsbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgY2lyY2xlcyA9IHRoaXMuY2lyY2xlcztcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2lyY2xlVWlkIG9mIGNpcmNsZUNlbGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNlZW5VaWRzLmNpcmNsZVtjaXJjbGVVaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZW5VaWRzLmNpcmNsZVtjaXJjbGVVaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gY2lyY2xlVWlkICogMztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NpcmNsZXNDb2xsaWRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlc1tvZmZzZXRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlc1tvZmZzZXQgKyAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZXNbb2Zmc2V0ICsgMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGUueCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZS55LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlLnJhZGl1cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZm9yRWFjaENlbGwoeDEgICAgICAgICwgeTEgICAgICAgICwgeDIgICAgICAgICwgeTIgICAgICAgICwgZm4gICAgICwgYXJnMSAgICAgLCBhcmcyICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGN4MSA9IHRoaXMuX2NvbnZlcnRUb1hDZWxsQ29vcmQoeDEpO1xuICAgICAgICBjb25zdCBjeTEgPSB0aGlzLl9jb252ZXJ0VG9ZQ2VsbENvb3JkKHkxKTtcbiAgICAgICAgY29uc3QgY3gyID0gdGhpcy5fY29udmVydFRvWENlbGxDb29yZCh4Mik7XG4gICAgICAgIGNvbnN0IGN5MiA9IHRoaXMuX2NvbnZlcnRUb1lDZWxsQ29vcmQoeTIpO1xuXG4gICAgICAgIGZvciAobGV0IHggPSBjeDE7IHggPD0gY3gyOyB4KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSBjeTE7IHkgPD0gY3kyOyB5KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsSW5kZXggPSB0aGlzLnhDZWxsQ291bnQgKiB5ICsgeDtcbiAgICAgICAgICAgICAgICBpZiAoZm4uY2FsbCh0aGlzLCB4MSwgeTEsIHgyLCB5MiwgY2VsbEluZGV4LCBhcmcxLCBhcmcyKSkgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2NvbnZlcnRUb1hDZWxsQ29vcmQoeCAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLnhDZWxsQ291bnQgLSAxLCBNYXRoLmZsb29yKHggKiB0aGlzLnhTY2FsZSkpKTtcbiAgICB9XG5cbiAgICBfY29udmVydFRvWUNlbGxDb29yZCh5ICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMueUNlbGxDb3VudCAtIDEsIE1hdGguZmxvb3IoeSAqIHRoaXMueVNjYWxlKSkpO1xuICAgIH1cblxuICAgIF9jaXJjbGVzQ29sbGlkZSh4MSAgICAgICAgLCB5MSAgICAgICAgLCByMSAgICAgICAgLCB4MiAgICAgICAgLCB5MiAgICAgICAgLCByMiAgICAgICAgKSAgICAgICAgICB7XG4gICAgICAgIGNvbnN0IGR4ID0geDIgLSB4MTtcbiAgICAgICAgY29uc3QgZHkgPSB5MiAtIHkxO1xuICAgICAgICBjb25zdCBib3RoUmFkaWkgPSByMSArIHIyO1xuICAgICAgICByZXR1cm4gKGJvdGhSYWRpaSAqIGJvdGhSYWRpaSkgPiAoZHggKiBkeCArIGR5ICogZHkpO1xuICAgIH1cblxuICAgIF9jaXJjbGVBbmRSZWN0Q29sbGlkZShjaXJjbGVYICAgICAgICAsIGNpcmNsZVkgICAgICAgICwgcmFkaXVzICAgICAgICAsIHgxICAgICAgICAsIHkxICAgICAgICAsIHgyICAgICAgICAsIHkyICAgICAgICApICAgICAgICAgIHtcbiAgICAgICAgY29uc3QgaGFsZlJlY3RXaWR0aCA9ICh4MiAtIHgxKSAvIDI7XG4gICAgICAgIGNvbnN0IGRpc3RYID0gTWF0aC5hYnMoY2lyY2xlWCAtICh4MSArIGhhbGZSZWN0V2lkdGgpKTtcbiAgICAgICAgaWYgKGRpc3RYID4gKGhhbGZSZWN0V2lkdGggKyByYWRpdXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYWxmUmVjdEhlaWdodCA9ICh5MiAtIHkxKSAvIDI7XG4gICAgICAgIGNvbnN0IGRpc3RZID0gTWF0aC5hYnMoY2lyY2xlWSAtICh5MSArIGhhbGZSZWN0SGVpZ2h0KSk7XG4gICAgICAgIGlmIChkaXN0WSA+IChoYWxmUmVjdEhlaWdodCArIHJhZGl1cykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaXN0WCA8PSBoYWxmUmVjdFdpZHRoIHx8IGRpc3RZIDw9IGhhbGZSZWN0SGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGR4ID0gZGlzdFggLSBoYWxmUmVjdFdpZHRoO1xuICAgICAgICBjb25zdCBkeSA9IGRpc3RZIC0gaGFsZlJlY3RIZWlnaHQ7XG4gICAgICAgIHJldHVybiAoZHggKiBkeCArIGR5ICogZHkgPD0gKHJhZGl1cyAqIHJhZGl1cykpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBHcmlkSW5kZXg7XG4iLCIvLyAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZlYXR1cmVzICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgIGNvbnN0IGxlZnRJbmRleCAgICAgICAgICAgICAgICAgICAgID0ge307XG4gICAgY29uc3QgcmlnaHRJbmRleCAgICAgICAgICAgICAgICAgICAgID0ge307XG4gICAgY29uc3QgbWVyZ2VkRmVhdHVyZXMgPSBbXTtcbiAgICBsZXQgbWVyZ2VkSW5kZXggPSAwO1xuXG4gICAgZnVuY3Rpb24gYWRkKGspIHtcbiAgICAgICAgbWVyZ2VkRmVhdHVyZXMucHVzaChmZWF0dXJlc1trXSk7XG4gICAgICAgIG1lcmdlZEluZGV4Kys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VGcm9tUmlnaHQobGVmdEtleSAgICAgICAgLCByaWdodEtleSAgICAgICAgLCBnZW9tKSB7XG4gICAgICAgIGNvbnN0IGkgPSByaWdodEluZGV4W2xlZnRLZXldO1xuICAgICAgICBkZWxldGUgcmlnaHRJbmRleFtsZWZ0S2V5XTtcbiAgICAgICAgcmlnaHRJbmRleFtyaWdodEtleV0gPSBpO1xuXG4gICAgICAgIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdLnBvcCgpO1xuICAgICAgICBtZXJnZWRGZWF0dXJlc1tpXS5nZW9tZXRyeVswXSA9IG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdLmNvbmNhdChnZW9tWzBdKTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VGcm9tTGVmdChsZWZ0S2V5ICAgICAgICAsIHJpZ2h0S2V5ICAgICAgICAsIGdlb20pIHtcbiAgICAgICAgY29uc3QgaSA9IGxlZnRJbmRleFtyaWdodEtleV07XG4gICAgICAgIGRlbGV0ZSBsZWZ0SW5kZXhbcmlnaHRLZXldO1xuICAgICAgICBsZWZ0SW5kZXhbbGVmdEtleV0gPSBpO1xuXG4gICAgICAgIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdLnNoaWZ0KCk7XG4gICAgICAgIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdID0gZ2VvbVswXS5jb25jYXQobWVyZ2VkRmVhdHVyZXNbaV0uZ2VvbWV0cnlbMF0pO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRLZXkodGV4dCwgZ2VvbSwgb25SaWdodCkge1xuICAgICAgICBjb25zdCBwb2ludCA9IG9uUmlnaHQgPyBnZW9tWzBdW2dlb21bMF0ubGVuZ3RoIC0gMV0gOiBnZW9tWzBdWzBdO1xuICAgICAgICByZXR1cm4gYCR7dGV4dH06JHtwb2ludC54fToke3BvaW50Lnl9YDtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGZlYXR1cmVzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBmZWF0dXJlc1trXTtcbiAgICAgICAgY29uc3QgZ2VvbSA9IGZlYXR1cmUuZ2VvbWV0cnk7XG4gICAgICAgIGNvbnN0IHRleHQgPSBmZWF0dXJlLnRleHQ7XG5cbiAgICAgICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgICAgICBhZGQoayk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxlZnRLZXkgPSBnZXRLZXkodGV4dCwgZ2VvbSksXG4gICAgICAgICAgICByaWdodEtleSA9IGdldEtleSh0ZXh0LCBnZW9tLCB0cnVlKTtcblxuICAgICAgICBpZiAoKGxlZnRLZXkgaW4gcmlnaHRJbmRleCkgJiYgKHJpZ2h0S2V5IGluIGxlZnRJbmRleCkgJiYgKHJpZ2h0SW5kZXhbbGVmdEtleV0gIT09IGxlZnRJbmRleFtyaWdodEtleV0pKSB7XG4gICAgICAgICAgICAvLyBmb3VuZCBsaW5lcyB3aXRoIHRoZSBzYW1lIHRleHQgYWRqYWNlbnQgdG8gYm90aCBlbmRzIG9mIHRoZSBjdXJyZW50IGxpbmUsIG1lcmdlIGFsbCB0aHJlZVxuICAgICAgICAgICAgY29uc3QgaiA9IG1lcmdlRnJvbUxlZnQobGVmdEtleSwgcmlnaHRLZXksIGdlb20pO1xuICAgICAgICAgICAgY29uc3QgaSA9IG1lcmdlRnJvbVJpZ2h0KGxlZnRLZXksIHJpZ2h0S2V5LCBtZXJnZWRGZWF0dXJlc1tqXS5nZW9tZXRyeSk7XG5cbiAgICAgICAgICAgIGRlbGV0ZSBsZWZ0SW5kZXhbbGVmdEtleV07XG4gICAgICAgICAgICBkZWxldGUgcmlnaHRJbmRleFtyaWdodEtleV07XG5cbiAgICAgICAgICAgIHJpZ2h0SW5kZXhbZ2V0S2V5KHRleHQsIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5LCB0cnVlKV0gPSBpO1xuICAgICAgICAgICAgbWVyZ2VkRmVhdHVyZXNbal0uZ2VvbWV0cnkgPSAobnVsbCAgICAgKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGxlZnRLZXkgaW4gcmlnaHRJbmRleCkge1xuICAgICAgICAgICAgLy8gZm91bmQgbWVyZ2VhYmxlIGxpbmUgYWRqYWNlbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGxpbmUsIG1lcmdlXG4gICAgICAgICAgICBtZXJnZUZyb21SaWdodChsZWZ0S2V5LCByaWdodEtleSwgZ2VvbSk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChyaWdodEtleSBpbiBsZWZ0SW5kZXgpIHtcbiAgICAgICAgICAgIC8vIGZvdW5kIG1lcmdlYWJsZSBsaW5lIGFkamFjZW50IHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGluZSwgbWVyZ2VcbiAgICAgICAgICAgIG1lcmdlRnJvbUxlZnQobGVmdEtleSwgcmlnaHRLZXksIGdlb20pO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBubyBhZGphY2VudCBsaW5lcywgYWRkIGFzIGEgbmV3IGl0ZW1cbiAgICAgICAgICAgIGFkZChrKTtcbiAgICAgICAgICAgIGxlZnRJbmRleFtsZWZ0S2V5XSA9IG1lcmdlZEluZGV4IC0gMTtcbiAgICAgICAgICAgIHJpZ2h0SW5kZXhbcmlnaHRLZXldID0gbWVyZ2VkSW5kZXggLSAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZEZlYXR1cmVzLmZpbHRlcigoZikgPT4gZi5nZW9tZXRyeSk7XG59O1xuIiwiLy8gICAgICBcblxuY29uc3Qge3JlZ2lzdGVyfSA9IHJlcXVpcmUoJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2ZlcicpO1xuXG5jbGFzcyBPcGFjaXR5U3RhdGUge1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5vcGFjaXR5ID0gMDtcbiAgICAgICAgdGhpcy50YXJnZXRPcGFjaXR5ID0gMDtcbiAgICAgICAgdGhpcy50aW1lID0gMDtcbiAgICB9XG5cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgY29uc3QgY2xvbmUgPSBuZXcgT3BhY2l0eVN0YXRlKCk7XG4gICAgICAgIGNsb25lLm9wYWNpdHkgPSB0aGlzLm9wYWNpdHk7XG4gICAgICAgIGNsb25lLnRhcmdldE9wYWNpdHkgPSB0aGlzLnRhcmdldE9wYWNpdHk7XG4gICAgICAgIGNsb25lLnRpbWUgPSB0aGlzLnRpbWU7XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdPcGFjaXR5U3RhdGUnLCBPcGFjaXR5U3RhdGUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9wYWNpdHlTdGF0ZTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IENvbGxpc2lvbkluZGV4ID0gcmVxdWlyZSgnLi9jb2xsaXNpb25faW5kZXgnKTtcbmNvbnN0IEVYVEVOVCA9IHJlcXVpcmUoJy4uL2RhdGEvZXh0ZW50Jyk7XG5jb25zdCBzeW1ib2xTaXplID0gcmVxdWlyZSgnLi9zeW1ib2xfc2l6ZScpO1xuY29uc3QgcHJvamVjdGlvbiA9IHJlcXVpcmUoJy4vcHJvamVjdGlvbicpO1xuY29uc3Qgc3ltYm9sTGF5b3V0UHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJykubGF5b3V0O1xuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG5jb25zdCBwaXhlbHNUb1RpbGVVbml0cyA9IHJlcXVpcmUoJy4uL3NvdXJjZS9waXhlbHNfdG9fdGlsZV91bml0cycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuY2xhc3MgT3BhY2l0eVN0YXRlIHtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgIGNvbnN0cnVjdG9yKHByZXZTdGF0ZSAgICAgICAgICAgICAgICwgaW5jcmVtZW50ICAgICAgICAsIHBsYWNlZCAgICAgICAgICwgc2tpcEZhZGUgICAgICAgICAgKSB7XG4gICAgICAgIGlmIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMub3BhY2l0eSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHByZXZTdGF0ZS5vcGFjaXR5ICsgKHByZXZTdGF0ZS5wbGFjZWQgPyBpbmNyZW1lbnQgOiAtaW5jcmVtZW50KSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcGFjaXR5ID0gKHNraXBGYWRlICYmIHBsYWNlZCkgPyAxIDogMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBsYWNlZCA9IHBsYWNlZDtcbiAgICB9XG4gICAgaXNIaWRkZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wYWNpdHkgPT09IDAgJiYgIXRoaXMucGxhY2VkO1xuICAgIH1cbn1cblxuY2xhc3MgSm9pbnRPcGFjaXR5U3RhdGUge1xuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgY29uc3RydWN0b3IocHJldlN0YXRlICAgICAgICAgICAgICAgICAgICAsIGluY3JlbWVudCAgICAgICAgLCBwbGFjZWRUZXh0ICAgICAgICAgLCBwbGFjZWRJY29uICAgICAgICAgLCBza2lwRmFkZSAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy50ZXh0ID0gbmV3IE9wYWNpdHlTdGF0ZShwcmV2U3RhdGUgPyBwcmV2U3RhdGUudGV4dCA6IG51bGwsIGluY3JlbWVudCwgcGxhY2VkVGV4dCwgc2tpcEZhZGUpO1xuICAgICAgICB0aGlzLmljb24gPSBuZXcgT3BhY2l0eVN0YXRlKHByZXZTdGF0ZSA/IHByZXZTdGF0ZS5pY29uIDogbnVsbCwgaW5jcmVtZW50LCBwbGFjZWRJY29uLCBza2lwRmFkZSk7XG4gICAgfVxuICAgIGlzSGlkZGVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0LmlzSGlkZGVuKCkgJiYgdGhpcy5pY29uLmlzSGlkZGVuKCk7XG4gICAgfVxufVxuXG5jbGFzcyBKb2ludFBsYWNlbWVudCB7XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuICAgIC8vIHNraXBGYWRlID0gb3V0c2lkZSB2aWV3cG9ydCwgYnV0IHdpdGhpbiBDb2xsaXNpb25JbmRleDo6dmlld3BvcnRQYWRkaW5nIHB4IG9mIHRoZSBlZGdlXG4gICAgLy8gQmVjYXVzZSB0aGVzZSBzeW1ib2xzIGFyZW4ndCBvbnNjcmVlbiB5ZXQsIHdlIGNhbiBza2lwIHRoZSBcImZhZGUgaW5cIiBhbmltYXRpb24sXG4gICAgLy8gYW5kIGlmIGEgc3Vic2VxdWVudCB2aWV3cG9ydCBjaGFuZ2UgYnJpbmdzIHRoZW0gaW50byB2aWV3LCB0aGV5J2xsIGJlIGZ1bGx5XG4gICAgLy8gdmlzaWJsZSByaWdodCBhd2F5LlxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgIGNvbnN0cnVjdG9yKHRleHQgICAgICAgICAsIGljb24gICAgICAgICAsIHNraXBGYWRlICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgICAgIHRoaXMuaWNvbiA9IGljb247XG4gICAgICAgIHRoaXMuc2tpcEZhZGUgPSBza2lwRmFkZTtcbiAgICB9XG59XG5cbmNsYXNzIFBsYWNlbWVudCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IodHJhbnNmb3JtICAgICAgICAgICAsIGZhZGVEdXJhdGlvbiAgICAgICAgKSB7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gdHJhbnNmb3JtLmNsb25lKCk7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uSW5kZXggPSBuZXcgQ29sbGlzaW9uSW5kZXgodGhpcy50cmFuc2Zvcm0pO1xuICAgICAgICB0aGlzLnBsYWNlbWVudHMgPSB7fTtcbiAgICAgICAgdGhpcy5vcGFjaXRpZXMgPSB7fTtcbiAgICAgICAgdGhpcy5zdGFsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZhZGVEdXJhdGlvbiA9IGZhZGVEdXJhdGlvbjtcbiAgICB9XG5cbiAgICBwbGFjZUxheWVyVGlsZShzdHlsZUxheWVyICAgICAgICAgICAgLCB0aWxlICAgICAgLCBzaG93Q29sbGlzaW9uQm94ZXMgICAgICAgICAsIHNlZW5Dcm9zc1RpbGVJRHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCBzeW1ib2xCdWNrZXQgPSAoKHRpbGUuZ2V0QnVja2V0KHN0eWxlTGF5ZXIpICAgICApICAgICAgICAgICAgICApO1xuICAgICAgICBpZiAoIXN5bWJvbEJ1Y2tldCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGxheW91dCA9IHN5bWJvbEJ1Y2tldC5sYXllcnNbMF0ubGF5b3V0O1xuXG4gICAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5wb3coMiwgdGhpcy50cmFuc2Zvcm0uem9vbSAtIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaKTtcbiAgICAgICAgY29uc3QgdGV4dFBpeGVsUmF0aW8gPSB0aWxlLnRpbGVTaXplIC8gRVhURU5UO1xuXG4gICAgICAgIGNvbnN0IHBvc01hdHJpeCA9IHRoaXMudHJhbnNmb3JtLmNhbGN1bGF0ZVBvc01hdHJpeCh0aWxlLnRpbGVJRC50b1Vud3JhcHBlZCgpKTtcblxuICAgICAgICBjb25zdCB0ZXh0TGFiZWxQbGFuZU1hdHJpeCA9IHByb2plY3Rpb24uZ2V0TGFiZWxQbGFuZU1hdHJpeChwb3NNYXRyaXgsXG4gICAgICAgICAgICAgICAgbGF5b3V0LmdldCgndGV4dC1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ21hcCcsXG4gICAgICAgICAgICAgICAgbGF5b3V0LmdldCgndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnKSA9PT0gJ21hcCcsXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgMSwgdGhpcy50cmFuc2Zvcm0uem9vbSkpO1xuXG4gICAgICAgIGNvbnN0IGljb25MYWJlbFBsYW5lTWF0cml4ID0gcHJvamVjdGlvbi5nZXRMYWJlbFBsYW5lTWF0cml4KHBvc01hdHJpeCxcbiAgICAgICAgICAgICAgICBsYXlvdXQuZ2V0KCdpY29uLXBpdGNoLWFsaWdubWVudCcpID09PSAnbWFwJyxcbiAgICAgICAgICAgICAgICBsYXlvdXQuZ2V0KCdpY29uLXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnbWFwJyxcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCB0aGlzLnRyYW5zZm9ybS56b29tKSk7XG5cbiAgICAgICAgdGhpcy5wbGFjZUxheWVyQnVja2V0KHN5bWJvbEJ1Y2tldCwgcG9zTWF0cml4LCB0ZXh0TGFiZWxQbGFuZU1hdHJpeCwgaWNvbkxhYmVsUGxhbmVNYXRyaXgsIHNjYWxlLCB0ZXh0UGl4ZWxSYXRpbyxcbiAgICAgICAgICAgICAgICBzaG93Q29sbGlzaW9uQm94ZXMsIHNlZW5Dcm9zc1RpbGVJRHMsIHRpbGUuY29sbGlzaW9uQm94QXJyYXksIHRpbGUudGlsZUlELmtleSwgc3R5bGVMYXllci5zb3VyY2UpO1xuICAgIH1cblxuICAgIHBsYWNlTGF5ZXJCdWNrZXQoYnVja2V0ICAgICAgICAgICAgICAsIHBvc01hdHJpeCAgICAgICwgdGV4dExhYmVsUGxhbmVNYXRyaXggICAgICAsIGljb25MYWJlbFBsYW5lTWF0cml4ICAgICAgLFxuICAgICAgICAgICAgc2NhbGUgICAgICAgICwgdGV4dFBpeGVsUmF0aW8gICAgICAgICwgc2hvd0NvbGxpc2lvbkJveGVzICAgICAgICAgLCBzZWVuQ3Jvc3NUaWxlSURzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheSAgICAgICAgICAgICAgICAgICAgLCB0aWxlS2V5ICAgICAgICAsIHNvdXJjZUlEICAgICAgICApIHtcblxuICAgICAgICBjb25zdCBsYXlvdXQgPSBidWNrZXQubGF5ZXJzWzBdLmxheW91dDtcblxuICAgICAgICBjb25zdCBwYXJ0aWFsbHlFdmFsdWF0ZWRUZXh0U2l6ZSA9IHN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yWm9vbShidWNrZXQudGV4dFNpemVEYXRhLCB0aGlzLnRyYW5zZm9ybS56b29tLCBzeW1ib2xMYXlvdXRQcm9wZXJ0aWVzLnByb3BlcnRpZXNbJ3RleHQtc2l6ZSddKTtcblxuICAgICAgICBjb25zdCBpY29uV2l0aG91dFRleHQgPSAhYnVja2V0Lmhhc1RleHREYXRhKCkgfHwgbGF5b3V0LmdldCgndGV4dC1vcHRpb25hbCcpO1xuICAgICAgICBjb25zdCB0ZXh0V2l0aG91dEljb24gPSAhYnVja2V0Lmhhc0ljb25EYXRhKCkgfHwgbGF5b3V0LmdldCgnaWNvbi1vcHRpb25hbCcpO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3ltYm9sSW5zdGFuY2Ugb2YgYnVja2V0LnN5bWJvbEluc3RhbmNlcykge1xuICAgICAgICAgICAgaWYgKCFzZWVuQ3Jvc3NUaWxlSURzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IHBsYWNlVGV4dCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBwbGFjZUljb24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsZXQgb2Zmc2NyZWVuID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGxldCBwbGFjZWRHbHlwaEJveGVzID0gbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgcGxhY2VkR2x5cGhDaXJjbGVzID0gbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgcGxhY2VkSWNvbkJveGVzID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmICghc3ltYm9sSW5zdGFuY2UuY29sbGlzaW9uQXJyYXlzKSB7XG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmNvbGxpc2lvbkFycmF5cyA9IGJ1Y2tldC5kZXNlcmlhbGl6ZUNvbGxpc2lvbkJveGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29sbGlzaW9uQm94QXJyYXkgICAgICkgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS50ZXh0Qm94U3RhcnRJbmRleCwgc3ltYm9sSW5zdGFuY2UudGV4dEJveEVuZEluZGV4LCBzeW1ib2xJbnN0YW5jZS5pY29uQm94U3RhcnRJbmRleCwgc3ltYm9sSW5zdGFuY2UuaWNvbkJveEVuZEluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3ltYm9sSW5zdGFuY2UuY29sbGlzaW9uQXJyYXlzLnRleHRCb3gpIHtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VkR2x5cGhCb3hlcyA9IHRoaXMuY29sbGlzaW9uSW5kZXgucGxhY2VDb2xsaXNpb25Cb3goc3ltYm9sSW5zdGFuY2UuY29sbGlzaW9uQXJyYXlzLnRleHRCb3gsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmdldCgndGV4dC1hbGxvdy1vdmVybGFwJyksIHRleHRQaXhlbFJhdGlvLCBwb3NNYXRyaXgpO1xuICAgICAgICAgICAgICAgICAgICBwbGFjZVRleHQgPSBwbGFjZWRHbHlwaEJveGVzLmJveC5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgICAgICBvZmZzY3JlZW4gPSBvZmZzY3JlZW4gJiYgcGxhY2VkR2x5cGhCb3hlcy5vZmZzY3JlZW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHRDaXJjbGVzID0gc3ltYm9sSW5zdGFuY2UuY29sbGlzaW9uQXJyYXlzLnRleHRDaXJjbGVzO1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0Q2lyY2xlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGFjZWRTeW1ib2wgPSBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheS5nZXQoc3ltYm9sSW5zdGFuY2UucGxhY2VkVGV4dFN5bWJvbEluZGljZXNbMF0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb250U2l6ZSA9IHN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yRmVhdHVyZShidWNrZXQudGV4dFNpemVEYXRhLCBwYXJ0aWFsbHlFdmFsdWF0ZWRUZXh0U2l6ZSwgcGxhY2VkU3ltYm9sKTtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VkR2x5cGhDaXJjbGVzID0gdGhpcy5jb2xsaXNpb25JbmRleC5wbGFjZUNvbGxpc2lvbkNpcmNsZXModGV4dENpcmNsZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmdldCgndGV4dC1hbGxvdy1vdmVybGFwJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2Uua2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlZFN5bWJvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQubGluZVZlcnRleEFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5nbHlwaE9mZnNldEFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc01hdHJpeCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0TGFiZWxQbGFuZU1hdHJpeCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Q29sbGlzaW9uQm94ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmdldCgndGV4dC1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ21hcCcpO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0ZXh0LWFsbG93LW92ZXJsYXAgaXMgc2V0LCBmb3JjZSBcInBsYWNlZENpcmNsZXNcIiB0byB0cnVlXG4gICAgICAgICAgICAgICAgICAgIC8vIEluIHRoZW9yeSB0aGVyZSBzaG91bGQgYWx3YXlzIGJlIGF0IGxlYXN0IG9uZSBjaXJjbGUgcGxhY2VkXG4gICAgICAgICAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZSwgYnV0IGZvciBub3cgcXVpcmtzIGluIHRleHQtYW5jaG9yXG4gICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0ZXh0LW9mZnNldCBtYXkgcHJldmVudCB0aGF0IGZyb20gYmVpbmcgdHJ1ZS5cbiAgICAgICAgICAgICAgICAgICAgcGxhY2VUZXh0ID0gbGF5b3V0LmdldCgndGV4dC1hbGxvdy1vdmVybGFwJykgfHwgcGxhY2VkR2x5cGhDaXJjbGVzLmNpcmNsZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2NyZWVuID0gb2Zmc2NyZWVuICYmIHBsYWNlZEdseXBoQ2lyY2xlcy5vZmZzY3JlZW47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHN5bWJvbEluc3RhbmNlLmNvbGxpc2lvbkFycmF5cy5pY29uQm94KSB7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlZEljb25Cb3hlcyA9IHRoaXMuY29sbGlzaW9uSW5kZXgucGxhY2VDb2xsaXNpb25Cb3goc3ltYm9sSW5zdGFuY2UuY29sbGlzaW9uQXJyYXlzLmljb25Cb3gsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmdldCgnaWNvbi1hbGxvdy1vdmVybGFwJyksIHRleHRQaXhlbFJhdGlvLCBwb3NNYXRyaXgpO1xuICAgICAgICAgICAgICAgICAgICBwbGFjZUljb24gPSBwbGFjZWRJY29uQm94ZXMuYm94Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNjcmVlbiA9IG9mZnNjcmVlbiAmJiBwbGFjZWRJY29uQm94ZXMub2Zmc2NyZWVuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENvbWJpbmUgdGhlIHNjYWxlcyBmb3IgaWNvbnMgYW5kIHRleHQuXG4gICAgICAgICAgICAgICAgaWYgKCFpY29uV2l0aG91dFRleHQgJiYgIXRleHRXaXRob3V0SWNvbikge1xuICAgICAgICAgICAgICAgICAgICBwbGFjZUljb24gPSBwbGFjZVRleHQgPSBwbGFjZUljb24gJiYgcGxhY2VUZXh0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRleHRXaXRob3V0SWNvbikge1xuICAgICAgICAgICAgICAgICAgICBwbGFjZVRleHQgPSBwbGFjZUljb24gJiYgcGxhY2VUZXh0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWljb25XaXRob3V0VGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBwbGFjZUljb24gPSBwbGFjZUljb24gJiYgcGxhY2VUZXh0O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChwbGFjZVRleHQgJiYgcGxhY2VkR2x5cGhCb3hlcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbGxpc2lvbkluZGV4Lmluc2VydENvbGxpc2lvbkJveChwbGFjZWRHbHlwaEJveGVzLmJveCwgbGF5b3V0LmdldCgndGV4dC1pZ25vcmUtcGxhY2VtZW50JyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZUtleSwgc291cmNlSUQsIGJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkLCBzeW1ib2xJbnN0YW5jZS50ZXh0Qm94U3RhcnRJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwbGFjZUljb24gJiYgcGxhY2VkSWNvbkJveGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sbGlzaW9uSW5kZXguaW5zZXJ0Q29sbGlzaW9uQm94KHBsYWNlZEljb25Cb3hlcy5ib3gsIGxheW91dC5nZXQoJ2ljb24taWdub3JlLXBsYWNlbWVudCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVLZXksIHNvdXJjZUlELCBidWNrZXQuYnVja2V0SW5zdGFuY2VJZCwgc3ltYm9sSW5zdGFuY2UuaWNvbkJveFN0YXJ0SW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGxhY2VUZXh0ICYmIHBsYWNlZEdseXBoQ2lyY2xlcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbGxpc2lvbkluZGV4Lmluc2VydENvbGxpc2lvbkNpcmNsZXMocGxhY2VkR2x5cGhDaXJjbGVzLmNpcmNsZXMsIGxheW91dC5nZXQoJ3RleHQtaWdub3JlLXBsYWNlbWVudCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVLZXksIHNvdXJjZUlELCBidWNrZXQuYnVja2V0SW5zdGFuY2VJZCwgc3ltYm9sSW5zdGFuY2UudGV4dEJveFN0YXJ0SW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGFzc2VydChzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRCAhPT0gMCk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkICE9PSAwKTtcblxuICAgICAgICAgICAgICAgIHRoaXMucGxhY2VtZW50c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gPSBuZXcgSm9pbnRQbGFjZW1lbnQocGxhY2VUZXh0LCBwbGFjZUljb24sIG9mZnNjcmVlbiB8fCBidWNrZXQuanVzdFJlbG9hZGVkKTtcbiAgICAgICAgICAgICAgICBzZWVuQ3Jvc3NUaWxlSURzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBidWNrZXQuanVzdFJlbG9hZGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgY29tbWl0KHByZXZQbGFjZW1lbnQgICAgICAgICAgICAsIG5vdyAgICAgICAgKSAgICAgICB7XG4gICAgICAgIHRoaXMuY29tbWl0VGltZSA9IG5vdztcblxuICAgICAgICBsZXQgcGxhY2VtZW50Q2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGluY3JlbWVudCA9IChwcmV2UGxhY2VtZW50ICYmIHRoaXMuZmFkZUR1cmF0aW9uICE9PSAwKSA/XG4gICAgICAgICAgICAodGhpcy5jb21taXRUaW1lIC0gcHJldlBsYWNlbWVudC5jb21taXRUaW1lKSAvIHRoaXMuZmFkZUR1cmF0aW9uIDpcbiAgICAgICAgICAgIDE7XG5cbiAgICAgICAgY29uc3QgcHJldk9wYWNpdGllcyA9IHByZXZQbGFjZW1lbnQgPyBwcmV2UGxhY2VtZW50Lm9wYWNpdGllcyA6IHt9O1xuXG4gICAgICAgIC8vIGFkZCB0aGUgb3BhY2l0aWVzIGZyb20gdGhlIGN1cnJlbnQgcGxhY2VtZW50LCBhbmQgY29weSB0aGVpciBjdXJyZW50IHZhbHVlcyBmcm9tIHRoZSBwcmV2aW91cyBwbGFjZW1lbnRcbiAgICAgICAgZm9yIChjb25zdCBjcm9zc1RpbGVJRCBpbiB0aGlzLnBsYWNlbWVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGpvaW50UGxhY2VtZW50ID0gdGhpcy5wbGFjZW1lbnRzW2Nyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZPcGFjaXR5ID0gcHJldk9wYWNpdGllc1tjcm9zc1RpbGVJRF07XG4gICAgICAgICAgICBpZiAocHJldk9wYWNpdHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wYWNpdGllc1tjcm9zc1RpbGVJRF0gPSBuZXcgSm9pbnRPcGFjaXR5U3RhdGUocHJldk9wYWNpdHksIGluY3JlbWVudCwgam9pbnRQbGFjZW1lbnQudGV4dCwgam9pbnRQbGFjZW1lbnQuaWNvbik7XG4gICAgICAgICAgICAgICAgcGxhY2VtZW50Q2hhbmdlZCA9IHBsYWNlbWVudENoYW5nZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgam9pbnRQbGFjZW1lbnQudGV4dCAhPT0gcHJldk9wYWNpdHkudGV4dC5wbGFjZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgam9pbnRQbGFjZW1lbnQuaWNvbiAhPT0gcHJldk9wYWNpdHkuaWNvbi5wbGFjZWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXSA9IG5ldyBKb2ludE9wYWNpdHlTdGF0ZShudWxsLCBpbmNyZW1lbnQsIGpvaW50UGxhY2VtZW50LnRleHQsIGpvaW50UGxhY2VtZW50Lmljb24sIGpvaW50UGxhY2VtZW50LnNraXBGYWRlKTtcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnRDaGFuZ2VkID0gcGxhY2VtZW50Q2hhbmdlZCB8fCBqb2ludFBsYWNlbWVudC50ZXh0IHx8IGpvaW50UGxhY2VtZW50Lmljb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb3B5IGFuZCB1cGRhdGUgdmFsdWVzIGZyb20gdGhlIHByZXZpb3VzIHBsYWNlbWVudCB0aGF0IGFyZW4ndCBpbiB0aGUgY3VycmVudCBwbGFjZW1lbnQgYnV0IGhhdmVuJ3QgZmluaXNoZWQgZmFkaW5nXG4gICAgICAgIGZvciAoY29uc3QgY3Jvc3NUaWxlSUQgaW4gcHJldk9wYWNpdGllcykge1xuICAgICAgICAgICAgY29uc3QgcHJldk9wYWNpdHkgPSBwcmV2T3BhY2l0aWVzW2Nyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgIGlmICghdGhpcy5vcGFjaXRpZXNbY3Jvc3NUaWxlSURdKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgam9pbnRPcGFjaXR5ID0gbmV3IEpvaW50T3BhY2l0eVN0YXRlKHByZXZPcGFjaXR5LCBpbmNyZW1lbnQsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFqb2ludE9wYWNpdHkuaXNIaWRkZW4oKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wYWNpdGllc1tjcm9zc1RpbGVJRF0gPSBqb2ludE9wYWNpdHk7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudENoYW5nZWQgPSBwbGFjZW1lbnRDaGFuZ2VkIHx8IHByZXZPcGFjaXR5LnRleHQucGxhY2VkIHx8IHByZXZPcGFjaXR5Lmljb24ucGxhY2VkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoaXMubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgaXMgdGhlIHRpbWUgb2YgdGhlIGxhc3QgY29tbWl0KCkgdGhhdFxuICAgICAgICAvLyByZXN1bHRlZCBpbiBhIHBsYWNlbWVudCBjaGFuZ2UgLS0gaW4gb3RoZXIgd29yZHMsIHRoZSBzdGFydCB0aW1lIG9mXG4gICAgICAgIC8vIHRoZSBsYXN0IHN5bWJvbCBmYWRlIGFuaW1hdGlvblxuICAgICAgICBhc3NlcnQoIXByZXZQbGFjZW1lbnQgfHwgcHJldlBsYWNlbWVudC5sYXN0UGxhY2VtZW50Q2hhbmdlVGltZSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHBsYWNlbWVudENoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgPSBub3c7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lID0gcHJldlBsYWNlbWVudCA/IHByZXZQbGFjZW1lbnQubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgOiBub3c7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVMYXllck9wYWNpdGllcyhzdHlsZUxheWVyICAgICAgICAgICAgLCB0aWxlcyAgICAgICAgICAgICApIHtcbiAgICAgICAgY29uc3Qgc2VlbkNyb3NzVGlsZUlEcyA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgdGlsZSBvZiB0aWxlcykge1xuICAgICAgICAgICAgY29uc3Qgc3ltYm9sQnVja2V0ID0gKCh0aWxlLmdldEJ1Y2tldChzdHlsZUxheWVyKSAgICAgKSAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChzeW1ib2xCdWNrZXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUJ1Y2tldE9wYWNpdGllcyhzeW1ib2xCdWNrZXQsIHNlZW5Dcm9zc1RpbGVJRHMsIHRpbGUuY29sbGlzaW9uQm94QXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlQnVja2V0T3BhY2l0aWVzKGJ1Y2tldCAgICAgICAgICAgICAgLCBzZWVuQ3Jvc3NUaWxlSURzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGNvbGxpc2lvbkJveEFycmF5ICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNUZXh0RGF0YSgpKSBidWNrZXQudGV4dC5vcGFjaXR5VmVydGV4QXJyYXkuY2xlYXIoKTtcbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNJY29uRGF0YSgpKSBidWNrZXQuaWNvbi5vcGFjaXR5VmVydGV4QXJyYXkuY2xlYXIoKTtcbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNDb2xsaXNpb25Cb3hEYXRhKCkpIGJ1Y2tldC5jb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXkuY2xlYXIoKTtcbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNDb2xsaXNpb25DaXJjbGVEYXRhKCkpIGJ1Y2tldC5jb2xsaXNpb25DaXJjbGUuY29sbGlzaW9uVmVydGV4QXJyYXkuY2xlYXIoKTtcblxuICAgICAgICBjb25zdCBsYXlvdXQgPSBidWNrZXQubGF5ZXJzWzBdLmxheW91dDtcbiAgICAgICAgY29uc3QgZGVmYXVsdE9wYWNpdHlTdGF0ZSA9IG5ldyBKb2ludE9wYWNpdHlTdGF0ZShudWxsLCAwLFxuICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ3RleHQtYWxsb3ctb3ZlcmxhcCcpLFxuICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ2ljb24tYWxsb3ctb3ZlcmxhcCcpLCB0cnVlKTtcblxuICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluc3RhbmNlID0gYnVja2V0LnN5bWJvbEluc3RhbmNlc1tzXTtcbiAgICAgICAgICAgIGNvbnN0IGlzRHVwbGljYXRlID0gc2VlbkNyb3NzVGlsZUlEc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF07XG5cbiAgICAgICAgICAgIGxldCBvcGFjaXR5U3RhdGUgPSB0aGlzLm9wYWNpdGllc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF07XG4gICAgICAgICAgICBpZiAoIW9wYWNpdHlTdGF0ZSkge1xuICAgICAgICAgICAgICAgIG9wYWNpdHlTdGF0ZSA9IGRlZmF1bHRPcGFjaXR5U3RhdGU7XG4gICAgICAgICAgICAgICAgLy8gc3RvcmUgdGhlIHN0YXRlIHNvIHRoYXQgZnV0dXJlIHBsYWNlbWVudHMgdXNlIGl0IGFzIGEgc3RhcnRpbmcgcG9pbnRcbiAgICAgICAgICAgICAgICB0aGlzLm9wYWNpdGllc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gPSBvcGFjaXR5U3RhdGU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICAgICAgb3BhY2l0eVN0YXRlID0gZGVmYXVsdE9wYWNpdHlTdGF0ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VlbkNyb3NzVGlsZUlEc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBoYXNUZXh0ID0gc3ltYm9sSW5zdGFuY2UubnVtR2x5cGhWZXJ0aWNlcyA+IDAgfHwgc3ltYm9sSW5zdGFuY2UubnVtVmVydGljYWxHbHlwaFZlcnRpY2VzID4gMDtcbiAgICAgICAgICAgIGNvbnN0IGhhc0ljb24gPSBzeW1ib2xJbnN0YW5jZS5udW1JY29uVmVydGljZXMgPiAwO1xuXG4gICAgICAgICAgICBpZiAoaGFzVGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhY2tlZE9wYWNpdHkgPSBwYWNrT3BhY2l0eShvcGFjaXR5U3RhdGUudGV4dCk7XG4gICAgICAgICAgICAgICAgLy8gVmVydGljYWwgdGV4dCBmYWRlcyBpbi9vdXQgb24gY29sbGlzaW9uIHRoZSBzYW1lIHdheSBhcyBjb3JyZXNwb25kaW5nXG4gICAgICAgICAgICAgICAgLy8gaG9yaXpvbnRhbCB0ZXh0LiBTd2l0Y2ggYmV0d2VlbiB2ZXJ0aWNhbC9ob3Jpem9udGFsIHNob3VsZCBiZSBpbnN0YW50YW5lb3VzXG4gICAgICAgICAgICAgICAgY29uc3Qgb3BhY2l0eUVudHJ5Q291bnQgPSAoc3ltYm9sSW5zdGFuY2UubnVtR2x5cGhWZXJ0aWNlcyArIHN5bWJvbEluc3RhbmNlLm51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcykgLyA0O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3BhY2l0eUVudHJ5Q291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBidWNrZXQudGV4dC5vcGFjaXR5VmVydGV4QXJyYXkuZW1wbGFjZUJhY2socGFja2VkT3BhY2l0eSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGxhY2VkVGV4dFN5bWJvbEluZGV4IG9mIHN5bWJvbEluc3RhbmNlLnBsYWNlZFRleHRTeW1ib2xJbmRpY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlZFN5bWJvbCA9IGJ1Y2tldC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldChwbGFjZWRUZXh0U3ltYm9sSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGxhYmVsIGlzIGNvbXBsZXRlbHkgZmFkZWQsIG1hcmsgaXQgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNhbGN1bGF0ZVxuICAgICAgICAgICAgICAgICAgICAvLyBpdHMgcG9zaXRpb24gYXQgcmVuZGVyIHRpbWVcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VkU3ltYm9sLmhpZGRlbiA9IChvcGFjaXR5U3RhdGUudGV4dC5pc0hpZGRlbigpICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhhc0ljb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWNrZWRPcGFjaXR5ID0gcGFja09wYWNpdHkob3BhY2l0eVN0YXRlLmljb24pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ltYm9sSW5zdGFuY2UubnVtSWNvblZlcnRpY2VzIC8gNDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5pY29uLm9wYWNpdHlWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhwYWNrZWRPcGFjaXR5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VkU3ltYm9sID0gYnVja2V0Lmljb24ucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KHMpO1xuICAgICAgICAgICAgICAgIHBsYWNlZFN5bWJvbC5oaWRkZW4gPSAob3BhY2l0eVN0YXRlLmljb24uaXNIaWRkZW4oKSAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFzeW1ib2xJbnN0YW5jZS5jb2xsaXNpb25BcnJheXMpIHtcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5jb2xsaXNpb25BcnJheXMgPSBidWNrZXQuZGVzZXJpYWxpemVDb2xsaXNpb25Cb3hlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICgoY29sbGlzaW9uQm94QXJyYXkgICAgICkgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLnRleHRCb3hTdGFydEluZGV4LCBzeW1ib2xJbnN0YW5jZS50ZXh0Qm94RW5kSW5kZXgsIHN5bWJvbEluc3RhbmNlLmljb25Cb3hTdGFydEluZGV4LCBzeW1ib2xJbnN0YW5jZS5pY29uQm94RW5kSW5kZXgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb2xsaXNpb25BcnJheXMgPSBzeW1ib2xJbnN0YW5jZS5jb2xsaXNpb25BcnJheXM7XG4gICAgICAgICAgICBpZiAoY29sbGlzaW9uQXJyYXlzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkFycmF5cy50ZXh0Qm94ICYmIGJ1Y2tldC5oYXNDb2xsaXNpb25Cb3hEYXRhKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29sbGlzaW9uVmVydGljZXMoYnVja2V0LmNvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheSwgb3BhY2l0eVN0YXRlLnRleHQucGxhY2VkLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkFycmF5cy5pY29uQm94ICYmIGJ1Y2tldC5oYXNDb2xsaXNpb25Cb3hEYXRhKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29sbGlzaW9uVmVydGljZXMoYnVja2V0LmNvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheSwgb3BhY2l0eVN0YXRlLmljb24ucGxhY2VkLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dENpcmNsZXMgPSBjb2xsaXNpb25BcnJheXMudGV4dENpcmNsZXM7XG4gICAgICAgICAgICAgICAgaWYgKHRleHRDaXJjbGVzICYmIGJ1Y2tldC5oYXNDb2xsaXNpb25DaXJjbGVEYXRhKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCB0ZXh0Q2lyY2xlcy5sZW5ndGg7IGsgKz0gNSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm90VXNlZCA9IGlzRHVwbGljYXRlIHx8IHRleHRDaXJjbGVzW2sgKyA0XSA9PT0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbGxpc2lvblZlcnRpY2VzKGJ1Y2tldC5jb2xsaXNpb25DaXJjbGUuY29sbGlzaW9uVmVydGV4QXJyYXksIG9wYWNpdHlTdGF0ZS50ZXh0LnBsYWNlZCwgbm90VXNlZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBidWNrZXQuc29ydEZlYXR1cmVzKHRoaXMudHJhbnNmb3JtLmFuZ2xlKTtcblxuICAgICAgICBpZiAoYnVja2V0Lmhhc1RleHREYXRhKCkgJiYgYnVja2V0LnRleHQub3BhY2l0eVZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgYnVja2V0LnRleHQub3BhY2l0eVZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKGJ1Y2tldC50ZXh0Lm9wYWNpdHlWZXJ0ZXhBcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNJY29uRGF0YSgpICYmIGJ1Y2tldC5pY29uLm9wYWNpdHlWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5pY29uLm9wYWNpdHlWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShidWNrZXQuaWNvbi5vcGFjaXR5VmVydGV4QXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidWNrZXQuaGFzQ29sbGlzaW9uQm94RGF0YSgpICYmIGJ1Y2tldC5jb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICBidWNrZXQuY29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKGJ1Y2tldC5jb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidWNrZXQuaGFzQ29sbGlzaW9uQ2lyY2xlRGF0YSgpICYmIGJ1Y2tldC5jb2xsaXNpb25DaXJjbGUuY29sbGlzaW9uVmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICBidWNrZXQuY29sbGlzaW9uQ2lyY2xlLmNvbGxpc2lvblZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKGJ1Y2tldC5jb2xsaXNpb25DaXJjbGUuY29sbGlzaW9uVmVydGV4QXJyYXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXNzZXJ0KGJ1Y2tldC50ZXh0Lm9wYWNpdHlWZXJ0ZXhBcnJheS5sZW5ndGggPT09IGJ1Y2tldC50ZXh0LmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCAvIDQpO1xuICAgICAgICBhc3NlcnQoYnVja2V0Lmljb24ub3BhY2l0eVZlcnRleEFycmF5Lmxlbmd0aCA9PT0gYnVja2V0Lmljb24ubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoIC8gNCk7XG4gICAgfVxuXG4gICAgc3ltYm9sRmFkZUNoYW5nZShub3cgICAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5mYWRlRHVyYXRpb24gPT09IDAgP1xuICAgICAgICAgICAgMSA6XG4gICAgICAgICAgICAobm93IC0gdGhpcy5jb21taXRUaW1lKSAvIHRoaXMuZmFkZUR1cmF0aW9uO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb25zKG5vdyAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YWxlIHx8XG4gICAgICAgICAgICBub3cgLSB0aGlzLmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lIDwgdGhpcy5mYWRlRHVyYXRpb247XG4gICAgfVxuXG4gICAgc3RpbGxSZWNlbnQobm93ICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWl0VGltZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHRoaXMuY29tbWl0VGltZSArIHRoaXMuZmFkZUR1cmF0aW9uID4gbm93O1xuICAgIH1cblxuICAgIHNldFN0YWxlKCkge1xuICAgICAgICB0aGlzLnN0YWxlID0gdHJ1ZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbGxpc2lvblZlcnRpY2VzKGNvbGxpc2lvblZlcnRleEFycmF5ICAgICAgICAgICAgICAgICAgICAgICwgcGxhY2VkICAgICAgICAgLCBub3RVc2VkICAgICAgICAgKSB7XG4gICAgY29sbGlzaW9uVmVydGV4QXJyYXkuZW1wbGFjZUJhY2socGxhY2VkID8gMSA6IDAsIG5vdFVzZWQgPyAxIDogMCk7XG4gICAgY29sbGlzaW9uVmVydGV4QXJyYXkuZW1wbGFjZUJhY2socGxhY2VkID8gMSA6IDAsIG5vdFVzZWQgPyAxIDogMCk7XG4gICAgY29sbGlzaW9uVmVydGV4QXJyYXkuZW1wbGFjZUJhY2socGxhY2VkID8gMSA6IDAsIG5vdFVzZWQgPyAxIDogMCk7XG4gICAgY29sbGlzaW9uVmVydGV4QXJyYXkuZW1wbGFjZUJhY2socGxhY2VkID8gMSA6IDAsIG5vdFVzZWQgPyAxIDogMCk7XG59XG5cbi8vIEFsbCBmb3VyIHZlcnRpY2VzIGZvciBhIGdseXBoIHdpbGwgaGF2ZSB0aGUgc2FtZSBvcGFjaXR5IHN0YXRlXG4vLyBTbyB3ZSBwYWNrIHRoZSBvcGFjaXR5IGludG8gYSB1aW50OCwgYW5kIHRoZW4gcmVwZWF0IGl0IGZvdXIgdGltZXNcbi8vIHRvIG1ha2UgYSBzaW5nbGUgdWludDMyIHRoYXQgd2UgY2FuIHVwbG9hZCBmb3IgZWFjaCBnbHlwaCBpbiB0aGVcbi8vIGxhYmVsLlxuY29uc3Qgc2hpZnQyNSA9IE1hdGgucG93KDIsIDI1KTtcbmNvbnN0IHNoaWZ0MjQgPSBNYXRoLnBvdygyLCAyNCk7XG5jb25zdCBzaGlmdDE3ID0gTWF0aC5wb3coMiwgMTcpO1xuY29uc3Qgc2hpZnQxNiA9IE1hdGgucG93KDIsIDE2KTtcbmNvbnN0IHNoaWZ0OSA9IE1hdGgucG93KDIsIDkpO1xuY29uc3Qgc2hpZnQ4ID0gTWF0aC5wb3coMiwgOCk7XG5jb25zdCBzaGlmdDEgPSBNYXRoLnBvdygyLCAxKTtcbmZ1bmN0aW9uIHBhY2tPcGFjaXR5KG9wYWNpdHlTdGF0ZSAgICAgICAgICAgICAgKSAgICAgICAgIHtcbiAgICBpZiAob3BhY2l0eVN0YXRlLm9wYWNpdHkgPT09IDAgJiYgIW9wYWNpdHlTdGF0ZS5wbGFjZWQpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIGlmIChvcGFjaXR5U3RhdGUub3BhY2l0eSA9PT0gMSAmJiBvcGFjaXR5U3RhdGUucGxhY2VkKSB7XG4gICAgICAgIHJldHVybiA0Mjk0OTY3Mjk1O1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRCaXQgPSBvcGFjaXR5U3RhdGUucGxhY2VkID8gMSA6IDA7XG4gICAgY29uc3Qgb3BhY2l0eUJpdHMgPSBNYXRoLmZsb29yKG9wYWNpdHlTdGF0ZS5vcGFjaXR5ICogMTI3KTtcbiAgICByZXR1cm4gb3BhY2l0eUJpdHMgKiBzaGlmdDI1ICsgdGFyZ2V0Qml0ICogc2hpZnQyNCArXG4gICAgICAgIG9wYWNpdHlCaXRzICogc2hpZnQxNyArIHRhcmdldEJpdCAqIHNoaWZ0MTYgK1xuICAgICAgICBvcGFjaXR5Qml0cyAqIHNoaWZ0OSArIHRhcmdldEJpdCAqIHNoaWZ0OCArXG4gICAgICAgIG9wYWNpdHlCaXRzICogc2hpZnQxICsgdGFyZ2V0Qml0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFBsYWNlbWVudDtcbiIsIi8vICAgICAgXG5cbmNvbnN0IFBvaW50ID0gcmVxdWlyZSgnQG1hcGJveC9wb2ludC1nZW9tZXRyeScpO1xuY29uc3Qge21hdDQsIHZlYzR9ID0gcmVxdWlyZSgnQG1hcGJveC9nbC1tYXRyaXgnKTtcbmNvbnN0IHN5bWJvbFNpemUgPSByZXF1aXJlKCcuL3N5bWJvbF9zaXplJyk7XG5jb25zdCB7YWRkRHluYW1pY0F0dHJpYnV0ZXN9ID0gcmVxdWlyZSgnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldCcpO1xuY29uc3Qgc3ltYm9sTGF5b3V0UHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJykubGF5b3V0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5jb25zdCBXcml0aW5nTW9kZSA9IHJlcXVpcmUoJy4uL3N5bWJvbC9zaGFwaW5nJykuV3JpdGluZ01vZGU7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHVwZGF0ZUxpbmVMYWJlbHMsXG4gICAgZ2V0TGFiZWxQbGFuZU1hdHJpeCxcbiAgICBnZXRHbENvb3JkTWF0cml4LFxuICAgIHByb2plY3QsXG4gICAgcGxhY2VGaXJzdEFuZExhc3RHbHlwaCxcbiAgICB4eVRyYW5zZm9ybU1hdDRcbn07XG5cbi8qXG4gKiAjIE92ZXJ2aWV3IG9mIGNvb3JkaW5hdGUgc3BhY2VzXG4gKlxuICogIyMgVGlsZSBjb29yZGluYXRlIHNwYWNlc1xuICogRWFjaCBsYWJlbCBoYXMgYW4gYW5jaG9yLiBTb21lIGxhYmVscyBoYXZlIGNvcnJlc3BvbmRpbmcgbGluZSBnZW9tZXRyaWVzLlxuICogVGhlIHBvaW50cyBmb3IgYm90aCBhbmNob3JzIGFuZCBsaW5lcyBhcmUgc3RvcmVkIGluIHRpbGUgdW5pdHMuIEVhY2ggdGlsZSBoYXMgaXQncyBvd25cbiAqIGNvb3JkaW5hdGUgc3BhY2UgZ29pbmcgZnJvbSAoMCwgMCkgYXQgdGhlIHRvcCBsZWZ0IHRvIChFWFRFTlQsIEVYVEVOVCkgYXQgdGhlIGJvdHRvbSByaWdodC5cbiAqXG4gKiAjIyBHTCBjb29yZGluYXRlIHNwYWNlXG4gKiBBdCB0aGUgZW5kIG9mIGV2ZXJ5dGhpbmcsIHRoZSB2ZXJ0ZXggc2hhZGVyIG5lZWRzIHRvIHByb2R1Y2UgYSBwb3NpdGlvbiBpbiBHTCBjb29yZGluYXRlIHNwYWNlLFxuICogd2hpY2ggaXMgKC0xLCAxKSBhdCB0aGUgdG9wIGxlZnQgYW5kICgxLCAtMSkgaW4gdGhlIGJvdHRvbSByaWdodC5cbiAqXG4gKiAjIyBNYXAgcGl4ZWwgY29vcmRpbmF0ZSBzcGFjZXNcbiAqIEVhY2ggdGlsZSBoYXMgYSBwaXhlbCBjb29yZGluYXRlIHNwYWNlLiBJdCdzIGp1c3QgdGhlIHRpbGUgdW5pdHMgc2NhbGVkIHNvIHRoYXQgb25lIHVuaXQgaXNcbiAqIHdoYXRldmVyIGNvdW50cyBhcyAxIHBpeGVsIGF0IHRoZSBjdXJyZW50IHpvb20uXG4gKiBUaGlzIHNwYWNlIGlzIHVzZWQgZm9yIHBpdGNoLWFsaWdubWVudD1tYXAsIHJvdGF0aW9uLWFsaWdubWVudD1tYXBcbiAqXG4gKiAjIyBSb3RhdGVkIG1hcCBwaXhlbCBjb29yZGluYXRlIHNwYWNlc1xuICogTGlrZSB0aGUgYWJvdmUsIGJ1dCByb3RhdGVkIHNvIGF4aXMgb2YgdGhlIHNwYWNlIGFyZSBhbGlnbmVkIHdpdGggdGhlIHZpZXdwb3J0IGluc3RlYWQgb2YgdGhlIHRpbGUuXG4gKiBUaGlzIHNwYWNlIGlzIHVzZWQgZm9yIHBpdGNoLWFsaWdubWVudD1tYXAsIHJvdGF0aW9uLWFsaWdubWVudD12aWV3cG9ydFxuICpcbiAqICMjIFZpZXdwb3J0IHBpeGVsIGNvb3JkaW5hdGUgc3BhY2VcbiAqICgwLCAwKSBpcyBhdCB0aGUgdG9wIGxlZnQgb2YgdGhlIGNhbnZhcyBhbmQgKHBpeGVsV2lkdGgsIHBpeGVsSGVpZ2h0KSBpcyBhdCB0aGUgYm90dG9tIHJpZ2h0IGNvcm5lclxuICogb2YgdGhlIGNhbnZhcy4gVGhpcyBzcGFjZSBpcyB1c2VkIGZvciBwaXRjaC1hbGlnbm1lbnQ9dmlld3BvcnRcbiAqXG4gKlxuICogIyBWZXJ0ZXggcHJvamVjdGlvblxuICogSXQgZ29lcyByb3VnaGx5IGxpa2UgdGhpczpcbiAqIDEuIHByb2plY3QgdGhlIGFuY2hvciBhbmQgbGluZSBmcm9tIHRpbGUgdW5pdHMgaW50byB0aGUgY29ycmVjdCBsYWJlbCBjb29yZGluYXRlIHNwYWNlXG4gKiAgICAgIC0gbWFwIHBpeGVsIHNwYWNlICAgICAgICAgICBwaXRjaC1hbGlnbm1lbnQ9bWFwICAgICAgICAgcm90YXRpb24tYWxpZ25tZW50PW1hcFxuICogICAgICAtIHJvdGF0ZWQgbWFwIHBpeGVsIHNwYWNlICAgcGl0Y2gtYWxpZ25tZW50PW1hcCAgICAgICAgIHJvdGF0aW9uLWFsaWdubWVudD12aWV3cG9ydFxuICogICAgICAtIHZpZXdwb3J0IHBpeGVsIHNwYWNlICAgICAgcGl0Y2gtYWxpZ25tZW50PXZpZXdwb3J0ICAgIHJvdGF0aW9uLWFsaWdubWVudD0qXG4gKiAyLiBpZiB0aGUgbGFiZWwgZm9sbG93cyBhIGxpbmUsIGZpbmQgdGhlIHBvaW50IGFsb25nIHRoZSBsaW5lIHRoYXQgaXMgdGhlIGNvcnJlY3QgZGlzdGFuY2UgZnJvbSB0aGUgYW5jaG9yLlxuICogMy4gYWRkIHRoZSBnbHlwaCdzIGNvcm5lciBvZmZzZXQgdG8gdGhlIHBvaW50IGZyb20gc3RlcCAzXG4gKiA0LiBjb252ZXJ0IGZyb20gdGhlIGxhYmVsIGNvb3JkaW5hdGUgc3BhY2UgdG8gZ2wgY29vcmRpbmF0ZXNcbiAqXG4gKiBGb3IgaG9yaXpvbnRhbCBsYWJlbHMgd2Ugd2FudCB0byBkbyBzdGVwIDEgaW4gdGhlIHNoYWRlciBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyAobm8gY3B1IHdvcmspLlxuICogICAgICBUaGlzIGlzIHdoYXQgYHVfbGFiZWxfcGxhbmVfbWF0cml4YCBpcyB1c2VkIGZvci5cbiAqIEZvciBsYWJlbHMgYWxpZ25lZCB3aXRoIGxpbmVzIHdlIGhhdmUgdG8gc3RlcHMgMSBhbmQgMiBvbiB0aGUgY3B1IHNpbmNlIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBsaW5lIGdlb21ldHJ5LlxuICogICAgICBUaGlzIGlzIHdoYXQgYHVwZGF0ZUxpbmVMYWJlbHMoLi4uKWAgZG9lcy5cbiAqICAgICAgU2luY2UgdGhlIGNvbnZlcnNpb24gaXMgaGFuZGxlZCBvbiB0aGUgY3B1IHdlIGp1c3Qgc2V0IGB1X2xhYmVsX3BsYW5lX21hdHJpeGAgdG8gYW4gaWRlbnRpdHkgbWF0cml4LlxuICpcbiAqIFN0ZXBzIDMgYW5kIDQgYXJlIGRvbmUgaW4gdGhlIHNoYWRlcnMgZm9yIGFsbCBsYWJlbHMuXG4gKi9cblxuLypcbiAqIFJldHVybnMgYSBtYXRyaXggZm9yIGNvbnZlcnRpbmcgZnJvbSB0aWxlIHVuaXRzIHRvIHRoZSBjb3JyZWN0IGxhYmVsIGNvb3JkaW5hdGUgc3BhY2UuXG4gKi9cbmZ1bmN0aW9uIGdldExhYmVsUGxhbmVNYXRyaXgocG9zTWF0cml4ICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXRjaFdpdGhNYXAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZVdpdGhNYXAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNUb1RpbGVVbml0cyAgICAgICAgKSB7XG4gICAgY29uc3QgbSA9IG1hdDQuaWRlbnRpdHkobmV3IEZsb2F0MzJBcnJheSgxNikpO1xuICAgIGlmIChwaXRjaFdpdGhNYXApIHtcbiAgICAgICAgbWF0NC5pZGVudGl0eShtKTtcbiAgICAgICAgbWF0NC5zY2FsZShtLCBtLCBbMSAvIHBpeGVsc1RvVGlsZVVuaXRzLCAxIC8gcGl4ZWxzVG9UaWxlVW5pdHMsIDFdKTtcbiAgICAgICAgaWYgKCFyb3RhdGVXaXRoTWFwKSB7XG4gICAgICAgICAgICBtYXQ0LnJvdGF0ZVoobSwgbSwgdHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgW3RyYW5zZm9ybS53aWR0aCAvIDIsIC10cmFuc2Zvcm0uaGVpZ2h0IC8gMiwgMV0pO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCBbMSwgLTEsIDBdKTtcbiAgICAgICAgbWF0NC5tdWx0aXBseShtLCBtLCBwb3NNYXRyaXgpO1xuICAgIH1cbiAgICByZXR1cm4gbTtcbn1cblxuLypcbiAqIFJldHVybnMgYSBtYXRyaXggZm9yIGNvbnZlcnRpbmcgZnJvbSB0aGUgY29ycmVjdCBsYWJlbCBjb29yZGluYXRlIHNwYWNlIHRvIGdsIGNvb3Jkcy5cbiAqL1xuZnVuY3Rpb24gZ2V0R2xDb29yZE1hdHJpeChwb3NNYXRyaXggICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoV2l0aE1hcCAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlV2l0aE1hcCAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1RvVGlsZVVuaXRzICAgICAgICApIHtcbiAgICBjb25zdCBtID0gbWF0NC5pZGVudGl0eShuZXcgRmxvYXQzMkFycmF5KDE2KSk7XG4gICAgaWYgKHBpdGNoV2l0aE1hcCkge1xuICAgICAgICBtYXQ0Lm11bHRpcGx5KG0sIG0sIHBvc01hdHJpeCk7XG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgW3BpeGVsc1RvVGlsZVVuaXRzLCBwaXhlbHNUb1RpbGVVbml0cywgMV0pO1xuICAgICAgICBpZiAoIXJvdGF0ZVdpdGhNYXApIHtcbiAgICAgICAgICAgIG1hdDQucm90YXRlWihtLCBtLCAtdHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgWzEsIC0xLCAxXSk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG0sIG0sIFstMSwgLTEsIDBdKTtcbiAgICAgICAgbWF0NC5zY2FsZShtLCBtLCBbMiAvIHRyYW5zZm9ybS53aWR0aCwgMiAvIHRyYW5zZm9ybS5oZWlnaHQsIDFdKTtcbiAgICB9XG4gICAgcmV0dXJuIG07XG59XG5cbmZ1bmN0aW9uIHByb2plY3QocG9pbnQgICAgICAgLCBtYXRyaXggICAgICApIHtcbiAgICBjb25zdCBwb3MgPSBbcG9pbnQueCwgcG9pbnQueSwgMCwgMV07XG4gICAgeHlUcmFuc2Zvcm1NYXQ0KHBvcywgcG9zLCBtYXRyaXgpO1xuICAgIGNvbnN0IHcgPSBwb3NbM107XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcG9pbnQ6IG5ldyBQb2ludChwb3NbMF0gLyB3LCBwb3NbMV0gLyB3KSxcbiAgICAgICAgc2lnbmVkRGlzdGFuY2VGcm9tQ2FtZXJhOiB3XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gaXNWaXNpYmxlKGFuY2hvclBvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgY2xpcHBpbmdCdWZmZXIgICAgICAgICAgICAgICAgICApIHtcbiAgICBjb25zdCB4ID0gYW5jaG9yUG9zWzBdIC8gYW5jaG9yUG9zWzNdO1xuICAgIGNvbnN0IHkgPSBhbmNob3JQb3NbMV0gLyBhbmNob3JQb3NbM107XG4gICAgY29uc3QgaW5QYWRkZWRWaWV3cG9ydCA9IChcbiAgICAgICAgeCA+PSAtY2xpcHBpbmdCdWZmZXJbMF0gJiZcbiAgICAgICAgeCA8PSBjbGlwcGluZ0J1ZmZlclswXSAmJlxuICAgICAgICB5ID49IC1jbGlwcGluZ0J1ZmZlclsxXSAmJlxuICAgICAgICB5IDw9IGNsaXBwaW5nQnVmZmVyWzFdKTtcbiAgICByZXR1cm4gaW5QYWRkZWRWaWV3cG9ydDtcbn1cblxuLypcbiAqICBVcGRhdGUgdGhlIGBkeW5hbWljTGF5b3V0VmVydGV4QnVmZmVyYCBmb3IgdGhlIGJ1ZmZlciB3aXRoIHRoZSBjb3JyZWN0IGdseXBoIHBvc2l0aW9ucyBmb3IgdGhlIGN1cnJlbnQgbWFwIHZpZXcuXG4gKiAgVGhpcyBpcyBvbmx5IHJ1biBvbiBsYWJlbHMgdGhhdCBhcmUgYWxpZ25lZCB3aXRoIGxpbmVzLiBIb3Jpem9udGFsIGxhYmVscyBhcmUgaGFuZGxlZCBlbnRpcmVseSBpbiB0aGUgc2hhZGVyLlxuICovXG5mdW5jdGlvbiB1cGRhdGVMaW5lTGFiZWxzKGJ1Y2tldCAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NNYXRyaXggICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50ZXIgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzVGV4dCAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxQbGFuZU1hdHJpeCAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xDb29yZE1hdHJpeCAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hXaXRoTWFwICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwVXByaWdodCAgICAgICAgICkge1xuXG4gICAgY29uc3Qgc2l6ZURhdGEgPSBpc1RleHQgPyBidWNrZXQudGV4dFNpemVEYXRhIDogYnVja2V0Lmljb25TaXplRGF0YTtcbiAgICBjb25zdCBwYXJ0aWFsbHlFdmFsdWF0ZWRTaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3Jab29tKHNpemVEYXRhLCBwYWludGVyLnRyYW5zZm9ybS56b29tLFxuICAgICAgICBzeW1ib2xMYXlvdXRQcm9wZXJ0aWVzLnByb3BlcnRpZXNbaXNUZXh0ID8gJ3RleHQtc2l6ZScgOiAnaWNvbi1zaXplJ10pO1xuXG4gICAgY29uc3QgY2xpcHBpbmdCdWZmZXIgPSBbMjU2IC8gcGFpbnRlci53aWR0aCAqIDIgKyAxLCAyNTYgLyBwYWludGVyLmhlaWdodCAqIDIgKyAxXTtcblxuICAgIGNvbnN0IGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSA9IGlzVGV4dCA/XG4gICAgICAgIGJ1Y2tldC50ZXh0LmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSA6XG4gICAgICAgIGJ1Y2tldC5pY29uLmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheTtcbiAgICBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkuY2xlYXIoKTtcblxuICAgIGNvbnN0IGxpbmVWZXJ0ZXhBcnJheSA9IGJ1Y2tldC5saW5lVmVydGV4QXJyYXk7XG4gICAgY29uc3QgcGxhY2VkU3ltYm9scyA9IGlzVGV4dCA/IGJ1Y2tldC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5IDogYnVja2V0Lmljb24ucGxhY2VkU3ltYm9sQXJyYXk7XG5cbiAgICBjb25zdCBhc3BlY3RSYXRpbyA9IHBhaW50ZXIudHJhbnNmb3JtLndpZHRoIC8gcGFpbnRlci50cmFuc2Zvcm0uaGVpZ2h0O1xuXG4gICAgbGV0IHVzZVZlcnRpY2FsID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBzID0gMDsgcyA8IHBsYWNlZFN5bWJvbHMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sICAgICAgPSBwbGFjZWRTeW1ib2xzLmdldChzKTtcbiAgICAgICAgLy8gRG9uJ3QgZG8gY2FsY3VsYXRpb25zIGZvciB2ZXJ0aWNhbCBnbHlwaHMgdW5sZXNzIHRoZSBwcmV2aW91cyBzeW1ib2wgd2FzIGhvcml6b250YWxcbiAgICAgICAgLy8gYW5kIHdlIGRldGVybWluZWQgdGhhdCB2ZXJ0aWNhbCBnbHlwaHMgd2VyZSBuZWNlc3NhcnkuXG4gICAgICAgIC8vIEFsc28gZG9uJ3QgZG8gY2FsY3VsYXRpb25zIGZvciBzeW1ib2xzIHRoYXQgYXJlIGNvbGxpZGVkIGFuZCBmdWxseSBmYWRlZCBvdXRcbiAgICAgICAgaWYgKHN5bWJvbC5oaWRkZW4gfHwgc3ltYm9sLndyaXRpbmdNb2RlID09PSBXcml0aW5nTW9kZS52ZXJ0aWNhbCAmJiAhdXNlVmVydGljYWwpIHtcbiAgICAgICAgICAgIGhpZGVHbHlwaHMoc3ltYm9sLm51bUdseXBocywgZHluYW1pY0xheW91dFZlcnRleEFycmF5KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEF3a3dhcmQuLi4gYnV0IHdlJ3JlIGNvdW50aW5nIG9uIHRoZSBwYWlyZWQgXCJ2ZXJ0aWNhbFwiIHN5bWJvbCBjb21pbmcgaW1tZWRpYXRlbHkgYWZ0ZXIgaXRzIGhvcml6b250YWwgY291bnRlcnBhcnRcbiAgICAgICAgdXNlVmVydGljYWwgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBhbmNob3JQb3MgPSBbc3ltYm9sLmFuY2hvclgsIHN5bWJvbC5hbmNob3JZLCAwLCAxXTtcbiAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KGFuY2hvclBvcywgYW5jaG9yUG9zLCBwb3NNYXRyaXgpO1xuXG4gICAgICAgIC8vIERvbid0IGJvdGhlciBjYWxjdWxhdGluZyB0aGUgY29ycmVjdCBwb2ludCBmb3IgaW52aXNpYmxlIGxhYmVscy5cbiAgICAgICAgaWYgKCFpc1Zpc2libGUoYW5jaG9yUG9zLCBjbGlwcGluZ0J1ZmZlcikpIHtcbiAgICAgICAgICAgIGhpZGVHbHlwaHMoc3ltYm9sLm51bUdseXBocywgZHluYW1pY0xheW91dFZlcnRleEFycmF5KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FtZXJhVG9BbmNob3JEaXN0YW5jZSA9IGFuY2hvclBvc1szXTtcbiAgICAgICAgY29uc3QgcGVyc3BlY3RpdmVSYXRpbyA9IDAuNSArIDAuNSAqIChjYW1lcmFUb0FuY2hvckRpc3RhbmNlIC8gcGFpbnRlci50cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSk7XG5cbiAgICAgICAgY29uc3QgZm9udFNpemUgPSBzeW1ib2xTaXplLmV2YWx1YXRlU2l6ZUZvckZlYXR1cmUoc2l6ZURhdGEsIHBhcnRpYWxseUV2YWx1YXRlZFNpemUsIHN5bWJvbCk7XG4gICAgICAgIGNvbnN0IHBpdGNoU2NhbGVkRm9udFNpemUgPSBwaXRjaFdpdGhNYXAgP1xuICAgICAgICAgICAgZm9udFNpemUgKiBwZXJzcGVjdGl2ZVJhdGlvIDpcbiAgICAgICAgICAgIGZvbnRTaXplIC8gcGVyc3BlY3RpdmVSYXRpbztcblxuICAgICAgICBjb25zdCB0aWxlQW5jaG9yUG9pbnQgPSBuZXcgUG9pbnQoc3ltYm9sLmFuY2hvclgsIHN5bWJvbC5hbmNob3JZKTtcbiAgICAgICAgY29uc3QgYW5jaG9yUG9pbnQgPSBwcm9qZWN0KHRpbGVBbmNob3JQb2ludCwgbGFiZWxQbGFuZU1hdHJpeCkucG9pbnQ7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb25DYWNoZSA9IHt9O1xuXG4gICAgICAgIGNvbnN0IHBsYWNlVW5mbGlwcGVkICAgICAgPSBwbGFjZUdseXBoc0Fsb25nTGluZShzeW1ib2wsIHBpdGNoU2NhbGVkRm9udFNpemUsIGZhbHNlIC8qdW5mbGlwcGVkKi8sIGtlZXBVcHJpZ2h0LCBwb3NNYXRyaXgsIGxhYmVsUGxhbmVNYXRyaXgsIGdsQ29vcmRNYXRyaXgsXG4gICAgICAgICAgICBidWNrZXQuZ2x5cGhPZmZzZXRBcnJheSwgbGluZVZlcnRleEFycmF5LCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXksIGFuY2hvclBvaW50LCB0aWxlQW5jaG9yUG9pbnQsIHByb2plY3Rpb25DYWNoZSwgYXNwZWN0UmF0aW8pO1xuXG4gICAgICAgIHVzZVZlcnRpY2FsID0gcGxhY2VVbmZsaXBwZWQudXNlVmVydGljYWw7XG5cbiAgICAgICAgaWYgKHBsYWNlVW5mbGlwcGVkLm5vdEVub3VnaFJvb20gfHwgdXNlVmVydGljYWwgfHxcbiAgICAgICAgICAgIChwbGFjZVVuZmxpcHBlZC5uZWVkc0ZsaXBwaW5nICYmXG4gICAgICAgICAgICAgcGxhY2VHbHlwaHNBbG9uZ0xpbmUoc3ltYm9sLCBwaXRjaFNjYWxlZEZvbnRTaXplLCB0cnVlIC8qZmxpcHBlZCovLCBrZWVwVXByaWdodCwgcG9zTWF0cml4LCBsYWJlbFBsYW5lTWF0cml4LCBnbENvb3JkTWF0cml4LFxuICAgICAgICAgICAgICAgICBidWNrZXQuZ2x5cGhPZmZzZXRBcnJheSwgbGluZVZlcnRleEFycmF5LCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXksIGFuY2hvclBvaW50LCB0aWxlQW5jaG9yUG9pbnQsIHByb2plY3Rpb25DYWNoZSwgYXNwZWN0UmF0aW8pLm5vdEVub3VnaFJvb20pKSB7XG4gICAgICAgICAgICBoaWRlR2x5cGhzKHN5bWJvbC5udW1HbHlwaHMsIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNUZXh0KSB7XG4gICAgICAgIGJ1Y2tldC50ZXh0LmR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1Y2tldC5pY29uLmR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcGxhY2VGaXJzdEFuZExhc3RHbHlwaChmb250U2NhbGUgICAgICAgICwgZ2x5cGhPZmZzZXRBcnJheSAgICAgICAgICAgICAgICAgICwgbGluZU9mZnNldFggICAgICAgICwgbGluZU9mZnNldFkgICAgICAgICwgZmxpcCAgICAgICAgICwgYW5jaG9yUG9pbnQgICAgICAgLCB0aWxlQW5jaG9yUG9pbnQgICAgICAgLCBzeW1ib2wgICAgICwgbGluZVZlcnRleEFycmF5ICAgICAgICAgICAgICAgICAgICAgICAsIGxhYmVsUGxhbmVNYXRyaXggICAgICAsIHByb2plY3Rpb25DYWNoZSAgICAgLCByZXR1cm5UaWxlRGlzdGFuY2UgICAgICAgICApIHtcbiAgICBjb25zdCBnbHlwaEVuZEluZGV4ID0gc3ltYm9sLmdseXBoU3RhcnRJbmRleCArIHN5bWJvbC5udW1HbHlwaHM7XG4gICAgY29uc3QgbGluZVN0YXJ0SW5kZXggPSBzeW1ib2wubGluZVN0YXJ0SW5kZXg7XG4gICAgY29uc3QgbGluZUVuZEluZGV4ID0gc3ltYm9sLmxpbmVTdGFydEluZGV4ICsgc3ltYm9sLmxpbmVMZW5ndGg7XG5cbiAgICBjb25zdCBmaXJzdEdseXBoT2Zmc2V0ID0gZ2x5cGhPZmZzZXRBcnJheS5nZXRvZmZzZXRYKHN5bWJvbC5nbHlwaFN0YXJ0SW5kZXgpO1xuICAgIGNvbnN0IGxhc3RHbHlwaE9mZnNldCA9IGdseXBoT2Zmc2V0QXJyYXkuZ2V0b2Zmc2V0WChnbHlwaEVuZEluZGV4IC0gMSk7XG5cbiAgICBjb25zdCBmaXJzdFBsYWNlZEdseXBoID0gcGxhY2VHbHlwaEFsb25nTGluZShmb250U2NhbGUgKiBmaXJzdEdseXBoT2Zmc2V0LCBsaW5lT2Zmc2V0WCwgbGluZU9mZnNldFksIGZsaXAsIGFuY2hvclBvaW50LCB0aWxlQW5jaG9yUG9pbnQsIHN5bWJvbC5zZWdtZW50LFxuICAgICAgICBsaW5lU3RhcnRJbmRleCwgbGluZUVuZEluZGV4LCBsaW5lVmVydGV4QXJyYXksIGxhYmVsUGxhbmVNYXRyaXgsIHByb2plY3Rpb25DYWNoZSwgcmV0dXJuVGlsZURpc3RhbmNlKTtcbiAgICBpZiAoIWZpcnN0UGxhY2VkR2x5cGgpXG4gICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgbGFzdFBsYWNlZEdseXBoID0gcGxhY2VHbHlwaEFsb25nTGluZShmb250U2NhbGUgKiBsYXN0R2x5cGhPZmZzZXQsIGxpbmVPZmZzZXRYLCBsaW5lT2Zmc2V0WSwgZmxpcCwgYW5jaG9yUG9pbnQsIHRpbGVBbmNob3JQb2ludCwgc3ltYm9sLnNlZ21lbnQsXG4gICAgICAgIGxpbmVTdGFydEluZGV4LCBsaW5lRW5kSW5kZXgsIGxpbmVWZXJ0ZXhBcnJheSwgbGFiZWxQbGFuZU1hdHJpeCwgcHJvamVjdGlvbkNhY2hlLCByZXR1cm5UaWxlRGlzdGFuY2UpO1xuICAgIGlmICghbGFzdFBsYWNlZEdseXBoKVxuICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB7IGZpcnN0OiBmaXJzdFBsYWNlZEdseXBoLCBsYXN0OiBsYXN0UGxhY2VkR2x5cGggfTtcbn1cblxuZnVuY3Rpb24gcmVxdWlyZXNPcmllbnRhdGlvbkNoYW5nZSh3cml0aW5nTW9kZSwgZmlyc3RQb2ludCwgbGFzdFBvaW50LCBhc3BlY3RSYXRpbykge1xuICAgIGlmICh3cml0aW5nTW9kZSA9PT0gV3JpdGluZ01vZGUuaG9yaXpvbnRhbCkge1xuICAgICAgICAvLyBPbiB0b3Agb2YgY2hvb3Npbmcgd2hldGhlciB0byBmbGlwLCBjaG9vc2Ugd2hldGhlciB0byByZW5kZXIgdGhpcyB2ZXJzaW9uIG9mIHRoZSBnbHlwaHMgb3IgdGhlIGFsdGVybmF0ZVxuICAgICAgICAvLyB2ZXJ0aWNhbCBnbHlwaHMuIFdlIGNhbid0IGp1c3QgZmlsdGVyIG91dCB2ZXJ0aWNhbCBnbHlwaHMgaW4gdGhlIGhvcml6b250YWwgcmFuZ2UgYmVjYXVzZSB0aGUgaG9yaXpvbnRhbFxuICAgICAgICAvLyBhbmQgdmVydGljYWwgdmVyc2lvbnMgY2FuIGhhdmUgc2xpZ2h0bHkgZGlmZmVyZW50IHByb2plY3Rpb25zIHdoaWNoIGNvdWxkIGxlYWQgdG8gYW5nbGVzIHdoZXJlIGJvdGggb3JcbiAgICAgICAgLy8gbmVpdGhlciBzaG93ZWQuXG4gICAgICAgIGNvbnN0IHJpc2UgPSBNYXRoLmFicyhsYXN0UG9pbnQueSAtIGZpcnN0UG9pbnQueSk7XG4gICAgICAgIGNvbnN0IHJ1biA9IE1hdGguYWJzKGxhc3RQb2ludC54IC0gZmlyc3RQb2ludC54KSAqIGFzcGVjdFJhdGlvO1xuICAgICAgICBpZiAocmlzZSA+IHJ1bikge1xuICAgICAgICAgICAgcmV0dXJuIHsgdXNlVmVydGljYWw6IHRydWUgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3cml0aW5nTW9kZSA9PT0gV3JpdGluZ01vZGUudmVydGljYWwgPyBmaXJzdFBvaW50LnkgPCBsYXN0UG9pbnQueSA6IGZpcnN0UG9pbnQueCA+IGxhc3RQb2ludC54KSB7XG4gICAgICAgIC8vIEluY2x1ZGVzIFwiaG9yaXpvbnRhbE9ubHlcIiBjYXNlIGZvciBsYWJlbHMgd2l0aG91dCB2ZXJ0aWNhbCBnbHlwaHNcbiAgICAgICAgcmV0dXJuIHsgbmVlZHNGbGlwcGluZzogdHJ1ZSB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBwbGFjZUdseXBoc0Fsb25nTGluZShzeW1ib2wsIGZvbnRTaXplLCBmbGlwLCBrZWVwVXByaWdodCwgcG9zTWF0cml4LCBsYWJlbFBsYW5lTWF0cml4LCBnbENvb3JkTWF0cml4LCBnbHlwaE9mZnNldEFycmF5LCBsaW5lVmVydGV4QXJyYXksIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSwgYW5jaG9yUG9pbnQsIHRpbGVBbmNob3JQb2ludCwgcHJvamVjdGlvbkNhY2hlLCBhc3BlY3RSYXRpbykge1xuICAgIGNvbnN0IGZvbnRTY2FsZSA9IGZvbnRTaXplIC8gMjQ7XG4gICAgY29uc3QgbGluZU9mZnNldFggPSBzeW1ib2wubGluZU9mZnNldFggKiBmb250U2l6ZTtcbiAgICBjb25zdCBsaW5lT2Zmc2V0WSA9IHN5bWJvbC5saW5lT2Zmc2V0WSAqIGZvbnRTaXplO1xuXG4gICAgbGV0IHBsYWNlZEdseXBocztcbiAgICBpZiAoc3ltYm9sLm51bUdseXBocyA+IDEpIHtcbiAgICAgICAgY29uc3QgZ2x5cGhFbmRJbmRleCA9IHN5bWJvbC5nbHlwaFN0YXJ0SW5kZXggKyBzeW1ib2wubnVtR2x5cGhzO1xuICAgICAgICBjb25zdCBsaW5lU3RhcnRJbmRleCA9IHN5bWJvbC5saW5lU3RhcnRJbmRleDtcbiAgICAgICAgY29uc3QgbGluZUVuZEluZGV4ID0gc3ltYm9sLmxpbmVTdGFydEluZGV4ICsgc3ltYm9sLmxpbmVMZW5ndGg7XG5cbiAgICAgICAgLy8gUGxhY2UgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdCBnbHlwaCBpbiB0aGUgbGFiZWwgZmlyc3QsIHNvIHdlIGNhbiBmaWd1cmUgb3V0XG4gICAgICAgIC8vIHRoZSBvdmVyYWxsIG9yaWVudGF0aW9uIG9mIHRoZSBsYWJlbCBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgbmVlZHMgdG8gYmUgZmxpcHBlZCBpbiBrZWVwVXByaWdodCBtb2RlXG4gICAgICAgIGNvbnN0IGZpcnN0QW5kTGFzdEdseXBoID0gcGxhY2VGaXJzdEFuZExhc3RHbHlwaChmb250U2NhbGUsIGdseXBoT2Zmc2V0QXJyYXksIGxpbmVPZmZzZXRYLCBsaW5lT2Zmc2V0WSwgZmxpcCwgYW5jaG9yUG9pbnQsIHRpbGVBbmNob3JQb2ludCwgc3ltYm9sLCBsaW5lVmVydGV4QXJyYXksIGxhYmVsUGxhbmVNYXRyaXgsIHByb2plY3Rpb25DYWNoZSwgZmFsc2UpO1xuICAgICAgICBpZiAoIWZpcnN0QW5kTGFzdEdseXBoKSB7XG4gICAgICAgICAgICByZXR1cm4geyBub3RFbm91Z2hSb29tOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3RQb2ludCA9IHByb2plY3QoZmlyc3RBbmRMYXN0R2x5cGguZmlyc3QucG9pbnQsIGdsQ29vcmRNYXRyaXgpLnBvaW50O1xuICAgICAgICBjb25zdCBsYXN0UG9pbnQgPSBwcm9qZWN0KGZpcnN0QW5kTGFzdEdseXBoLmxhc3QucG9pbnQsIGdsQ29vcmRNYXRyaXgpLnBvaW50O1xuXG4gICAgICAgIGlmIChrZWVwVXByaWdodCAmJiAhZmxpcCkge1xuICAgICAgICAgICAgY29uc3Qgb3JpZW50YXRpb25DaGFuZ2UgPSByZXF1aXJlc09yaWVudGF0aW9uQ2hhbmdlKHN5bWJvbC53cml0aW5nTW9kZSwgZmlyc3RQb2ludCwgbGFzdFBvaW50LCBhc3BlY3RSYXRpbyk7XG4gICAgICAgICAgICBpZiAob3JpZW50YXRpb25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZW50YXRpb25DaGFuZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwbGFjZWRHbHlwaHMgPSBbZmlyc3RBbmRMYXN0R2x5cGguZmlyc3RdO1xuICAgICAgICBmb3IgKGxldCBnbHlwaEluZGV4ID0gc3ltYm9sLmdseXBoU3RhcnRJbmRleCArIDE7IGdseXBoSW5kZXggPCBnbHlwaEVuZEluZGV4IC0gMTsgZ2x5cGhJbmRleCsrKSB7XG4gICAgICAgICAgICAvLyBTaW5jZSBmaXJzdCBhbmQgbGFzdCBnbHlwaCBmaXQgb24gdGhlIGxpbmUsIHdlJ3JlIHN1cmUgdGhhdCB0aGUgcmVzdCBvZiB0aGUgZ2x5cGhzIGNhbiBiZSBwbGFjZWRcbiAgICAgICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgICAgIHBsYWNlZEdseXBocy5wdXNoKHBsYWNlR2x5cGhBbG9uZ0xpbmUoZm9udFNjYWxlICogZ2x5cGhPZmZzZXRBcnJheS5nZXRvZmZzZXRYKGdseXBoSW5kZXgpLCBsaW5lT2Zmc2V0WCwgbGluZU9mZnNldFksIGZsaXAsIGFuY2hvclBvaW50LCB0aWxlQW5jaG9yUG9pbnQsIHN5bWJvbC5zZWdtZW50LFxuICAgICAgICAgICAgICAgIGxpbmVTdGFydEluZGV4LCBsaW5lRW5kSW5kZXgsIGxpbmVWZXJ0ZXhBcnJheSwgbGFiZWxQbGFuZU1hdHJpeCwgcHJvamVjdGlvbkNhY2hlLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICAgIHBsYWNlZEdseXBocy5wdXNoKGZpcnN0QW5kTGFzdEdseXBoLmxhc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE9ubHkgYSBzaW5nbGUgZ2x5cGggdG8gcGxhY2VcbiAgICAgICAgLy8gU28sIGRldGVybWluZSB3aGV0aGVyIHRvIGZsaXAgYmFzZWQgb24gcHJvamVjdGVkIGFuZ2xlIG9mIHRoZSBsaW5lIHNlZ21lbnQgaXQncyBvblxuICAgICAgICBpZiAoa2VlcFVwcmlnaHQgJiYgIWZsaXApIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBwcm9qZWN0KHRpbGVBbmNob3JQb2ludCwgcG9zTWF0cml4KS5wb2ludDtcbiAgICAgICAgICAgIGNvbnN0IHRpbGVWZXJ0ZXhJbmRleCA9IChzeW1ib2wubGluZVN0YXJ0SW5kZXggKyBzeW1ib2wuc2VnbWVudCArIDEpO1xuICAgICAgICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgICAgICAgY29uc3QgdGlsZVNlZ21lbnRFbmQgPSBuZXcgUG9pbnQobGluZVZlcnRleEFycmF5LmdldHgodGlsZVZlcnRleEluZGV4KSwgbGluZVZlcnRleEFycmF5LmdldHkodGlsZVZlcnRleEluZGV4KSk7XG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0ZWRWZXJ0ZXggPSBwcm9qZWN0KHRpbGVTZWdtZW50RW5kLCBwb3NNYXRyaXgpO1xuICAgICAgICAgICAgLy8gV2Uga25vdyB0aGUgYW5jaG9yIHdpbGwgYmUgaW4gdGhlIHZpZXdwb3J0LCBidXQgdGhlIGVuZCBvZiB0aGUgbGluZSBzZWdtZW50IG1heSBiZVxuICAgICAgICAgICAgLy8gYmVoaW5kIHRoZSBwbGFuZSBvZiB0aGUgY2FtZXJhLCBpbiB3aGljaCBjYXNlIHdlIGNhbiB1c2UgYSBwb2ludCBhdCBhbnkgYXJiaXRyYXJ5IChjbG9zZXIpXG4gICAgICAgICAgICAvLyBwb2ludCBvbiB0aGUgc2VnbWVudC5cbiAgICAgICAgICAgIGNvbnN0IGIgPSAocHJvamVjdGVkVmVydGV4LnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSA+IDApID9cbiAgICAgICAgICAgICAgICBwcm9qZWN0ZWRWZXJ0ZXgucG9pbnQgOlxuICAgICAgICAgICAgICAgIHByb2plY3RUcnVuY2F0ZWRMaW5lU2VnbWVudCh0aWxlQW5jaG9yUG9pbnQsIHRpbGVTZWdtZW50RW5kLCBhLCAxLCBwb3NNYXRyaXgpO1xuXG5cbiAgICAgICAgICAgIGNvbnN0IG9yaWVudGF0aW9uQ2hhbmdlID0gcmVxdWlyZXNPcmllbnRhdGlvbkNoYW5nZShzeW1ib2wud3JpdGluZ01vZGUsIGEsIGIsIGFzcGVjdFJhdGlvKTtcbiAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbkNoYW5nZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmllbnRhdGlvbkNoYW5nZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyAkRmxvd0ZpeE1lXG4gICAgICAgIGNvbnN0IHNpbmdsZUdseXBoID0gcGxhY2VHbHlwaEFsb25nTGluZShmb250U2NhbGUgKiBnbHlwaE9mZnNldEFycmF5LmdldG9mZnNldFgoc3ltYm9sLmdseXBoU3RhcnRJbmRleCksIGxpbmVPZmZzZXRYLCBsaW5lT2Zmc2V0WSwgZmxpcCwgYW5jaG9yUG9pbnQsIHRpbGVBbmNob3JQb2ludCwgc3ltYm9sLnNlZ21lbnQsXG4gICAgICAgICAgICBzeW1ib2wubGluZVN0YXJ0SW5kZXgsIHN5bWJvbC5saW5lU3RhcnRJbmRleCArIHN5bWJvbC5saW5lTGVuZ3RoLCBsaW5lVmVydGV4QXJyYXksIGxhYmVsUGxhbmVNYXRyaXgsIHByb2plY3Rpb25DYWNoZSwgZmFsc2UpO1xuICAgICAgICBpZiAoIXNpbmdsZUdseXBoKVxuICAgICAgICAgICAgcmV0dXJuIHsgbm90RW5vdWdoUm9vbTogdHJ1ZSB9O1xuXG4gICAgICAgIHBsYWNlZEdseXBocyA9IFtzaW5nbGVHbHlwaF07XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBnbHlwaCAgICAgIG9mIHBsYWNlZEdseXBocykge1xuICAgICAgICBhZGREeW5hbWljQXR0cmlidXRlcyhkeW5hbWljTGF5b3V0VmVydGV4QXJyYXksIGdseXBoLnBvaW50LCBnbHlwaC5hbmdsZSk7XG4gICAgfVxuICAgIHJldHVybiB7fTtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFRydW5jYXRlZExpbmVTZWdtZW50KHByZXZpb3VzVGlsZVBvaW50ICAgICAgICwgY3VycmVudFRpbGVQb2ludCAgICAgICAsIHByZXZpb3VzUHJvamVjdGVkUG9pbnQgICAgICAgLCBtaW5pbXVtTGVuZ3RoICAgICAgICAsIHByb2plY3Rpb25NYXRyaXggICAgICApIHtcbiAgICAvLyBXZSBhcmUgYXNzdW1pbmcgXCJwcmV2aW91c1RpbGVQb2ludFwiIHdvbid0IHByb2plY3QgdG8gYSBwb2ludCB3aXRoaW4gb25lIHVuaXQgb2YgdGhlIGNhbWVyYSBwbGFuZVxuICAgIC8vIElmIGl0IGRpZCwgdGhhdCB3b3VsZCBtZWFuIG91ciBsYWJlbCBleHRlbmRlZCBhbGwgdGhlIHdheSBvdXQgZnJvbSB3aXRoaW4gdGhlIHZpZXdwb3J0IHRvIGEgKHZlcnkgZGlzdGFudClcbiAgICAvLyBwb2ludCBuZWFyIHRoZSBwbGFuZSBvZiB0aGUgY2FtZXJhLiBXZSB3b3VsZG4ndCBiZSBhYmxlIHRvIHJlbmRlciB0aGUgbGFiZWwgYW55d2F5IG9uY2UgaXQgY3Jvc3NlZCB0aGVcbiAgICAvLyBwbGFuZSBvZiB0aGUgY2FtZXJhLlxuICAgIGNvbnN0IHByb2plY3RlZFVuaXRWZXJ0ZXggPSBwcm9qZWN0KHByZXZpb3VzVGlsZVBvaW50LmFkZChwcmV2aW91c1RpbGVQb2ludC5zdWIoY3VycmVudFRpbGVQb2ludCkuX3VuaXQoKSksIHByb2plY3Rpb25NYXRyaXgpLnBvaW50O1xuICAgIGNvbnN0IHByb2plY3RlZFVuaXRTZWdtZW50ID0gcHJldmlvdXNQcm9qZWN0ZWRQb2ludC5zdWIocHJvamVjdGVkVW5pdFZlcnRleCk7XG5cbiAgICByZXR1cm4gcHJldmlvdXNQcm9qZWN0ZWRQb2ludC5hZGQocHJvamVjdGVkVW5pdFNlZ21lbnQuX211bHQobWluaW11bUxlbmd0aCAvIHByb2plY3RlZFVuaXRTZWdtZW50Lm1hZygpKSk7XG59XG5cbmZ1bmN0aW9uIHBsYWNlR2x5cGhBbG9uZ0xpbmUob2Zmc2V0WCAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0WCAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0WSAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlwICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JQb2ludCAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVBbmNob3JQb2ludCAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclNlZ21lbnQgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0YXJ0SW5kZXggICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUVuZEluZGV4ICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVWZXJ0ZXhBcnJheSAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFBsYW5lTWF0cml4ICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uQ2FjaGUgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UaWxlRGlzdGFuY2UgICAgICAgICApIHtcblxuICAgIGNvbnN0IGNvbWJpbmVkT2Zmc2V0WCA9IGZsaXAgP1xuICAgICAgICBvZmZzZXRYIC0gbGluZU9mZnNldFggOlxuICAgICAgICBvZmZzZXRYICsgbGluZU9mZnNldFg7XG5cbiAgICBsZXQgZGlyID0gY29tYmluZWRPZmZzZXRYID4gMCA/IDEgOiAtMTtcblxuICAgIGxldCBhbmdsZSA9IDA7XG4gICAgaWYgKGZsaXApIHtcbiAgICAgICAgLy8gVGhlIGxhYmVsIG5lZWRzIHRvIGJlIGZsaXBwZWQgdG8ga2VlcCB0ZXh0IHVwcmlnaHQuXG4gICAgICAgIC8vIEl0ZXJhdGUgaW4gdGhlIHJldmVyc2UgZGlyZWN0aW9uLlxuICAgICAgICBkaXIgKj0gLTE7XG4gICAgICAgIGFuZ2xlID0gTWF0aC5QSTtcbiAgICB9XG5cbiAgICBpZiAoZGlyIDwgMCkgYW5nbGUgKz0gTWF0aC5QSTtcblxuICAgIGxldCBjdXJyZW50SW5kZXggPSBkaXIgPiAwID9cbiAgICAgICAgbGluZVN0YXJ0SW5kZXggKyBhbmNob3JTZWdtZW50IDpcbiAgICAgICAgbGluZVN0YXJ0SW5kZXggKyBhbmNob3JTZWdtZW50ICsgMTtcblxuICAgIGNvbnN0IGluaXRpYWxJbmRleCA9IGN1cnJlbnRJbmRleDtcbiAgICBsZXQgY3VycmVudCA9IGFuY2hvclBvaW50O1xuICAgIGxldCBwcmV2ID0gYW5jaG9yUG9pbnQ7XG4gICAgbGV0IGRpc3RhbmNlVG9QcmV2ID0gMDtcbiAgICBsZXQgY3VycmVudFNlZ21lbnREaXN0YW5jZSA9IDA7XG4gICAgY29uc3QgYWJzT2Zmc2V0WCA9IE1hdGguYWJzKGNvbWJpbmVkT2Zmc2V0WCk7XG5cbiAgICB3aGlsZSAoZGlzdGFuY2VUb1ByZXYgKyBjdXJyZW50U2VnbWVudERpc3RhbmNlIDw9IGFic09mZnNldFgpIHtcbiAgICAgICAgY3VycmVudEluZGV4ICs9IGRpcjtcblxuICAgICAgICAvLyBvZmZzZXQgZG9lcyBub3QgZml0IG9uIHRoZSBwcm9qZWN0ZWQgbGluZVxuICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgbGluZVN0YXJ0SW5kZXggfHwgY3VycmVudEluZGV4ID49IGxpbmVFbmRJbmRleClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHByZXYgPSBjdXJyZW50O1xuXG4gICAgICAgIGN1cnJlbnQgPSBwcm9qZWN0aW9uQ2FjaGVbY3VycmVudEluZGV4XTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFZlcnRleCA9IG5ldyBQb2ludChsaW5lVmVydGV4QXJyYXkuZ2V0eChjdXJyZW50SW5kZXgpLCBsaW5lVmVydGV4QXJyYXkuZ2V0eShjdXJyZW50SW5kZXgpKTtcbiAgICAgICAgICAgIGNvbnN0IHByb2plY3Rpb24gPSBwcm9qZWN0KGN1cnJlbnRWZXJ0ZXgsIGxhYmVsUGxhbmVNYXRyaXgpO1xuICAgICAgICAgICAgaWYgKHByb2plY3Rpb24uc2lnbmVkRGlzdGFuY2VGcm9tQ2FtZXJhID4gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwcm9qZWN0aW9uQ2FjaGVbY3VycmVudEluZGV4XSA9IHByb2plY3Rpb24ucG9pbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRoZSB2ZXJ0ZXggaXMgYmVoaW5kIHRoZSBwbGFuZSBvZiB0aGUgY2FtZXJhLCBzbyB3ZSBjYW4ndCBwcm9qZWN0IGl0XG4gICAgICAgICAgICAgICAgLy8gSW5zdGVhZCwgd2UnbGwgY3JlYXRlIGEgdmVydGV4IGFsb25nIHRoZSBsaW5lIHRoYXQncyBmYXIgZW5vdWdoIHRvIGluY2x1ZGUgdGhlIGdseXBoXG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNMaW5lVmVydGV4SW5kZXggPSBjdXJyZW50SW5kZXggLSBkaXI7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNUaWxlUG9pbnQgPSBkaXN0YW5jZVRvUHJldiA9PT0gMCA/XG4gICAgICAgICAgICAgICAgICAgIHRpbGVBbmNob3JQb2ludCA6XG4gICAgICAgICAgICAgICAgICAgIG5ldyBQb2ludChsaW5lVmVydGV4QXJyYXkuZ2V0eChwcmV2aW91c0xpbmVWZXJ0ZXhJbmRleCksIGxpbmVWZXJ0ZXhBcnJheS5nZXR5KHByZXZpb3VzTGluZVZlcnRleEluZGV4KSk7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgY2FjaGUgYmVjYXVzZSB0aGUgbmV3IHZlcnRleCBtaWdodCBub3QgYmUgZmFyIGVub3VnaCBvdXQgZm9yIGZ1dHVyZSBnbHlwaHMgb24gdGhlIHNhbWUgc2VnbWVudFxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwcm9qZWN0VHJ1bmNhdGVkTGluZVNlZ21lbnQocHJldmlvdXNUaWxlUG9pbnQsIGN1cnJlbnRWZXJ0ZXgsIHByZXYsIGFic09mZnNldFggLSBkaXN0YW5jZVRvUHJldiArIDEsIGxhYmVsUGxhbmVNYXRyaXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGlzdGFuY2VUb1ByZXYgKz0gY3VycmVudFNlZ21lbnREaXN0YW5jZTtcbiAgICAgICAgY3VycmVudFNlZ21lbnREaXN0YW5jZSA9IHByZXYuZGlzdChjdXJyZW50KTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcG9pbnQgaXMgb24gdGhlIGN1cnJlbnQgc2VnbWVudC4gSW50ZXJwb2xhdGUgdG8gZmluZCBpdC5cbiAgICBjb25zdCBzZWdtZW50SW50ZXJwb2xhdGlvblQgPSAoYWJzT2Zmc2V0WCAtIGRpc3RhbmNlVG9QcmV2KSAvIGN1cnJlbnRTZWdtZW50RGlzdGFuY2U7XG4gICAgY29uc3QgcHJldlRvQ3VycmVudCA9IGN1cnJlbnQuc3ViKHByZXYpO1xuICAgIGNvbnN0IHAgPSBwcmV2VG9DdXJyZW50Lm11bHQoc2VnbWVudEludGVycG9sYXRpb25UKS5fYWRkKHByZXYpO1xuXG4gICAgLy8gb2Zmc2V0IHRoZSBwb2ludCBmcm9tIHRoZSBsaW5lIHRvIHRleHQtb2Zmc2V0IGFuZCBpY29uLW9mZnNldFxuICAgIHAuX2FkZChwcmV2VG9DdXJyZW50Ll91bml0KCkuX3BlcnAoKS5fbXVsdChsaW5lT2Zmc2V0WSAqIGRpcikpO1xuXG4gICAgY29uc3Qgc2VnbWVudEFuZ2xlID0gYW5nbGUgKyBNYXRoLmF0YW4yKGN1cnJlbnQueSAtIHByZXYueSwgY3VycmVudC54IC0gcHJldi54KTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHBvaW50OiBwLFxuICAgICAgICBhbmdsZTogc2VnbWVudEFuZ2xlLFxuICAgICAgICB0aWxlRGlzdGFuY2U6IHJldHVyblRpbGVEaXN0YW5jZSA/XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJldlRpbGVEaXN0YW5jZTogKGN1cnJlbnRJbmRleCAtIGRpcikgPT09IGluaXRpYWxJbmRleCA/IDAgOiBsaW5lVmVydGV4QXJyYXkuZ2V0dGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3IoY3VycmVudEluZGV4IC0gZGlyKSxcbiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudFZpZXdwb3J0RGlzdGFuY2U6IGFic09mZnNldFggLSBkaXN0YW5jZVRvUHJldlxuICAgICAgICAgICAgfSA6IG51bGxcbiAgICB9O1xufVxuXG5jb25zdCBoaWRkZW5HbHlwaEF0dHJpYnV0ZXMgPSBuZXcgRmxvYXQzMkFycmF5KFstSW5maW5pdHksIC1JbmZpbml0eSwgMCwgLUluZmluaXR5LCAtSW5maW5pdHksIDAsIC1JbmZpbml0eSwgLUluZmluaXR5LCAwLCAtSW5maW5pdHksIC1JbmZpbml0eSwgMF0pO1xuXG4vLyBIaWRlIHRoZW0gYnkgbW92aW5nIHRoZW0gb2Zmc2NyZWVuLiBXZSBzdGlsbCBuZWVkIHRvIGFkZCB0aGVtIHRvIHRoZSBidWZmZXJcbi8vIGJlY2F1c2UgdGhlIGR5bmFtaWMgYnVmZmVyIGlzIHBhaXJlZCB3aXRoIGEgc3RhdGljIGJ1ZmZlciB0aGF0IGRvZXNuJ3QgZ2V0IHVwZGF0ZWQuXG5mdW5jdGlvbiBoaWRlR2x5cGhzKG51bSAgICAgICAgLCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtOyBpKyspIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gZHluYW1pY0xheW91dFZlcnRleEFycmF5Lmxlbmd0aDtcbiAgICAgICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5LnJlc2l6ZShvZmZzZXQgKyA0KTtcbiAgICAgICAgLy8gU2luY2UgYWxsIGhpZGRlbiBnbHlwaHMgaGF2ZSB0aGUgc2FtZSBhdHRyaWJ1dGVzLCB3ZSBjYW4gYnVpbGQgdXAgdGhlIGFycmF5IGZhc3RlciB3aXRoIGEgc2luZ2xlIGNhbGwgdG8gRmxvYXQzMkFycmF5LnNldFxuICAgICAgICAvLyBmb3IgZWFjaCBzZXQgb2YgZm91ciB2ZXJ0aWNlcywgaW5zdGVhZCBvZiBjYWxsaW5nIGFkZER5bmFtaWNBdHRyaWJ1dGVzIGZvciBlYWNoIHZlcnRleC5cbiAgICAgICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5LmZsb2F0MzIuc2V0KGhpZGRlbkdseXBoQXR0cmlidXRlcywgb2Zmc2V0ICogMyk7XG4gICAgfVxufVxuXG4vLyBGb3IgbGluZSBsYWJlbCBsYXlvdXQsIHdlJ3JlIG5vdCB1c2luZyB6IG91dHB1dCBhbmQgb3VyIHcgaW5wdXQgaXMgYWx3YXlzIDFcbi8vIFRoaXMgY3VzdG9tIG1hdHJpeCB0cmFuc2Zvcm1hdGlvbiBpZ25vcmVzIHRob3NlIGNvbXBvbmVudHMgdG8gbWFrZSBwcm9qZWN0aW9uIGZhc3RlclxuZnVuY3Rpb24geHlUcmFuc2Zvcm1NYXQ0KG91dCAgICAgICwgYSAgICAgICwgbSAgICAgICkge1xuICAgIGNvbnN0IHggPSBhWzBdLCB5ID0gYVsxXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bNF0gKiB5ICsgbVsxMl07XG4gICAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bMTNdO1xuICAgIG91dFszXSA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufVxuIiwiLy8gICAgICBcblxuY29uc3QgUG9pbnQgPSByZXF1aXJlKCdAbWFwYm94L3BvaW50LWdlb21ldHJ5Jyk7XG5jb25zdCB7R0xZUEhfUEJGX0JPUkRFUn0gPSByZXF1aXJlKCcuLi9zdHlsZS9wYXJzZV9nbHlwaF9wYmYnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGdldEljb25RdWFkcyxcbiAgICBnZXRHbHlwaFF1YWRzXG59O1xuXG4vKipcbiAqIEEgdGV4dHVyZWQgcXVhZCBmb3IgcmVuZGVyaW5nIGEgc2luZ2xlIGljb24gb3IgZ2x5cGguXG4gKlxuICogVGhlIHpvb20gcmFuZ2UgdGhlIGdseXBoIGNhbiBiZSBzaG93biBpcyBkZWZpbmVkIGJ5IG1pblNjYWxlIGFuZCBtYXhTY2FsZS5cbiAqXG4gKiBAcGFyYW0gdGwgVGhlIG9mZnNldCBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIGZyb20gdGhlIGFuY2hvci5cbiAqIEBwYXJhbSB0ciBUaGUgb2Zmc2V0IG9mIHRoZSB0b3AgcmlnaHQgY29ybmVyIGZyb20gdGhlIGFuY2hvci5cbiAqIEBwYXJhbSBibCBUaGUgb2Zmc2V0IG9mIHRoZSBib3R0b20gbGVmdCBjb3JuZXIgZnJvbSB0aGUgYW5jaG9yLlxuICogQHBhcmFtIGJyIFRoZSBvZmZzZXQgb2YgdGhlIGJvdHRvbSByaWdodCBjb3JuZXIgZnJvbSB0aGUgYW5jaG9yLlxuICogQHBhcmFtIHRleCBUaGUgdGV4dHVyZSBjb29yZGluYXRlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBcbiAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG4gICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBcblxuLyoqXG4gKiBDcmVhdGUgdGhlIHF1YWRzIHVzZWQgZm9yIHJlbmRlcmluZyBhbiBpY29uLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0SWNvblF1YWRzKGFuY2hvciAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlZEljb24gICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgIGxheWVyICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgIGFsb25nTGluZSAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZWRUZXh0ICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb3BlcnRpZXMgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAge1xuICAgIGNvbnN0IGltYWdlID0gc2hhcGVkSWNvbi5pbWFnZTtcbiAgICBjb25zdCBsYXlvdXQgPSBsYXllci5sYXlvdXQ7XG5cbiAgICAvLyBJZiB5b3UgaGF2ZSBhIDEwcHggaWNvbiB0aGF0IGlzbid0IHBlcmZlY3RseSBhbGlnbmVkIHRvIHRoZSBwaXhlbCBncmlkIGl0IHdpbGwgY292ZXIgMTEgYWN0dWFsXG4gICAgLy8gcGl4ZWxzLiBUaGUgcXVhZCBuZWVkcyB0byBiZSBwYWRkZWQgdG8gYWNjb3VudCBmb3IgdGhpcywgb3RoZXJ3aXNlIHRoZXknbGwgbG9vayBzbGlnaHRseSBjbGlwcGVkXG4gICAgLy8gb24gb25lIGVkZ2UgaW4gc29tZSBjYXNlcy5cbiAgICBjb25zdCBib3JkZXIgPSAxO1xuXG4gICAgY29uc3QgdG9wID0gc2hhcGVkSWNvbi50b3AgLSBib3JkZXIgLyBpbWFnZS5waXhlbFJhdGlvO1xuICAgIGNvbnN0IGxlZnQgPSBzaGFwZWRJY29uLmxlZnQgLSBib3JkZXIgLyBpbWFnZS5waXhlbFJhdGlvO1xuICAgIGNvbnN0IGJvdHRvbSA9IHNoYXBlZEljb24uYm90dG9tICsgYm9yZGVyIC8gaW1hZ2UucGl4ZWxSYXRpbztcbiAgICBjb25zdCByaWdodCA9IHNoYXBlZEljb24ucmlnaHQgKyBib3JkZXIgLyBpbWFnZS5waXhlbFJhdGlvO1xuICAgIGxldCB0bCwgdHIsIGJyLCBibDtcblxuICAgIC8vIHRleHQtZml0IG1vZGVcbiAgICBpZiAobGF5b3V0LmdldCgnaWNvbi10ZXh0LWZpdCcpICE9PSAnbm9uZScgJiYgc2hhcGVkVGV4dCkge1xuICAgICAgICBjb25zdCBpY29uV2lkdGggPSAocmlnaHQgLSBsZWZ0KSxcbiAgICAgICAgICAgIGljb25IZWlnaHQgPSAoYm90dG9tIC0gdG9wKSxcbiAgICAgICAgICAgIHNpemUgPSBsYXlvdXQuZ2V0KCd0ZXh0LXNpemUnKS5ldmFsdWF0ZShmZWF0dXJlKSAvIDI0LFxuICAgICAgICAgICAgdGV4dExlZnQgPSBzaGFwZWRUZXh0LmxlZnQgKiBzaXplLFxuICAgICAgICAgICAgdGV4dFJpZ2h0ID0gc2hhcGVkVGV4dC5yaWdodCAqIHNpemUsXG4gICAgICAgICAgICB0ZXh0VG9wID0gc2hhcGVkVGV4dC50b3AgKiBzaXplLFxuICAgICAgICAgICAgdGV4dEJvdHRvbSA9IHNoYXBlZFRleHQuYm90dG9tICogc2l6ZSxcbiAgICAgICAgICAgIHRleHRXaWR0aCA9IHRleHRSaWdodCAtIHRleHRMZWZ0LFxuICAgICAgICAgICAgdGV4dEhlaWdodCA9IHRleHRCb3R0b20gLSB0ZXh0VG9wLFxuICAgICAgICAgICAgcGFkVCA9IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQtcGFkZGluZycpWzBdLFxuICAgICAgICAgICAgcGFkUiA9IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQtcGFkZGluZycpWzFdLFxuICAgICAgICAgICAgcGFkQiA9IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQtcGFkZGluZycpWzJdLFxuICAgICAgICAgICAgcGFkTCA9IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQtcGFkZGluZycpWzNdLFxuICAgICAgICAgICAgb2Zmc2V0WSA9IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQnKSA9PT0gJ3dpZHRoJyA/ICh0ZXh0SGVpZ2h0IC0gaWNvbkhlaWdodCkgKiAwLjUgOiAwLFxuICAgICAgICAgICAgb2Zmc2V0WCA9IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQnKSA9PT0gJ2hlaWdodCcgPyAodGV4dFdpZHRoIC0gaWNvbldpZHRoKSAqIDAuNSA6IDAsXG4gICAgICAgICAgICB3aWR0aCA9IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQnKSA9PT0gJ3dpZHRoJyB8fCBsYXlvdXQuZ2V0KCdpY29uLXRleHQtZml0JykgPT09ICdib3RoJyA/IHRleHRXaWR0aCA6IGljb25XaWR0aCxcbiAgICAgICAgICAgIGhlaWdodCA9IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQnKSA9PT0gJ2hlaWdodCcgfHwgbGF5b3V0LmdldCgnaWNvbi10ZXh0LWZpdCcpID09PSAnYm90aCcgPyB0ZXh0SGVpZ2h0IDogaWNvbkhlaWdodDtcbiAgICAgICAgdGwgPSBuZXcgUG9pbnQodGV4dExlZnQgKyBvZmZzZXRYIC0gcGFkTCwgICAgICAgICB0ZXh0VG9wICsgb2Zmc2V0WSAtIHBhZFQpO1xuICAgICAgICB0ciA9IG5ldyBQb2ludCh0ZXh0TGVmdCArIG9mZnNldFggKyBwYWRSICsgd2lkdGgsIHRleHRUb3AgKyBvZmZzZXRZIC0gcGFkVCk7XG4gICAgICAgIGJyID0gbmV3IFBvaW50KHRleHRMZWZ0ICsgb2Zmc2V0WCArIHBhZFIgKyB3aWR0aCwgdGV4dFRvcCArIG9mZnNldFkgKyBwYWRCICsgaGVpZ2h0KTtcbiAgICAgICAgYmwgPSBuZXcgUG9pbnQodGV4dExlZnQgKyBvZmZzZXRYIC0gcGFkTCwgICAgICAgICB0ZXh0VG9wICsgb2Zmc2V0WSArIHBhZEIgKyBoZWlnaHQpO1xuICAgIC8vIE5vcm1hbCBpY29uIHNpemUgbW9kZVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRsID0gbmV3IFBvaW50KGxlZnQsIHRvcCk7XG4gICAgICAgIHRyID0gbmV3IFBvaW50KHJpZ2h0LCB0b3ApO1xuICAgICAgICBiciA9IG5ldyBQb2ludChyaWdodCwgYm90dG9tKTtcbiAgICAgICAgYmwgPSBuZXcgUG9pbnQobGVmdCwgYm90dG9tKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbmdsZSA9IGxheWVyLmxheW91dC5nZXQoJ2ljb24tcm90YXRlJykuZXZhbHVhdGUoZmVhdHVyZSkgKiBNYXRoLlBJIC8gMTgwO1xuXG4gICAgaWYgKGFuZ2xlKSB7XG4gICAgICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgIGNvcyA9IE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgICAgIG1hdHJpeCA9IFtjb3MsIC1zaW4sIHNpbiwgY29zXTtcblxuICAgICAgICB0bC5fbWF0TXVsdChtYXRyaXgpO1xuICAgICAgICB0ci5fbWF0TXVsdChtYXRyaXgpO1xuICAgICAgICBibC5fbWF0TXVsdChtYXRyaXgpO1xuICAgICAgICBici5fbWF0TXVsdChtYXRyaXgpO1xuICAgIH1cblxuICAgIC8vIEljb24gcXVhZCBpcyBwYWRkZWQsIHNvIHRleHR1cmUgY29vcmRpbmF0ZXMgYWxzbyBuZWVkIHRvIGJlIHBhZGRlZC5cbiAgICBjb25zdCB0ZXh0dXJlUmVjdCA9IHtcbiAgICAgICAgeDogaW1hZ2UudGV4dHVyZVJlY3QueCAtIGJvcmRlcixcbiAgICAgICAgeTogaW1hZ2UudGV4dHVyZVJlY3QueSAtIGJvcmRlcixcbiAgICAgICAgdzogaW1hZ2UudGV4dHVyZVJlY3QudyArIGJvcmRlciAqIDIsXG4gICAgICAgIGg6IGltYWdlLnRleHR1cmVSZWN0LmggKyBib3JkZXIgKiAyXG4gICAgfTtcblxuICAgIHJldHVybiBbe3RsLCB0ciwgYmwsIGJyLCB0ZXg6IHRleHR1cmVSZWN0LCB3cml0aW5nTW9kZTogdW5kZWZpbmVkLCBnbHlwaE9mZnNldDogWzAsIDBdfV07XG59XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBxdWFkcyB1c2VkIGZvciByZW5kZXJpbmcgYSB0ZXh0IGxhYmVsLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0R2x5cGhRdWFkcyhhbmNob3IgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgc2hhcGluZyAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgIGFsb25nTGluZSAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUHJvcGVydGllcyAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICB7XG5cbiAgICBjb25zdCBvbmVFbSA9IDI0O1xuICAgIGNvbnN0IHRleHRSb3RhdGUgPSBsYXllci5sYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0ZScpLmV2YWx1YXRlKGZlYXR1cmUpICogTWF0aC5QSSAvIDE4MDtcbiAgICBjb25zdCB0ZXh0T2Zmc2V0ID0gbGF5ZXIubGF5b3V0LmdldCgndGV4dC1vZmZzZXQnKS5ldmFsdWF0ZShmZWF0dXJlKS5tYXAoKHQpPT4gdCAqIG9uZUVtKTtcblxuICAgIGNvbnN0IHBvc2l0aW9uZWRHbHlwaHMgPSBzaGFwaW5nLnBvc2l0aW9uZWRHbHlwaHM7XG4gICAgY29uc3QgcXVhZHMgPSBbXTtcblxuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBwb3NpdGlvbmVkR2x5cGhzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uZWRHbHlwaCA9IHBvc2l0aW9uZWRHbHlwaHNba107XG4gICAgICAgIGNvbnN0IGdseXBoID0gcG9zaXRpb25zW3Bvc2l0aW9uZWRHbHlwaC5nbHlwaF07XG4gICAgICAgIGlmICghZ2x5cGgpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHJlY3QgPSBnbHlwaC5yZWN0O1xuICAgICAgICBpZiAoIXJlY3QpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIFRoZSByZWN0cyBoYXZlIGFuIGFkZGRpdGlvbmFsIGJ1ZmZlciB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGVpciBzaXplLlxuICAgICAgICBjb25zdCBnbHlwaFBhZGRpbmcgPSAxLjA7XG4gICAgICAgIGNvbnN0IHJlY3RCdWZmZXIgPSBHTFlQSF9QQkZfQk9SREVSICsgZ2x5cGhQYWRkaW5nO1xuXG4gICAgICAgIGNvbnN0IGhhbGZBZHZhbmNlID0gZ2x5cGgubWV0cmljcy5hZHZhbmNlIC8gMjtcblxuICAgICAgICBjb25zdCBnbHlwaE9mZnNldCA9IGFsb25nTGluZSA/XG4gICAgICAgICAgICBbcG9zaXRpb25lZEdseXBoLnggKyBoYWxmQWR2YW5jZSwgcG9zaXRpb25lZEdseXBoLnldIDpcbiAgICAgICAgICAgIFswLCAwXTtcblxuICAgICAgICBjb25zdCBidWlsdEluT2Zmc2V0ID0gYWxvbmdMaW5lID9cbiAgICAgICAgICAgIFswLCAwXSA6XG4gICAgICAgICAgICBbcG9zaXRpb25lZEdseXBoLnggKyBoYWxmQWR2YW5jZSArIHRleHRPZmZzZXRbMF0sIHBvc2l0aW9uZWRHbHlwaC55ICsgdGV4dE9mZnNldFsxXV07XG5cblxuICAgICAgICBjb25zdCB4MSA9IGdseXBoLm1ldHJpY3MubGVmdCAtIHJlY3RCdWZmZXIgLSBoYWxmQWR2YW5jZSArIGJ1aWx0SW5PZmZzZXRbMF07XG4gICAgICAgIGNvbnN0IHkxID0gLWdseXBoLm1ldHJpY3MudG9wIC0gcmVjdEJ1ZmZlciArIGJ1aWx0SW5PZmZzZXRbMV07XG4gICAgICAgIGNvbnN0IHgyID0geDEgKyByZWN0Lnc7XG4gICAgICAgIGNvbnN0IHkyID0geTEgKyByZWN0Lmg7XG5cbiAgICAgICAgY29uc3QgdGwgPSBuZXcgUG9pbnQoeDEsIHkxKTtcbiAgICAgICAgY29uc3QgdHIgPSBuZXcgUG9pbnQoeDIsIHkxKTtcbiAgICAgICAgY29uc3QgYmwgID0gbmV3IFBvaW50KHgxLCB5Mik7XG4gICAgICAgIGNvbnN0IGJyID0gbmV3IFBvaW50KHgyLCB5Mik7XG5cbiAgICAgICAgaWYgKGFsb25nTGluZSAmJiBwb3NpdGlvbmVkR2x5cGgudmVydGljYWwpIHtcbiAgICAgICAgICAgIC8vIFZlcnRpY2FsLXN1cHBvcnRpbmcgZ2x5cGhzIGFyZSBsYWlkIG91dCBpbiAyNHgyNCBwb2ludCBib3hlcyAoMSBzcXVhcmUgZW0pXG4gICAgICAgICAgICAvLyBJbiBob3Jpem9udGFsIG9yaWVudGF0aW9uLCB0aGUgeSB2YWx1ZXMgZm9yIGdseXBocyBhcmUgYmVsb3cgdGhlIG1pZGxpbmVcbiAgICAgICAgICAgIC8vIGFuZCB3ZSB1c2UgYSBcInlPZmZzZXRcIiBvZiAtMTcgdG8gcHVsbCB0aGVtIHVwIHRvIHRoZSBtaWRkbGUuXG4gICAgICAgICAgICAvLyBCeSByb3RhdGluZyBjb3VudGVyLWNsb2Nrd2lzZSBhcm91bmQgdGhlIHBvaW50IGF0IHRoZSBjZW50ZXIgb2YgdGhlIGxlZnRcbiAgICAgICAgICAgIC8vIGVkZ2Ugb2YgYSAyNHgyNCBsYXlvdXQgYm94IGNlbnRlcmVkIGJlbG93IHRoZSBtaWRsaW5lLCB3ZSBhbGlnbiB0aGUgY2VudGVyXG4gICAgICAgICAgICAvLyBvZiB0aGUgZ2x5cGhzIHdpdGggdGhlIGhvcml6b250YWwgbWlkbGluZSwgc28gdGhlIHlPZmZzZXQgaXMgbm8gbG9uZ2VyXG4gICAgICAgICAgICAvLyBuZWNlc3NhcnksIGJ1dCB3ZSBhbHNvIHB1bGwgdGhlIGdseXBoIHRvIHRoZSBsZWZ0IGFsb25nIHRoZSB4IGF4aXNcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlciA9IG5ldyBQb2ludCgtaGFsZkFkdmFuY2UsIGhhbGZBZHZhbmNlKTtcbiAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsUm90YXRpb24gPSAtTWF0aC5QSSAvIDI7XG4gICAgICAgICAgICBjb25zdCB4T2Zmc2V0Q29ycmVjdGlvbiA9IG5ldyBQb2ludCg1LCAwKTtcbiAgICAgICAgICAgIHRsLl9yb3RhdGVBcm91bmQodmVydGljYWxSb3RhdGlvbiwgY2VudGVyKS5fYWRkKHhPZmZzZXRDb3JyZWN0aW9uKTtcbiAgICAgICAgICAgIHRyLl9yb3RhdGVBcm91bmQodmVydGljYWxSb3RhdGlvbiwgY2VudGVyKS5fYWRkKHhPZmZzZXRDb3JyZWN0aW9uKTtcbiAgICAgICAgICAgIGJsLl9yb3RhdGVBcm91bmQodmVydGljYWxSb3RhdGlvbiwgY2VudGVyKS5fYWRkKHhPZmZzZXRDb3JyZWN0aW9uKTtcbiAgICAgICAgICAgIGJyLl9yb3RhdGVBcm91bmQodmVydGljYWxSb3RhdGlvbiwgY2VudGVyKS5fYWRkKHhPZmZzZXRDb3JyZWN0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0ZXh0Um90YXRlKSB7XG4gICAgICAgICAgICBjb25zdCBzaW4gPSBNYXRoLnNpbih0ZXh0Um90YXRlKSxcbiAgICAgICAgICAgICAgICBjb3MgPSBNYXRoLmNvcyh0ZXh0Um90YXRlKSxcbiAgICAgICAgICAgICAgICBtYXRyaXggPSBbY29zLCAtc2luLCBzaW4sIGNvc107XG5cbiAgICAgICAgICAgIHRsLl9tYXRNdWx0KG1hdHJpeCk7XG4gICAgICAgICAgICB0ci5fbWF0TXVsdChtYXRyaXgpO1xuICAgICAgICAgICAgYmwuX21hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgIGJyLl9tYXRNdWx0KG1hdHJpeCk7XG4gICAgICAgIH1cblxuICAgICAgICBxdWFkcy5wdXNoKHt0bCwgdHIsIGJsLCBiciwgdGV4OiByZWN0LCB3cml0aW5nTW9kZTogc2hhcGluZy53cml0aW5nTW9kZSwgZ2x5cGhPZmZzZXR9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcXVhZHM7XG59XG4iLCIvLyAgICAgIFxuXG5jb25zdCBzY3JpcHREZXRlY3Rpb24gPSByZXF1aXJlKCcuLi91dGlsL3NjcmlwdF9kZXRlY3Rpb24nKTtcbmNvbnN0IHZlcnRpY2FsaXplUHVuY3R1YXRpb24gPSByZXF1aXJlKCcuLi91dGlsL3ZlcnRpY2FsaXplX3B1bmN0dWF0aW9uJyk7XG5jb25zdCBydGxUZXh0UGx1Z2luID0gcmVxdWlyZSgnLi4vc291cmNlL3J0bF90ZXh0X3BsdWdpbicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNvbnN0IFdyaXRpbmdNb2RlID0ge1xuICAgIGhvcml6b250YWw6IDEsXG4gICAgdmVydGljYWw6IDIsXG4gICAgaG9yaXpvbnRhbE9ubHk6IDNcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHNoYXBlVGV4dCxcbiAgICBzaGFwZUljb24sXG4gICAgV3JpdGluZ01vZGVcbn07XG5cbi8vIFRoZSBwb3NpdGlvbiBvZiBhIGdseXBoIHJlbGF0aXZlIHRvIHRoZSB0ZXh0J3MgYW5jaG9yIHBvaW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICBcblxuLy8gQSBjb2xsZWN0aW9uIG9mIHBvc2l0aW9uZWQgZ2x5cGhzIGFuZCBzb21lIG1ldGFkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5mdW5jdGlvbiBicmVha0xpbmVzKHRleHQgICAgICAgICwgbGluZUJyZWFrUG9pbnRzICAgICAgICAgICAgICAgKSB7XG4gICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGZvciAoY29uc3QgbGluZUJyZWFrIG9mIGxpbmVCcmVha1BvaW50cykge1xuICAgICAgICBsaW5lcy5wdXNoKHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBsaW5lQnJlYWspKTtcbiAgICAgICAgc3RhcnQgPSBsaW5lQnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0IDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgbGluZXMucHVzaCh0ZXh0LnN1YnN0cmluZyhzdGFydCwgdGV4dC5sZW5ndGgpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpbmVzO1xufVxuXG5mdW5jdGlvbiBzaGFwZVRleHQodGV4dCAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgIGdseXBocyAgICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgbWF4V2lkdGggICAgICAgICxcbiAgICAgICAgICAgICAgICAgICBsaW5lSGVpZ2h0ICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgdGV4dEFuY2hvciAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgIHRleHRKdXN0aWZ5ICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICBzcGFjaW5nICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsSGVpZ2h0ICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgd3JpdGluZ01vZGUgICAgICAgKSAgICAgICAgICAgICAgICAgIHtcbiAgICBsZXQgbG9naWNhbElucHV0ID0gdGV4dC50cmltKCk7XG4gICAgaWYgKHdyaXRpbmdNb2RlID09PSBXcml0aW5nTW9kZS52ZXJ0aWNhbCkge1xuICAgICAgICBsb2dpY2FsSW5wdXQgPSB2ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uKGxvZ2ljYWxJbnB1dCk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9zaXRpb25lZEdseXBocyA9IFtdO1xuICAgIGNvbnN0IHNoYXBpbmcgPSB7XG4gICAgICAgIHBvc2l0aW9uZWRHbHlwaHMsXG4gICAgICAgIHRleHQ6IGxvZ2ljYWxJbnB1dCxcbiAgICAgICAgdG9wOiB0cmFuc2xhdGVbMV0sXG4gICAgICAgIGJvdHRvbTogdHJhbnNsYXRlWzFdLFxuICAgICAgICBsZWZ0OiB0cmFuc2xhdGVbMF0sXG4gICAgICAgIHJpZ2h0OiB0cmFuc2xhdGVbMF0sXG4gICAgICAgIHdyaXRpbmdNb2RlXG4gICAgfTtcblxuICAgIGxldCBsaW5lcyAgICAgICAgICAgICAgIDtcblxuICAgIGNvbnN0IHtwcm9jZXNzQmlkaXJlY3Rpb25hbFRleHR9ID0gcnRsVGV4dFBsdWdpbjtcbiAgICBpZiAocHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0KSB7XG4gICAgICAgIGxpbmVzID0gcHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0KGxvZ2ljYWxJbnB1dCwgZGV0ZXJtaW5lTGluZUJyZWFrcyhsb2dpY2FsSW5wdXQsIHNwYWNpbmcsIG1heFdpZHRoLCBnbHlwaHMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsaW5lcyA9IGJyZWFrTGluZXMobG9naWNhbElucHV0LCBkZXRlcm1pbmVMaW5lQnJlYWtzKGxvZ2ljYWxJbnB1dCwgc3BhY2luZywgbWF4V2lkdGgsIGdseXBocykpO1xuICAgIH1cblxuICAgIHNoYXBlTGluZXMoc2hhcGluZywgZ2x5cGhzLCBsaW5lcywgbGluZUhlaWdodCwgdGV4dEFuY2hvciwgdGV4dEp1c3RpZnksIHdyaXRpbmdNb2RlLCBzcGFjaW5nLCB2ZXJ0aWNhbEhlaWdodCk7XG5cbiAgICBpZiAoIXBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gc2hhcGluZztcbn1cblxuY29uc3Qgd2hpdGVzcGFjZSAgICAgICAgICAgICAgICAgICAgICA9IHtcbiAgICBbMHgwOV06IHRydWUsIC8vIHRhYlxuICAgIFsweDBhXTogdHJ1ZSwgLy8gbmV3bGluZVxuICAgIFsweDBiXTogdHJ1ZSwgLy8gdmVydGljYWwgdGFiXG4gICAgWzB4MGNdOiB0cnVlLCAvLyBmb3JtIGZlZWRcbiAgICBbMHgwZF06IHRydWUsIC8vIGNhcnJpYWdlIHJldHVyblxuICAgIFsweDIwXTogdHJ1ZSwgLy8gc3BhY2Vcbn07XG5cbmNvbnN0IGJyZWFrYWJsZSAgICAgICAgICAgICAgICAgICAgICA9IHtcbiAgICBbMHgwYV06ICAgdHJ1ZSwgLy8gbmV3bGluZVxuICAgIFsweDIwXTogICB0cnVlLCAvLyBzcGFjZVxuICAgIFsweDI2XTogICB0cnVlLCAvLyBhbXBlcnNhbmRcbiAgICBbMHgyOF06ICAgdHJ1ZSwgLy8gbGVmdCBwYXJlbnRoZXNpc1xuICAgIFsweDI5XTogICB0cnVlLCAvLyByaWdodCBwYXJlbnRoZXNpc1xuICAgIFsweDJiXTogICB0cnVlLCAvLyBwbHVzIHNpZ25cbiAgICBbMHgyZF06ICAgdHJ1ZSwgLy8gaHlwaGVuLW1pbnVzXG4gICAgWzB4MmZdOiAgIHRydWUsIC8vIHNvbGlkdXNcbiAgICBbMHhhZF06ICAgdHJ1ZSwgLy8gc29mdCBoeXBoZW5cbiAgICBbMHhiN106ICAgdHJ1ZSwgLy8gbWlkZGxlIGRvdFxuICAgIFsweDIwMGJdOiB0cnVlLCAvLyB6ZXJvLXdpZHRoIHNwYWNlXG4gICAgWzB4MjAxMF06IHRydWUsIC8vIGh5cGhlblxuICAgIFsweDIwMTNdOiB0cnVlLCAvLyBlbiBkYXNoXG4gICAgWzB4MjAyN106IHRydWUgIC8vIGludGVycHVuY3RcbiAgICAvLyBNYW55IG90aGVyIGNoYXJhY3RlcnMgbWF5IGJlIHJlYXNvbmFibGUgYnJlYWtwb2ludHNcbiAgICAvLyBDb25zaWRlciBcIm5ldXRyYWwgb3JpZW50YXRpb25cIiBjaGFyYWN0ZXJzIGF0IHNjcmlwdERldGVjdGlvbi5jaGFySGFzTmV1dHJhbFZlcnRpY2FsT3JpZW50YXRpb25cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzM2NThcbn07XG5cbmZ1bmN0aW9uIGRldGVybWluZUF2ZXJhZ2VMaW5lV2lkdGgobG9naWNhbElucHV0ICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmcgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGggICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgIGxldCB0b3RhbFdpZHRoID0gMDtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsb2dpY2FsSW5wdXQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGdseXBoID0gZ2x5cGhzW2xvZ2ljYWxJbnB1dC5jaGFyQ29kZUF0KGluZGV4KV07XG4gICAgICAgIGlmICghZ2x5cGgpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgdG90YWxXaWR0aCArPSBnbHlwaC5tZXRyaWNzLmFkdmFuY2UgKyBzcGFjaW5nO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVDb3VudCA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0b3RhbFdpZHRoIC8gbWF4V2lkdGgpKTtcbiAgICByZXR1cm4gdG90YWxXaWR0aCAvIGxpbmVDb3VudDtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlQmFkbmVzcyhsaW5lV2lkdGggICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0V2lkdGggICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuYWx0eSAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xhc3RCcmVhayAgICAgICAgICkge1xuICAgIGNvbnN0IHJhZ2dlZG5lc3MgPSBNYXRoLnBvdyhsaW5lV2lkdGggLSB0YXJnZXRXaWR0aCwgMik7XG4gICAgaWYgKGlzTGFzdEJyZWFrKSB7XG4gICAgICAgIC8vIEZhdm9yIGZpbmFscyBsaW5lcyBzaG9ydGVyIHRoYW4gYXZlcmFnZSBvdmVyIGxvbmdlciB0aGFuIGF2ZXJhZ2VcbiAgICAgICAgaWYgKGxpbmVXaWR0aCA8IHRhcmdldFdpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmFnZ2VkbmVzcyAvIDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmFnZ2VkbmVzcyAqIDI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmFnZ2VkbmVzcyArIE1hdGguYWJzKHBlbmFsdHkpICogcGVuYWx0eTtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlUGVuYWx0eShjb2RlUG9pbnQgICAgICAgICwgbmV4dENvZGVQb2ludCAgICAgICAgKSB7XG4gICAgbGV0IHBlbmFsdHkgPSAwO1xuICAgIC8vIEZvcmNlIGJyZWFrIG9uIG5ld2xpbmVcbiAgICBpZiAoY29kZVBvaW50ID09PSAweDBhKSB7XG4gICAgICAgIHBlbmFsdHkgLT0gMTAwMDA7XG4gICAgfVxuICAgIC8vIFBlbmFsaXplIG9wZW4gcGFyZW50aGVzaXMgYXQgZW5kIG9mIGxpbmVcbiAgICBpZiAoY29kZVBvaW50ID09PSAweDI4IHx8IGNvZGVQb2ludCA9PT0gMHhmZjA4KSB7XG4gICAgICAgIHBlbmFsdHkgKz0gNTA7XG4gICAgfVxuXG4gICAgLy8gUGVuYWxpemUgY2xvc2UgcGFyZW50aGVzaXMgYXQgYmVnaW5uaW5nIG9mIGxpbmVcbiAgICBpZiAobmV4dENvZGVQb2ludCA9PT0gMHgyOSB8fCBuZXh0Q29kZVBvaW50ID09PSAweGZmMDkpIHtcbiAgICAgICAgcGVuYWx0eSArPSA1MDtcbiAgICB9XG4gICAgcmV0dXJuIHBlbmFsdHk7XG59XG5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICBcblxuZnVuY3Rpb24gZXZhbHVhdGVCcmVhayhicmVha0luZGV4ICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrWCAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRXaWR0aCAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxCcmVha3MgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgcGVuYWx0eSAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICBpc0xhc3RCcmVhayAgICAgICAgICkgICAgICAgIHtcbiAgICAvLyBXZSBjb3VsZCBza2lwIGV2YWx1YXRpbmcgYnJlYWtzIHdoZXJlIHRoZSBsaW5lIGxlbmd0aCAoYnJlYWtYIC0gcHJpb3JCcmVhay54KSA+IG1heFdpZHRoXG4gICAgLy8gIC4uLmJ1dCBpbiBmYWN0IHdlIGFsbG93IGxpbmVzIGxvbmdlciB0aGFuIG1heFdpZHRoIChpZiB0aGVyZSdzIG5vIGJyZWFrIHBvaW50cylcbiAgICAvLyAgLi4uYW5kIHdoZW4gdGFyZ2V0V2lkdGggYW5kIG1heFdpZHRoIGFyZSBjbG9zZSwgc3RyaWN0bHkgZW5mb3JjaW5nIG1heFdpZHRoIGNhbiBnaXZlXG4gICAgLy8gICAgIG1vcmUgbG9wc2lkZWQgcmVzdWx0cy5cblxuICAgIGxldCBiZXN0UHJpb3JCcmVhayAgICAgICAgID0gbnVsbDtcbiAgICBsZXQgYmVzdEJyZWFrQmFkbmVzcyA9IGNhbGN1bGF0ZUJhZG5lc3MoYnJlYWtYLCB0YXJnZXRXaWR0aCwgcGVuYWx0eSwgaXNMYXN0QnJlYWspO1xuXG4gICAgZm9yIChjb25zdCBwb3RlbnRpYWxCcmVhayBvZiBwb3RlbnRpYWxCcmVha3MpIHtcbiAgICAgICAgY29uc3QgbGluZVdpZHRoID0gYnJlYWtYIC0gcG90ZW50aWFsQnJlYWsueDtcbiAgICAgICAgY29uc3QgYnJlYWtCYWRuZXNzID1cbiAgICAgICAgICAgIGNhbGN1bGF0ZUJhZG5lc3MobGluZVdpZHRoLCB0YXJnZXRXaWR0aCwgcGVuYWx0eSwgaXNMYXN0QnJlYWspICsgcG90ZW50aWFsQnJlYWsuYmFkbmVzcztcbiAgICAgICAgaWYgKGJyZWFrQmFkbmVzcyA8PSBiZXN0QnJlYWtCYWRuZXNzKSB7XG4gICAgICAgICAgICBiZXN0UHJpb3JCcmVhayA9IHBvdGVudGlhbEJyZWFrO1xuICAgICAgICAgICAgYmVzdEJyZWFrQmFkbmVzcyA9IGJyZWFrQmFkbmVzcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGluZGV4OiBicmVha0luZGV4LFxuICAgICAgICB4OiBicmVha1gsXG4gICAgICAgIHByaW9yQnJlYWs6IGJlc3RQcmlvckJyZWFrLFxuICAgICAgICBiYWRuZXNzOiBiZXN0QnJlYWtCYWRuZXNzXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gbGVhc3RCYWRCcmVha3MobGFzdExpbmVCcmVhayAgICAgICAgKSAgICAgICAgICAgICAgICB7XG4gICAgaWYgKCFsYXN0TGluZUJyZWFrKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIGxlYXN0QmFkQnJlYWtzKGxhc3RMaW5lQnJlYWsucHJpb3JCcmVhaykuY29uY2F0KGxhc3RMaW5lQnJlYWsuaW5kZXgpO1xufVxuXG5mdW5jdGlvbiBkZXRlcm1pbmVMaW5lQnJlYWtzKGxvZ2ljYWxJbnB1dCAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocyAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgIHtcbiAgICBpZiAoIW1heFdpZHRoKVxuICAgICAgICByZXR1cm4gW107XG5cbiAgICBpZiAoIWxvZ2ljYWxJbnB1dClcbiAgICAgICAgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgcG90ZW50aWFsTGluZUJyZWFrcyA9IFtdO1xuICAgIGNvbnN0IHRhcmdldFdpZHRoID0gZGV0ZXJtaW5lQXZlcmFnZUxpbmVXaWR0aChsb2dpY2FsSW5wdXQsIHNwYWNpbmcsIG1heFdpZHRoLCBnbHlwaHMpO1xuXG4gICAgbGV0IGN1cnJlbnRYID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9naWNhbElucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvZGVQb2ludCA9IGxvZ2ljYWxJbnB1dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBjb25zdCBnbHlwaCA9IGdseXBoc1tjb2RlUG9pbnRdO1xuXG4gICAgICAgIGlmIChnbHlwaCAmJiAhd2hpdGVzcGFjZVtjb2RlUG9pbnRdKVxuICAgICAgICAgICAgY3VycmVudFggKz0gZ2x5cGgubWV0cmljcy5hZHZhbmNlICsgc3BhY2luZztcblxuICAgICAgICAvLyBJZGVvZ3JhcGhpYyBjaGFyYWN0ZXJzLCBzcGFjZXMsIGFuZCB3b3JkLWJyZWFraW5nIHB1bmN0dWF0aW9uIHRoYXQgb2Z0ZW4gYXBwZWFyIHdpdGhvdXRcbiAgICAgICAgLy8gc3Vycm91bmRpbmcgc3BhY2VzLlxuICAgICAgICBpZiAoKGkgPCBsb2dpY2FsSW5wdXQubGVuZ3RoIC0gMSkgJiZcbiAgICAgICAgICAgIChicmVha2FibGVbY29kZVBvaW50XSB8fFxuICAgICAgICAgICAgICAgIHNjcmlwdERldGVjdGlvbi5jaGFyQWxsb3dzSWRlb2dyYXBoaWNCcmVha2luZyhjb2RlUG9pbnQpKSkge1xuXG4gICAgICAgICAgICBwb3RlbnRpYWxMaW5lQnJlYWtzLnB1c2goXG4gICAgICAgICAgICAgICAgZXZhbHVhdGVCcmVhayhcbiAgICAgICAgICAgICAgICAgICAgaSArIDEsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRYLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsTGluZUJyZWFrcyxcbiAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlUGVuYWx0eShjb2RlUG9pbnQsIGxvZ2ljYWxJbnB1dC5jaGFyQ29kZUF0KGkgKyAxKSksXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGVhc3RCYWRCcmVha3MoXG4gICAgICAgIGV2YWx1YXRlQnJlYWsoXG4gICAgICAgICAgICBsb2dpY2FsSW5wdXQubGVuZ3RoLFxuICAgICAgICAgICAgY3VycmVudFgsXG4gICAgICAgICAgICB0YXJnZXRXaWR0aCxcbiAgICAgICAgICAgIHBvdGVudGlhbExpbmVCcmVha3MsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgdHJ1ZSkpO1xufVxuXG5mdW5jdGlvbiBnZXRBbmNob3JBbGlnbm1lbnQoYW5jaG9yICAgICAgICAgICAgICApIHtcbiAgICBsZXQgaG9yaXpvbnRhbEFsaWduID0gMC41LCB2ZXJ0aWNhbEFsaWduID0gMC41O1xuXG4gICAgc3dpdGNoIChhbmNob3IpIHtcbiAgICBjYXNlICdyaWdodCc6XG4gICAgY2FzZSAndG9wLXJpZ2h0JzpcbiAgICBjYXNlICdib3R0b20tcmlnaHQnOlxuICAgICAgICBob3Jpem9udGFsQWxpZ24gPSAxO1xuICAgICAgICBicmVhaztcbiAgICBjYXNlICdsZWZ0JzpcbiAgICBjYXNlICd0b3AtbGVmdCc6XG4gICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICBob3Jpem9udGFsQWxpZ24gPSAwO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGFuY2hvcikge1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgY2FzZSAnYm90dG9tLXJpZ2h0JzpcbiAgICBjYXNlICdib3R0b20tbGVmdCc6XG4gICAgICAgIHZlcnRpY2FsQWxpZ24gPSAxO1xuICAgICAgICBicmVhaztcbiAgICBjYXNlICd0b3AnOlxuICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgY2FzZSAndG9wLWxlZnQnOlxuICAgICAgICB2ZXJ0aWNhbEFsaWduID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWduIH07XG59XG5cbmZ1bmN0aW9uIHNoYXBlTGluZXMoc2hhcGluZyAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGhzICAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgbGluZXMgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgdGV4dEFuY2hvciAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0SnVzdGlmeSAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRpbmdNb2RlICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgc3BhY2luZyAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbEhlaWdodCAgICAgICAgKSB7XG4gICAgLy8gdGhlIHkgb2Zmc2V0ICpzaG91bGQqIGJlIHBhcnQgb2YgdGhlIGZvbnQgbWV0YWRhdGFcbiAgICBjb25zdCB5T2Zmc2V0ID0gLTE3O1xuXG4gICAgbGV0IHggPSAwO1xuICAgIGxldCB5ID0geU9mZnNldDtcblxuICAgIGxldCBtYXhMaW5lTGVuZ3RoID0gMDtcbiAgICBjb25zdCBwb3NpdGlvbmVkR2x5cGhzID0gc2hhcGluZy5wb3NpdGlvbmVkR2x5cGhzO1xuXG4gICAgY29uc3QganVzdGlmeSA9XG4gICAgICAgIHRleHRKdXN0aWZ5ID09PSAncmlnaHQnID8gMSA6XG4gICAgICAgIHRleHRKdXN0aWZ5ID09PSAnbGVmdCcgPyAwIDogMC41O1xuXG4gICAgZm9yIChsZXQgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBsaW5lID0gbGluZS50cmltKCk7XG5cbiAgICAgICAgaWYgKCFsaW5lLmxlbmd0aCkge1xuICAgICAgICAgICAgeSArPSBsaW5lSGVpZ2h0OyAvLyBTdGlsbCBuZWVkIGEgbGluZSBmZWVkIGFmdGVyIGVtcHR5IGxpbmVcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGluZVN0YXJ0SW5kZXggPSBwb3NpdGlvbmVkR2x5cGhzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjb2RlUG9pbnQgPSBsaW5lLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICBjb25zdCBnbHlwaCA9IGdseXBoc1tjb2RlUG9pbnRdO1xuXG4gICAgICAgICAgICBpZiAoIWdseXBoKSBjb250aW51ZTtcblxuICAgICAgICAgICAgaWYgKCFzY3JpcHREZXRlY3Rpb24uY2hhckhhc1VwcmlnaHRWZXJ0aWNhbE9yaWVudGF0aW9uKGNvZGVQb2ludCkgfHwgd3JpdGluZ01vZGUgPT09IFdyaXRpbmdNb2RlLmhvcml6b250YWwpIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbmVkR2x5cGhzLnB1c2goe2dseXBoOiBjb2RlUG9pbnQsIHgsIHksIHZlcnRpY2FsOiBmYWxzZX0pO1xuICAgICAgICAgICAgICAgIHggKz0gZ2x5cGgubWV0cmljcy5hZHZhbmNlICsgc3BhY2luZztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25lZEdseXBocy5wdXNoKHtnbHlwaDogY29kZVBvaW50LCB4LCB5OiAwLCB2ZXJ0aWNhbDogdHJ1ZX0pO1xuICAgICAgICAgICAgICAgIHggKz0gdmVydGljYWxIZWlnaHQgKyBzcGFjaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBqdXN0aWZ5IGlmIHdlIHBsYWNlZCBhdCBsZWFzdCBvbmUgZ2x5cGhcbiAgICAgICAgaWYgKHBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoICE9PSBsaW5lU3RhcnRJbmRleCkge1xuICAgICAgICAgICAgY29uc3QgbGluZUxlbmd0aCA9IHggLSBzcGFjaW5nO1xuICAgICAgICAgICAgbWF4TGluZUxlbmd0aCA9IE1hdGgubWF4KGxpbmVMZW5ndGgsIG1heExpbmVMZW5ndGgpO1xuXG4gICAgICAgICAgICBqdXN0aWZ5TGluZShwb3NpdGlvbmVkR2x5cGhzLCBnbHlwaHMsIGxpbmVTdGFydEluZGV4LCBwb3NpdGlvbmVkR2x5cGhzLmxlbmd0aCAtIDEsIGp1c3RpZnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgeCA9IDA7XG4gICAgICAgIHkgKz0gbGluZUhlaWdodDtcbiAgICB9XG5cbiAgICBjb25zdCB7aG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWdufSA9IGdldEFuY2hvckFsaWdubWVudCh0ZXh0QW5jaG9yKTtcbiAgICBhbGlnbihwb3NpdGlvbmVkR2x5cGhzLCBqdXN0aWZ5LCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ24sIG1heExpbmVMZW5ndGgsIGxpbmVIZWlnaHQsIGxpbmVzLmxlbmd0aCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGJvdW5kaW5nIGJveFxuICAgIGNvbnN0IGhlaWdodCA9IGxpbmVzLmxlbmd0aCAqIGxpbmVIZWlnaHQ7XG5cbiAgICBzaGFwaW5nLnRvcCArPSAtdmVydGljYWxBbGlnbiAqIGhlaWdodDtcbiAgICBzaGFwaW5nLmJvdHRvbSA9IHNoYXBpbmcudG9wICsgaGVpZ2h0O1xuICAgIHNoYXBpbmcubGVmdCArPSAtaG9yaXpvbnRhbEFsaWduICogbWF4TGluZUxlbmd0aDtcbiAgICBzaGFwaW5nLnJpZ2h0ID0gc2hhcGluZy5sZWZ0ICsgbWF4TGluZUxlbmd0aDtcbn1cblxuLy8ganVzdGlmeSByaWdodCA9IDEsIGxlZnQgPSAwLCBjZW50ZXIgPSAwLjVcbmZ1bmN0aW9uIGp1c3RpZnlMaW5lKHBvc2l0aW9uZWRHbHlwaHMgICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICBnbHlwaHMgICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgc3RhcnQgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgIGVuZCAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAganVzdGlmeSAgICAgICAgICAgICApIHtcbiAgICBpZiAoIWp1c3RpZnkpXG4gICAgICAgIHJldHVybjtcblxuICAgIGNvbnN0IGdseXBoID0gZ2x5cGhzW3Bvc2l0aW9uZWRHbHlwaHNbZW5kXS5nbHlwaF07XG4gICAgaWYgKGdseXBoKSB7XG4gICAgICAgIGNvbnN0IGxhc3RBZHZhbmNlID0gZ2x5cGgubWV0cmljcy5hZHZhbmNlO1xuICAgICAgICBjb25zdCBsaW5lSW5kZW50ID0gKHBvc2l0aW9uZWRHbHlwaHNbZW5kXS54ICsgbGFzdEFkdmFuY2UpICoganVzdGlmeTtcblxuICAgICAgICBmb3IgKGxldCBqID0gc3RhcnQ7IGogPD0gZW5kOyBqKyspIHtcbiAgICAgICAgICAgIHBvc2l0aW9uZWRHbHlwaHNbal0ueCAtPSBsaW5lSW5kZW50O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhbGlnbihwb3NpdGlvbmVkR2x5cGhzICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAganVzdGlmeSAgICAgICAgLFxuICAgICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWduICAgICAgICAsXG4gICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWduICAgICAgICAsXG4gICAgICAgICAgICAgICBtYXhMaW5lTGVuZ3RoICAgICAgICAsXG4gICAgICAgICAgICAgICBsaW5lSGVpZ2h0ICAgICAgICAsXG4gICAgICAgICAgICAgICBsaW5lQ291bnQgICAgICAgICkge1xuICAgIGNvbnN0IHNoaWZ0WCA9IChqdXN0aWZ5IC0gaG9yaXpvbnRhbEFsaWduKSAqIG1heExpbmVMZW5ndGg7XG4gICAgY29uc3Qgc2hpZnRZID0gKC12ZXJ0aWNhbEFsaWduICogbGluZUNvdW50ICsgMC41KSAqIGxpbmVIZWlnaHQ7XG5cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgcG9zaXRpb25lZEdseXBoc1tqXS54ICs9IHNoaWZ0WDtcbiAgICAgICAgcG9zaXRpb25lZEdseXBoc1tqXS55ICs9IHNoaWZ0WTtcbiAgICB9XG59XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG4gIFxuXG5mdW5jdGlvbiBzaGFwZUljb24oaW1hZ2UgICAgICAgICAgICAgICAsIGljb25PZmZzZXQgICAgICAgICAgICAgICAgICAsIGljb25BbmNob3IgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgIHtcbiAgICBjb25zdCB7aG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWdufSA9IGdldEFuY2hvckFsaWdubWVudChpY29uQW5jaG9yKTtcbiAgICBjb25zdCBkeCA9IGljb25PZmZzZXRbMF07XG4gICAgY29uc3QgZHkgPSBpY29uT2Zmc2V0WzFdO1xuICAgIGNvbnN0IHgxID0gZHggLSBpbWFnZS5kaXNwbGF5U2l6ZVswXSAqIGhvcml6b250YWxBbGlnbjtcbiAgICBjb25zdCB4MiA9IHgxICsgaW1hZ2UuZGlzcGxheVNpemVbMF07XG4gICAgY29uc3QgeTEgPSBkeSAtIGltYWdlLmRpc3BsYXlTaXplWzFdICogdmVydGljYWxBbGlnbjtcbiAgICBjb25zdCB5MiA9IHkxICsgaW1hZ2UuZGlzcGxheVNpemVbMV07XG4gICAgcmV0dXJuIHtpbWFnZSwgdG9wOiB5MSwgYm90dG9tOiB5MiwgbGVmdDogeDEsIHJpZ2h0OiB4Mn07XG59XG4iLCIvLyAgICAgIFxuXG5jb25zdCBBbmNob3IgPSByZXF1aXJlKCcuL2FuY2hvcicpO1xuY29uc3QgZ2V0QW5jaG9ycyA9IHJlcXVpcmUoJy4vZ2V0X2FuY2hvcnMnKTtcbmNvbnN0IGNsaXBMaW5lID0gcmVxdWlyZSgnLi9jbGlwX2xpbmUnKTtcbmNvbnN0IE9wYWNpdHlTdGF0ZSA9IHJlcXVpcmUoJy4vb3BhY2l0eV9zdGF0ZScpO1xuY29uc3Qge3NoYXBlVGV4dCwgc2hhcGVJY29uLCBXcml0aW5nTW9kZX0gPSByZXF1aXJlKCcuL3NoYXBpbmcnKTtcbmNvbnN0IHtnZXRHbHlwaFF1YWRzLCBnZXRJY29uUXVhZHN9ID0gcmVxdWlyZSgnLi9xdWFkcycpO1xuY29uc3QgQ29sbGlzaW9uRmVhdHVyZSA9IHJlcXVpcmUoJy4vY29sbGlzaW9uX2ZlYXR1cmUnKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbmNvbnN0IHNjcmlwdERldGVjdGlvbiA9IHJlcXVpcmUoJy4uL3V0aWwvc2NyaXB0X2RldGVjdGlvbicpO1xuY29uc3QgZmluZFBvbGVPZkluYWNjZXNzaWJpbGl0eSA9IHJlcXVpcmUoJy4uL3V0aWwvZmluZF9wb2xlX29mX2luYWNjZXNzaWJpbGl0eScpO1xuY29uc3QgY2xhc3NpZnlSaW5ncyA9IHJlcXVpcmUoJy4uL3V0aWwvY2xhc3NpZnlfcmluZ3MnKTtcbmNvbnN0IEVYVEVOVCA9IHJlcXVpcmUoJy4uL2RhdGEvZXh0ZW50Jyk7XG5jb25zdCBTeW1ib2xCdWNrZXQgPSByZXF1aXJlKCcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0Jyk7XG5jb25zdCBFdmFsdWF0aW9uUGFyYW1ldGVycyA9IHJlcXVpcmUoJy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNvbnN0IFBvaW50ID0gcmVxdWlyZSgnQG1hcGJveC9wb2ludC1nZW9tZXRyeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBwZXJmb3JtU3ltYm9sTGF5b3V0XG59O1xuXG4vLyBUaGUgc3ltYm9sIGxheW91dCBwcm9jZXNzIG5lZWRzIGB0ZXh0LXNpemVgIGV2YWx1YXRlZCBhdCB1cCB0byBmaXZlIGRpZmZlcmVudCB6b29tIGxldmVscywgYW5kXG4vLyBgaWNvbi1zaXplYCBhdCB1cCB0byB0aHJlZTpcbi8vXG4vLyAgIDEuIGB0ZXh0LXNpemVgIGF0IHRoZSB6b29tIGxldmVsIG9mIHRoZSBidWNrZXQuIFVzZWQgdG8gY2FsY3VsYXRlIGEgcGVyLWZlYXR1cmUgc2l6ZSBmb3Igc291cmNlIGB0ZXh0LXNpemVgXG4vLyAgICAgICBleHByZXNzaW9ucywgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgYm94IGRpbWVuc2lvbnMgZm9yIGljb24tdGV4dC1maXQuXG4vLyAgIDIuIGBpY29uLXNpemVgIGF0IHRoZSB6b29tIGxldmVsIG9mIHRoZSBidWNrZXQuIFVzZWQgdG8gY2FsY3VsYXRlIGEgcGVyLWZlYXR1cmUgc2l6ZSBmb3Igc291cmNlIGBpY29uLXNpemVgXG4vLyAgICAgICBleHByZXNzaW9ucy5cbi8vICAgMy4gYHRleHQtc2l6ZWAgYW5kIGBpY29uLXNpemVgIGF0IHRoZSB6b29tIGxldmVsIG9mIHRoZSBidWNrZXQsIHBsdXMgb25lLiBVc2VkIHRvIGNhbGN1bGF0ZSBjb2xsaXNpb24gYm94ZXMuXG4vLyAgIDQuIGB0ZXh0LXNpemVgIGF0IHpvb20gbGV2ZWwgMTguIFVzZWQgZm9yIHNvbWV0aGluZyBsaW5lLXN5bWJvbC1wbGFjZW1lbnQtcmVsYXRlZC5cbi8vICAgNS4gIEZvciBjb21wb3NpdGUgYCotc2l6ZWAgZXhwcmVzc2lvbnM6IHR3byB6b29tIGxldmVscyBvZiBjdXJ2ZSBzdG9wcyB0aGF0IFwiY292ZXJcIiB0aGUgem9vbSBsZXZlbCBvZiB0aGVcbi8vICAgICAgIGJ1Y2tldC4gVGhlc2UgZ28gaW50byBhIHZlcnRleCBidWZmZXIgYW5kIGFyZSB1c2VkIGJ5IHRoZSBzaGFkZXIgdG8gaW50ZXJwb2xhdGUgdGhlIHNpemUgYXQgcmVuZGVyIHRpbWUuXG4vL1xuLy8gKDEpIGFuZCAoMikgYXJlIHN0b3JlZCBpbiBgYnVja2V0LmxheWVyc1swXS5sYXlvdXRgLiBUaGUgcmVtYWluZGVyIGFyZSBiZWxvdy5cbi8vXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBcblxuZnVuY3Rpb24gcGVyZm9ybVN5bWJvbExheW91dChidWNrZXQgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhNYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaFBvc2l0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNYXAgICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlUG9zaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Q29sbGlzaW9uQm94ZXMgICAgICAgICApIHtcbiAgICBidWNrZXQuY3JlYXRlQXJyYXlzKCk7XG4gICAgYnVja2V0LnN5bWJvbEluc3RhbmNlcyA9IFtdO1xuXG4gICAgY29uc3QgdGlsZVNpemUgPSA1MTIgKiBidWNrZXQub3ZlcnNjYWxpbmc7XG4gICAgYnVja2V0LnRpbGVQaXhlbFJhdGlvID0gRVhURU5UIC8gdGlsZVNpemU7XG4gICAgYnVja2V0LmNvbXBhcmVUZXh0ID0ge307XG4gICAgYnVja2V0Lmljb25zTmVlZExpbmVhciA9IGZhbHNlO1xuXG4gICAgY29uc3QgbGF5b3V0ID0gYnVja2V0LmxheWVyc1swXS5sYXlvdXQ7XG4gICAgY29uc3QgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXMgPSBidWNrZXQubGF5ZXJzWzBdLl91bmV2YWx1YXRlZExheW91dC5fdmFsdWVzO1xuXG4gICAgY29uc3Qgc2l6ZXMgPSB7fTtcblxuICAgIGlmIChidWNrZXQudGV4dFNpemVEYXRhLmZ1bmN0aW9uVHlwZSA9PT0gJ2NvbXBvc2l0ZScpIHtcbiAgICAgICAgY29uc3Qge21pbiwgbWF4fSA9IGJ1Y2tldC50ZXh0U2l6ZURhdGEuem9vbVJhbmdlO1xuICAgICAgICBzaXplcy5jb21wb3NpdGVUZXh0U2l6ZXMgPSBbXG4gICAgICAgICAgICB1bmV2YWx1YXRlZExheW91dFZhbHVlc1sndGV4dC1zaXplJ10ucG9zc2libHlFdmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMobWluKSksXG4gICAgICAgICAgICB1bmV2YWx1YXRlZExheW91dFZhbHVlc1sndGV4dC1zaXplJ10ucG9zc2libHlFdmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMobWF4KSlcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBpZiAoYnVja2V0Lmljb25TaXplRGF0YS5mdW5jdGlvblR5cGUgPT09ICdjb21wb3NpdGUnKSB7XG4gICAgICAgIGNvbnN0IHttaW4sIG1heH0gPSBidWNrZXQuaWNvblNpemVEYXRhLnpvb21SYW5nZTtcbiAgICAgICAgc2l6ZXMuY29tcG9zaXRlSWNvblNpemVzID0gW1xuICAgICAgICAgICAgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ2ljb24tc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKG1pbikpLFxuICAgICAgICAgICAgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ2ljb24tc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKG1heCkpXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgc2l6ZXMubGF5b3V0VGV4dFNpemUgPSB1bmV2YWx1YXRlZExheW91dFZhbHVlc1sndGV4dC1zaXplJ10ucG9zc2libHlFdmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMoYnVja2V0Lnpvb20gKyAxKSk7XG4gICAgc2l6ZXMubGF5b3V0SWNvblNpemUgPSB1bmV2YWx1YXRlZExheW91dFZhbHVlc1snaWNvbi1zaXplJ10ucG9zc2libHlFdmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMoYnVja2V0Lnpvb20gKyAxKSk7XG4gICAgc2l6ZXMudGV4dE1heFNpemUgPSB1bmV2YWx1YXRlZExheW91dFZhbHVlc1sndGV4dC1zaXplJ10ucG9zc2libHlFdmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMoMTgpKTtcblxuICAgIGNvbnN0IG9uZUVtID0gMjQ7XG4gICAgY29uc3QgbGluZUhlaWdodCA9IGxheW91dC5nZXQoJ3RleHQtbGluZS1oZWlnaHQnKSAqIG9uZUVtO1xuICAgIGNvbnN0IHRleHRBbG9uZ0xpbmUgPSBsYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnbWFwJyAmJiBsYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgPT09ICdsaW5lJztcbiAgICBjb25zdCBrZWVwVXByaWdodCA9IGxheW91dC5nZXQoJ3RleHQta2VlcC11cHJpZ2h0Jyk7XG5cblxuICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiBidWNrZXQuZmVhdHVyZXMpIHtcbiAgICAgICAgY29uc3QgZm9udHN0YWNrID0gbGF5b3V0LmdldCgndGV4dC1mb250JykuZXZhbHVhdGUoZmVhdHVyZSkuam9pbignLCcpO1xuICAgICAgICBjb25zdCBnbHlwaHMgPSBnbHlwaE1hcFtmb250c3RhY2tdIHx8IHt9O1xuICAgICAgICBjb25zdCBnbHlwaFBvc2l0aW9uTWFwID0gZ2x5cGhQb3NpdGlvbnNbZm9udHN0YWNrXSB8fCB7fTtcblxuICAgICAgICBjb25zdCBzaGFwZWRUZXh0T3JpZW50YXRpb25zID0ge307XG4gICAgICAgIGNvbnN0IHRleHQgPSBmZWF0dXJlLnRleHQ7XG4gICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICBjb25zdCBhbGxvd3NWZXJ0aWNhbFdyaXRpbmdNb2RlID0gc2NyaXB0RGV0ZWN0aW9uLmFsbG93c1ZlcnRpY2FsV3JpdGluZ01vZGUodGV4dCk7XG4gICAgICAgICAgICBjb25zdCB0ZXh0T2Zmc2V0ICAgICAgICAgICAgICAgICAgID0gKGxheW91dC5nZXQoJ3RleHQtb2Zmc2V0JykuZXZhbHVhdGUoZmVhdHVyZSkubWFwKCh0KT0+IHQgKiBvbmVFbSkgICAgICk7XG4gICAgICAgICAgICBjb25zdCBzcGFjaW5nID0gbGF5b3V0LmdldCgndGV4dC1sZXR0ZXItc3BhY2luZycpLmV2YWx1YXRlKGZlYXR1cmUpICogb25lRW07XG4gICAgICAgICAgICBjb25zdCBzcGFjaW5nSWZBbGxvd2VkID0gc2NyaXB0RGV0ZWN0aW9uLmFsbG93c0xldHRlclNwYWNpbmcodGV4dCkgPyBzcGFjaW5nIDogMDtcbiAgICAgICAgICAgIGNvbnN0IHRleHRBbmNob3IgPSBsYXlvdXQuZ2V0KCd0ZXh0LWFuY2hvcicpLmV2YWx1YXRlKGZlYXR1cmUpO1xuICAgICAgICAgICAgY29uc3QgdGV4dEp1c3RpZnkgPSBsYXlvdXQuZ2V0KCd0ZXh0LWp1c3RpZnknKS5ldmFsdWF0ZShmZWF0dXJlKTtcbiAgICAgICAgICAgIGNvbnN0IG1heFdpZHRoID0gbGF5b3V0LmdldCgnc3ltYm9sLXBsYWNlbWVudCcpICE9PSAnbGluZScgP1xuICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ3RleHQtbWF4LXdpZHRoJykuZXZhbHVhdGUoZmVhdHVyZSkgKiBvbmVFbSA6XG4gICAgICAgICAgICAgICAgMDtcblxuICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsID0gc2hhcGVUZXh0KHRleHQsIGdseXBocywgbWF4V2lkdGgsIGxpbmVIZWlnaHQsIHRleHRBbmNob3IsIHRleHRKdXN0aWZ5LCBzcGFjaW5nSWZBbGxvd2VkLCB0ZXh0T2Zmc2V0LCBvbmVFbSwgV3JpdGluZ01vZGUuaG9yaXpvbnRhbCk7XG4gICAgICAgICAgICBpZiAoYWxsb3dzVmVydGljYWxXcml0aW5nTW9kZSAmJiB0ZXh0QWxvbmdMaW5lICYmIGtlZXBVcHJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbCA9IHNoYXBlVGV4dCh0ZXh0LCBnbHlwaHMsIG1heFdpZHRoLCBsaW5lSGVpZ2h0LCB0ZXh0QW5jaG9yLCB0ZXh0SnVzdGlmeSwgc3BhY2luZ0lmQWxsb3dlZCwgdGV4dE9mZnNldCwgb25lRW0sIFdyaXRpbmdNb2RlLnZlcnRpY2FsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzaGFwZWRJY29uO1xuICAgICAgICBpZiAoZmVhdHVyZS5pY29uKSB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZSA9IGltYWdlTWFwW2ZlYXR1cmUuaWNvbl07XG4gICAgICAgICAgICBpZiAoaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICBzaGFwZWRJY29uID0gc2hhcGVJY29uKFxuICAgICAgICAgICAgICAgICAgICBpbWFnZVBvc2l0aW9uc1tmZWF0dXJlLmljb25dLFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXQuZ2V0KCdpY29uLW9mZnNldCcpLmV2YWx1YXRlKGZlYXR1cmUpLFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXQuZ2V0KCdpY29uLWFuY2hvcicpLmV2YWx1YXRlKGZlYXR1cmUpKTtcbiAgICAgICAgICAgICAgICBpZiAoYnVja2V0LnNkZkljb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0LnNkZkljb25zID0gaW1hZ2Uuc2RmO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVja2V0LnNkZkljb25zICE9PSBpbWFnZS5zZGYpIHtcbiAgICAgICAgICAgICAgICAgICAgdXRpbC53YXJuT25jZSgnU3R5bGUgc2hlZXQgd2FybmluZzogQ2Fubm90IG1peCBTREYgYW5kIG5vbi1TREYgaWNvbnMgaW4gb25lIGJ1ZmZlcicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW1hZ2UucGl4ZWxSYXRpbyAhPT0gYnVja2V0LnBpeGVsUmF0aW8pIHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0Lmljb25zTmVlZExpbmVhciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXlvdXQuZ2V0KCdpY29uLXJvdGF0ZScpLmNvbnN0YW50T3IoMSkgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0Lmljb25zTmVlZExpbmVhciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbCB8fCBzaGFwZWRJY29uKSB7XG4gICAgICAgICAgICBhZGRGZWF0dXJlKGJ1Y2tldCwgZmVhdHVyZSwgc2hhcGVkVGV4dE9yaWVudGF0aW9ucywgc2hhcGVkSWNvbiwgZ2x5cGhQb3NpdGlvbk1hcCwgc2l6ZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dDb2xsaXNpb25Cb3hlcykge1xuICAgICAgICBidWNrZXQuZ2VuZXJhdGVDb2xsaXNpb25EZWJ1Z0J1ZmZlcnMoKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBHaXZlbiBhIGZlYXR1cmUgYW5kIGl0cyBzaGFwZWQgdGV4dCBhbmQgaWNvbiBkYXRhLCBhZGQgYSAnc3ltYm9sXG4gKiBpbnN0YW5jZScgZm9yIGVhY2ggX3Bvc3NpYmxlXyBwbGFjZW1lbnQgb2YgdGhlIHN5bWJvbCBmZWF0dXJlLlxuICogKEF0IHJlbmRlciB0aW1lUGxhY2VTeW1ib2xzI3BsYWNlKCkgc2VsZWN0cyB3aGljaCBvZiB0aGVzZSBpbnN0YW5jZXMgdG9cbiAqIHNob3cgb3IgaGlkZSBiYXNlZCBvbiBjb2xsaXNpb25zIHdpdGggc3ltYm9scyBpbiBvdGhlciBsYXllcnMuKVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYWRkRmVhdHVyZShidWNrZXQgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZSAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9ucyAgICAgLFxuICAgICAgICAgICAgICAgICAgICBzaGFwZWRJY29uICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgIGdseXBoUG9zaXRpb25NYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgIHNpemVzICAgICAgICkge1xuICAgIGNvbnN0IGxheW91dFRleHRTaXplID0gc2l6ZXMubGF5b3V0VGV4dFNpemUuZXZhbHVhdGUoZmVhdHVyZSk7XG4gICAgY29uc3QgbGF5b3V0SWNvblNpemUgPSBzaXplcy5sYXlvdXRJY29uU2l6ZS5ldmFsdWF0ZShmZWF0dXJlKTtcblxuICAgIC8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGxhYmVscyB0aGF0IGp1bXAgYXJvdW5kIHdoZW4gem9vbWluZyB3ZSBuZWVkXG4gICAgLy8gdG8gdXNlIGEgdGV4dC1zaXplIHZhbHVlIHRoYXQgaXMgdGhlIHNhbWUgZm9yIGFsbCB6b29tIGxldmVscy5cbiAgICAvLyBidWNrZXQgY2FsY3VsYXRlcyB0ZXh0LXNpemUgYXQgYSBoaWdoIHpvb20gbGV2ZWwgc28gdGhhdCBhbGwgdGlsZXMgY2FuXG4gICAgLy8gdXNlIHRoZSBzYW1lIHZhbHVlIHdoZW4gY2FsY3VsYXRpbmcgYW5jaG9yIHBvc2l0aW9ucy5cbiAgICBsZXQgdGV4dE1heFNpemUgPSBzaXplcy50ZXh0TWF4U2l6ZS5ldmFsdWF0ZShmZWF0dXJlKTtcbiAgICBpZiAodGV4dE1heFNpemUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0ZXh0TWF4U2l6ZSA9IGxheW91dFRleHRTaXplO1xuICAgIH1cblxuICAgIGNvbnN0IGxheW91dCA9IGJ1Y2tldC5sYXllcnNbMF0ubGF5b3V0O1xuICAgIGNvbnN0IHRleHRPZmZzZXQgPSBsYXlvdXQuZ2V0KCd0ZXh0LW9mZnNldCcpLmV2YWx1YXRlKGZlYXR1cmUpO1xuICAgIGNvbnN0IGljb25PZmZzZXQgPSBsYXlvdXQuZ2V0KCdpY29uLW9mZnNldCcpLmV2YWx1YXRlKGZlYXR1cmUpO1xuXG4gICAgY29uc3QgZ2x5cGhTaXplID0gMjQsXG4gICAgICAgIGZvbnRTY2FsZSA9IGxheW91dFRleHRTaXplIC8gZ2x5cGhTaXplLFxuICAgICAgICB0ZXh0Qm94U2NhbGUgPSBidWNrZXQudGlsZVBpeGVsUmF0aW8gKiBmb250U2NhbGUsXG4gICAgICAgIHRleHRNYXhCb3hTY2FsZSA9IGJ1Y2tldC50aWxlUGl4ZWxSYXRpbyAqIHRleHRNYXhTaXplIC8gZ2x5cGhTaXplLFxuICAgICAgICBpY29uQm94U2NhbGUgPSBidWNrZXQudGlsZVBpeGVsUmF0aW8gKiBsYXlvdXRJY29uU2l6ZSxcbiAgICAgICAgc3ltYm9sTWluRGlzdGFuY2UgPSBidWNrZXQudGlsZVBpeGVsUmF0aW8gKiBsYXlvdXQuZ2V0KCdzeW1ib2wtc3BhY2luZycpLFxuICAgICAgICB0ZXh0UGFkZGluZyA9IGxheW91dC5nZXQoJ3RleHQtcGFkZGluZycpICogYnVja2V0LnRpbGVQaXhlbFJhdGlvLFxuICAgICAgICBpY29uUGFkZGluZyA9IGxheW91dC5nZXQoJ2ljb24tcGFkZGluZycpICogYnVja2V0LnRpbGVQaXhlbFJhdGlvLFxuICAgICAgICB0ZXh0TWF4QW5nbGUgPSBsYXlvdXQuZ2V0KCd0ZXh0LW1heC1hbmdsZScpIC8gMTgwICogTWF0aC5QSSxcbiAgICAgICAgdGV4dEFsb25nTGluZSA9IGxheW91dC5nZXQoJ3RleHQtcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdtYXAnICYmIGxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSA9PT0gJ2xpbmUnLFxuICAgICAgICBpY29uQWxvbmdMaW5lID0gbGF5b3V0LmdldCgnaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnQnKSA9PT0gJ21hcCcgJiYgbGF5b3V0LmdldCgnc3ltYm9sLXBsYWNlbWVudCcpID09PSAnbGluZScsXG4gICAgICAgIHN5bWJvbFBsYWNlbWVudCA9IGxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSxcbiAgICAgICAgdGV4dFJlcGVhdERpc3RhbmNlID0gc3ltYm9sTWluRGlzdGFuY2UgLyAyO1xuXG4gICAgY29uc3QgYWRkU3ltYm9sQXRBbmNob3IgPSAobGluZSwgYW5jaG9yKSA9PiB7XG4gICAgICAgIGlmIChhbmNob3IueCA8IDAgfHwgYW5jaG9yLnggPj0gRVhURU5UIHx8IGFuY2hvci55IDwgMCB8fCBhbmNob3IueSA+PSBFWFRFTlQpIHtcbiAgICAgICAgICAgIC8vIFN5bWJvbCBsYXllcnMgYXJlIGRyYXduIGFjcm9zcyB0aWxlIGJvdW5kYXJpZXMsIFdlIGZpbHRlciBvdXQgc3ltYm9sc1xuICAgICAgICAgICAgLy8gb3V0c2lkZSBvdXIgdGlsZSBib3VuZGFyaWVzICh3aGljaCBtYXkgYmUgaW5jbHVkZWQgaW4gdmVjdG9yIHRpbGUgYnVmZmVycylcbiAgICAgICAgICAgIC8vIHRvIHByZXZlbnQgZG91YmxlLWRyYXdpbmcgc3ltYm9scy5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMucHVzaChhZGRTeW1ib2woYnVja2V0LCBhbmNob3IsIGxpbmUsIHNoYXBlZFRleHRPcmllbnRhdGlvbnMsIHNoYXBlZEljb24sIGJ1Y2tldC5sYXllcnNbMF0sXG4gICAgICAgICAgICBidWNrZXQuY29sbGlzaW9uQm94QXJyYXksIGZlYXR1cmUuaW5kZXgsIGZlYXR1cmUuc291cmNlTGF5ZXJJbmRleCwgYnVja2V0LmluZGV4LFxuICAgICAgICAgICAgdGV4dEJveFNjYWxlLCB0ZXh0UGFkZGluZywgdGV4dEFsb25nTGluZSwgdGV4dE9mZnNldCxcbiAgICAgICAgICAgIGljb25Cb3hTY2FsZSwgaWNvblBhZGRpbmcsIGljb25BbG9uZ0xpbmUsIGljb25PZmZzZXQsXG4gICAgICAgICAgICB7em9vbTogYnVja2V0Lnpvb219LCBmZWF0dXJlLCBnbHlwaFBvc2l0aW9uTWFwLCBzaXplcykpO1xuICAgIH07XG5cbiAgICBpZiAoc3ltYm9sUGxhY2VtZW50ID09PSAnbGluZScpIHtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGNsaXBMaW5lKGZlYXR1cmUuZ2VvbWV0cnksIDAsIDAsIEVYVEVOVCwgRVhURU5UKSkge1xuICAgICAgICAgICAgY29uc3QgYW5jaG9ycyA9IGdldEFuY2hvcnMoXG4gICAgICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgICAgICBzeW1ib2xNaW5EaXN0YW5jZSxcbiAgICAgICAgICAgICAgICB0ZXh0TWF4QW5nbGUsXG4gICAgICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbCB8fCBzaGFwZWRUZXh0T3JpZW50YXRpb25zLmhvcml6b250YWwsXG4gICAgICAgICAgICAgICAgc2hhcGVkSWNvbixcbiAgICAgICAgICAgICAgICBnbHlwaFNpemUsXG4gICAgICAgICAgICAgICAgdGV4dE1heEJveFNjYWxlLFxuICAgICAgICAgICAgICAgIGJ1Y2tldC5vdmVyc2NhbGluZyxcbiAgICAgICAgICAgICAgICBFWFRFTlRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFuY2hvciBvZiBhbmNob3JzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hhcGVkVGV4dCA9IHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbDtcbiAgICAgICAgICAgICAgICBpZiAoIXNoYXBlZFRleHQgfHwgIWFuY2hvcklzVG9vQ2xvc2UoYnVja2V0LCBzaGFwZWRUZXh0LnRleHQsIHRleHRSZXBlYXREaXN0YW5jZSwgYW5jaG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRTeW1ib2xBdEFuY2hvcihsaW5lLCBhbmNob3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmVhdHVyZS50eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgZm9yIChjb25zdCBwb2x5Z29uIG9mIGNsYXNzaWZ5UmluZ3MoZmVhdHVyZS5nZW9tZXRyeSwgMCkpIHtcbiAgICAgICAgICAgIC8vIDE2IGhlcmUgcmVwcmVzZW50cyAyIHBpeGVsc1xuICAgICAgICAgICAgY29uc3QgcG9pID0gZmluZFBvbGVPZkluYWNjZXNzaWJpbGl0eShwb2x5Z29uLCAxNik7XG4gICAgICAgICAgICBhZGRTeW1ib2xBdEFuY2hvcihwb2x5Z29uWzBdLCBuZXcgQW5jaG9yKHBvaS54LCBwb2kueSwgMCkpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChmZWF0dXJlLnR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMzgwOFxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZmVhdHVyZS5nZW9tZXRyeSkge1xuICAgICAgICAgICAgYWRkU3ltYm9sQXRBbmNob3IobGluZSwgbmV3IEFuY2hvcihsaW5lWzBdLngsIGxpbmVbMF0ueSwgMCkpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChmZWF0dXJlLnR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBwb2ludHMgb2YgZmVhdHVyZS5nZW9tZXRyeSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiBwb2ludHMpIHtcbiAgICAgICAgICAgICAgICBhZGRTeW1ib2xBdEFuY2hvcihbcG9pbnRdLCBuZXcgQW5jaG9yKHBvaW50LngsIHBvaW50LnksIDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gYWRkVGV4dFZlcnRpY2VzKGJ1Y2tldCAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvciAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dCAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QWxvbmdMaW5lICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb3BlcnRpZXMgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRPZmZzZXQgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgbGluZUFycmF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nTW9kZSAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlZFRleHRTeW1ib2xJbmRpY2VzICAgICAgICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoUG9zaXRpb25NYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZXMgICAgICAgKSB7XG4gICAgY29uc3QgZ2x5cGhRdWFkcyA9IGdldEdseXBoUXVhZHMoYW5jaG9yLCBzaGFwZWRUZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLCB0ZXh0QWxvbmdMaW5lLCBnbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlLCBnbHlwaFBvc2l0aW9uTWFwKTtcblxuICAgIGNvbnN0IHNpemVEYXRhID0gYnVja2V0LnRleHRTaXplRGF0YTtcbiAgICBsZXQgdGV4dFNpemVEYXRhID0gbnVsbDtcblxuICAgIGlmIChzaXplRGF0YS5mdW5jdGlvblR5cGUgPT09ICdzb3VyY2UnKSB7XG4gICAgICAgIHRleHRTaXplRGF0YSA9IFtcbiAgICAgICAgICAgIDEwICogbGF5ZXIubGF5b3V0LmdldCgndGV4dC1zaXplJykuZXZhbHVhdGUoZmVhdHVyZSlcbiAgICAgICAgXTtcbiAgICB9IGVsc2UgaWYgKHNpemVEYXRhLmZ1bmN0aW9uVHlwZSA9PT0gJ2NvbXBvc2l0ZScpIHtcbiAgICAgICAgdGV4dFNpemVEYXRhID0gW1xuICAgICAgICAgICAgMTAgKiBzaXplcy5jb21wb3NpdGVUZXh0U2l6ZXNbMF0uZXZhbHVhdGUoZmVhdHVyZSksXG4gICAgICAgICAgICAxMCAqIHNpemVzLmNvbXBvc2l0ZVRleHRTaXplc1sxXS5ldmFsdWF0ZShmZWF0dXJlKVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIGJ1Y2tldC5hZGRTeW1ib2xzKFxuICAgICAgICBidWNrZXQudGV4dCxcbiAgICAgICAgZ2x5cGhRdWFkcyxcbiAgICAgICAgdGV4dFNpemVEYXRhLFxuICAgICAgICB0ZXh0T2Zmc2V0LFxuICAgICAgICB0ZXh0QWxvbmdMaW5lLFxuICAgICAgICBmZWF0dXJlLFxuICAgICAgICB3cml0aW5nTW9kZSxcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBsaW5lQXJyYXkubGluZVN0YXJ0SW5kZXgsXG4gICAgICAgIGxpbmVBcnJheS5saW5lTGVuZ3RoKTtcblxuICAgIC8vIFRoZSBwbGFjZWRTeW1ib2xBcnJheSBpcyB1c2VkIGF0IHJlbmRlciB0aW1lIGluIGRyYXdUaWxlU3ltYm9sc1xuICAgIC8vIFRoZXNlIGluZGljZXMgYWxsb3cgYWNjZXNzIHRvIHRoZSBhcnJheSBhdCBjb2xsaXNpb24gZGV0ZWN0aW9uIHRpbWVcbiAgICBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcy5wdXNoKGJ1Y2tldC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5Lmxlbmd0aCAtIDEpO1xuXG4gICAgcmV0dXJuIGdseXBoUXVhZHMubGVuZ3RoICogNDtcbn1cblxuXG4vKipcbiAqIEFkZCBhIHNpbmdsZSBsYWJlbCAmIGljb24gcGxhY2VtZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZFN5bWJvbChidWNrZXQgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICBhbmNob3IgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICBsaW5lICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9ucyAgICAgLFxuICAgICAgICAgICAgICAgICAgIHNoYXBlZEljb24gICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICBsYXllciAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheSAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgZmVhdHVyZUluZGV4ICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleCAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgIGJ1Y2tldEluZGV4ICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgdGV4dEJveFNjYWxlICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgdGV4dFBhZGRpbmcgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICB0ZXh0QWxvbmdMaW5lICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgIHRleHRPZmZzZXQgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgaWNvbkJveFNjYWxlICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgaWNvblBhZGRpbmcgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICBpY29uQWxvbmdMaW5lICAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgIGljb25PZmZzZXQgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgZ2xvYmFsUHJvcGVydGllcyAgICAgICAgLFxuICAgICAgICAgICAgICAgICAgIGZlYXR1cmUgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgZ2x5cGhQb3NpdGlvbk1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICBzaXplcyAgICAgICApIHtcbiAgICBjb25zdCBsaW5lQXJyYXkgPSBidWNrZXQuYWRkVG9MaW5lVmVydGV4QXJyYXkoYW5jaG9yLCBsaW5lKTtcblxuICAgIGxldCB0ZXh0Q29sbGlzaW9uRmVhdHVyZSwgaWNvbkNvbGxpc2lvbkZlYXR1cmU7XG5cbiAgICBsZXQgbnVtSWNvblZlcnRpY2VzID0gMDtcbiAgICBsZXQgbnVtR2x5cGhWZXJ0aWNlcyA9IDA7XG4gICAgbGV0IG51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcyA9IDA7XG4gICAgY29uc3Qga2V5ID0gc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsID8gc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsLnRleHQgOiAnJztcbiAgICBjb25zdCBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcyA9IFtdO1xuICAgIGlmIChzaGFwZWRUZXh0T3JpZW50YXRpb25zLmhvcml6b250YWwpIHtcbiAgICAgICAgLy8gQXMgYSBjb2xsaXNpb24gYXBwcm94aW1hdGlvbiwgd2UgY2FuIHVzZSBlaXRoZXIgdGhlIHZlcnRpY2FsIG9yIHRoZSBob3Jpem9udGFsIHZlcnNpb24gb2YgdGhlIGZlYXR1cmVcbiAgICAgICAgLy8gV2UncmUgY291bnRpbmcgb24gdGhlIHR3byB2ZXJzaW9ucyBoYXZpbmcgc2ltaWxhciBkaW1lbnNpb25zXG4gICAgICAgIHRleHRDb2xsaXNpb25GZWF0dXJlID0gbmV3IENvbGxpc2lvbkZlYXR1cmUoY29sbGlzaW9uQm94QXJyYXksIGxpbmUsIGFuY2hvciwgZmVhdHVyZUluZGV4LCBzb3VyY2VMYXllckluZGV4LCBidWNrZXRJbmRleCwgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsLCB0ZXh0Qm94U2NhbGUsIHRleHRQYWRkaW5nLCB0ZXh0QWxvbmdMaW5lLCBidWNrZXQub3ZlcnNjYWxpbmcpO1xuICAgICAgICBudW1HbHlwaFZlcnRpY2VzICs9IGFkZFRleHRWZXJ0aWNlcyhidWNrZXQsIGFuY2hvciwgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsLCBsYXllciwgdGV4dEFsb25nTGluZSwgZ2xvYmFsUHJvcGVydGllcywgZmVhdHVyZSwgdGV4dE9mZnNldCwgbGluZUFycmF5LCBzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsID8gV3JpdGluZ01vZGUuaG9yaXpvbnRhbCA6IFdyaXRpbmdNb2RlLmhvcml6b250YWxPbmx5LCBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcywgZ2x5cGhQb3NpdGlvbk1hcCwgc2l6ZXMpO1xuXG4gICAgICAgIGlmIChzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICBudW1WZXJ0aWNhbEdseXBoVmVydGljZXMgKz0gYWRkVGV4dFZlcnRpY2VzKGJ1Y2tldCwgYW5jaG9yLCBzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsLCBsYXllciwgdGV4dEFsb25nTGluZSwgZ2xvYmFsUHJvcGVydGllcywgZmVhdHVyZSwgdGV4dE9mZnNldCwgbGluZUFycmF5LCBXcml0aW5nTW9kZS52ZXJ0aWNhbCwgcGxhY2VkVGV4dFN5bWJvbEluZGljZXMsIGdseXBoUG9zaXRpb25NYXAsIHNpemVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRleHRCb3hTdGFydEluZGV4ID0gdGV4dENvbGxpc2lvbkZlYXR1cmUgPyB0ZXh0Q29sbGlzaW9uRmVhdHVyZS5ib3hTdGFydEluZGV4IDogYnVja2V0LmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aDtcbiAgICBjb25zdCB0ZXh0Qm94RW5kSW5kZXggPSB0ZXh0Q29sbGlzaW9uRmVhdHVyZSA/IHRleHRDb2xsaXNpb25GZWF0dXJlLmJveEVuZEluZGV4IDogYnVja2V0LmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aDtcblxuICAgIGlmIChzaGFwZWRJY29uKSB7XG4gICAgICAgIGNvbnN0IGljb25RdWFkcyA9IGdldEljb25RdWFkcyhhbmNob3IsIHNoYXBlZEljb24sIGxheWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25BbG9uZ0xpbmUsIHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlKTtcbiAgICAgICAgaWNvbkNvbGxpc2lvbkZlYXR1cmUgPSBuZXcgQ29sbGlzaW9uRmVhdHVyZShjb2xsaXNpb25Cb3hBcnJheSwgbGluZSwgYW5jaG9yLCBmZWF0dXJlSW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIGJ1Y2tldEluZGV4LCBzaGFwZWRJY29uLCBpY29uQm94U2NhbGUsIGljb25QYWRkaW5nLCAvKmFsaWduIGJveGVzIHRvIGxpbmUqL2ZhbHNlLCBidWNrZXQub3ZlcnNjYWxpbmcpO1xuXG4gICAgICAgIG51bUljb25WZXJ0aWNlcyA9IGljb25RdWFkcy5sZW5ndGggKiA0O1xuXG4gICAgICAgIGNvbnN0IHNpemVEYXRhID0gYnVja2V0Lmljb25TaXplRGF0YTtcbiAgICAgICAgbGV0IGljb25TaXplRGF0YSA9IG51bGw7XG5cbiAgICAgICAgaWYgKHNpemVEYXRhLmZ1bmN0aW9uVHlwZSA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgICAgIGljb25TaXplRGF0YSA9IFtcbiAgICAgICAgICAgICAgICAxMCAqIGxheWVyLmxheW91dC5nZXQoJ2ljb24tc2l6ZScpLmV2YWx1YXRlKGZlYXR1cmUpXG4gICAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2UgaWYgKHNpemVEYXRhLmZ1bmN0aW9uVHlwZSA9PT0gJ2NvbXBvc2l0ZScpIHtcbiAgICAgICAgICAgIGljb25TaXplRGF0YSA9IFtcbiAgICAgICAgICAgICAgICAxMCAqIHNpemVzLmNvbXBvc2l0ZUljb25TaXplc1swXS5ldmFsdWF0ZShmZWF0dXJlKSxcbiAgICAgICAgICAgICAgICAxMCAqIHNpemVzLmNvbXBvc2l0ZUljb25TaXplc1sxXS5ldmFsdWF0ZShmZWF0dXJlKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1Y2tldC5hZGRTeW1ib2xzKFxuICAgICAgICAgICAgYnVja2V0Lmljb24sXG4gICAgICAgICAgICBpY29uUXVhZHMsXG4gICAgICAgICAgICBpY29uU2l6ZURhdGEsXG4gICAgICAgICAgICBpY29uT2Zmc2V0LFxuICAgICAgICAgICAgaWNvbkFsb25nTGluZSxcbiAgICAgICAgICAgIGZlYXR1cmUsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIGxpbmVBcnJheS5saW5lU3RhcnRJbmRleCxcbiAgICAgICAgICAgIGxpbmVBcnJheS5saW5lTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBjb25zdCBpY29uQm94U3RhcnRJbmRleCA9IGljb25Db2xsaXNpb25GZWF0dXJlID8gaWNvbkNvbGxpc2lvbkZlYXR1cmUuYm94U3RhcnRJbmRleCA6IGJ1Y2tldC5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGg7XG4gICAgY29uc3QgaWNvbkJveEVuZEluZGV4ID0gaWNvbkNvbGxpc2lvbkZlYXR1cmUgPyBpY29uQ29sbGlzaW9uRmVhdHVyZS5ib3hFbmRJbmRleCA6IGJ1Y2tldC5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGg7XG5cbiAgICBpZiAoYnVja2V0LmdseXBoT2Zmc2V0QXJyYXkubGVuZ3RoID49IFN5bWJvbEJ1Y2tldC5NQVhfR0xZUEhTKSB1dGlsLndhcm5PbmNlKFwiVG9vIG1hbnkgZ2x5cGhzIGJlaW5nIHJlbmRlcmVkIGluIGEgdGlsZS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yOTA3XCIpO1xuXG4gICAgY29uc3QgdGV4dE9wYWNpdHlTdGF0ZSA9IG5ldyBPcGFjaXR5U3RhdGUoKTtcbiAgICBjb25zdCBpY29uT3BhY2l0eVN0YXRlID0gbmV3IE9wYWNpdHlTdGF0ZSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAga2V5LFxuICAgICAgICB0ZXh0Qm94U3RhcnRJbmRleCxcbiAgICAgICAgdGV4dEJveEVuZEluZGV4LFxuICAgICAgICBpY29uQm94U3RhcnRJbmRleCxcbiAgICAgICAgaWNvbkJveEVuZEluZGV4LFxuICAgICAgICB0ZXh0T2Zmc2V0LFxuICAgICAgICBpY29uT2Zmc2V0LFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIGxpbmUsXG4gICAgICAgIGZlYXR1cmVJbmRleCxcbiAgICAgICAgZmVhdHVyZSxcbiAgICAgICAgbnVtR2x5cGhWZXJ0aWNlcyxcbiAgICAgICAgbnVtVmVydGljYWxHbHlwaFZlcnRpY2VzLFxuICAgICAgICBudW1JY29uVmVydGljZXMsXG4gICAgICAgIHRleHRPcGFjaXR5U3RhdGUsXG4gICAgICAgIGljb25PcGFjaXR5U3RhdGUsXG4gICAgICAgIGlzRHVwbGljYXRlOiBmYWxzZSxcbiAgICAgICAgcGxhY2VkVGV4dFN5bWJvbEluZGljZXMsXG4gICAgICAgIGNyb3NzVGlsZUlEOiAwXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gYW5jaG9ySXNUb29DbG9zZShidWNrZXQgICAgICwgdGV4dCAgICAgICAgLCByZXBlYXREaXN0YW5jZSAgICAgICAgLCBhbmNob3IgICAgICAgKSB7XG4gICAgY29uc3QgY29tcGFyZVRleHQgPSBidWNrZXQuY29tcGFyZVRleHQ7XG4gICAgaWYgKCEodGV4dCBpbiBjb21wYXJlVGV4dCkpIHtcbiAgICAgICAgY29tcGFyZVRleHRbdGV4dF0gPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBvdGhlckFuY2hvcnMgPSBjb21wYXJlVGV4dFt0ZXh0XTtcbiAgICAgICAgZm9yIChsZXQgayA9IG90aGVyQW5jaG9ycy5sZW5ndGggLSAxOyBrID49IDA7IGstLSkge1xuICAgICAgICAgICAgaWYgKGFuY2hvci5kaXN0KG90aGVyQW5jaG9yc1trXSkgPCByZXBlYXREaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgIC8vIElmIGl0J3Mgd2l0aGluIHJlcGVhdERpc3RhbmNlIG9mIG9uZSBhbmNob3IsIHN0b3AgbG9va2luZ1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIGFuY2hvciBpcyBub3Qgd2l0aGluIHJlcGVhdERpc3RhbmNlIG9mIGFueSBvdGhlciBhbmNob3IsIGFkZCB0byBhcnJheVxuICAgIGNvbXBhcmVUZXh0W3RleHRdLnB1c2goYW5jaG9yKTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG4iLCIvLyAgICAgIFxuXG5jb25zdCB7bm9ybWFsaXplUHJvcGVydHlFeHByZXNzaW9ufSA9IHJlcXVpcmUoJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbicpO1xuY29uc3QgaW50ZXJwb2xhdGUgPSByZXF1aXJlKCcuLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGUnKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGdldFNpemVEYXRhLFxuICAgIGV2YWx1YXRlU2l6ZUZvckZlYXR1cmUsXG4gICAgZXZhbHVhdGVTaXplRm9yWm9vbVxufTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIFxuXG4vLyBGb3Ige3RleHQsaWNvbn0tc2l6ZSwgZ2V0IHRoZSBidWNrZXQtbGV2ZWwgZGF0YSB0aGF0IHdpbGwgYmUgbmVlZGVkIGJ5XG4vLyB0aGUgcGFpbnRlciB0byBzZXQgc3ltYm9sLXNpemUtcmVsYXRlZCB1bmlmb3Jtc1xuZnVuY3Rpb24gZ2V0U2l6ZURhdGEodGlsZVpvb20gICAgICAgICwgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICB7XG4gICAgY29uc3Qge2V4cHJlc3Npb259ID0gdmFsdWU7XG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZnVuY3Rpb25UeXBlOiAnY29uc3RhbnQnLFxuICAgICAgICAgICAgbGF5b3V0U2l6ZTogZXhwcmVzc2lvbi5ldmFsdWF0ZSh7em9vbTogdGlsZVpvb20gKyAxfSlcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uVHlwZTogJ3NvdXJjZSdcbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjYWxjdWxhdGUgY292ZXJpbmcgem9vbSBzdG9wcyBmb3Igem9vbS1kZXBlbmRlbnQgdmFsdWVzXG4gICAgICAgIGNvbnN0IGxldmVscyA9IGV4cHJlc3Npb24uem9vbVN0b3BzO1xuXG4gICAgICAgIGxldCBsb3dlciA9IDA7XG4gICAgICAgIHdoaWxlIChsb3dlciA8IGxldmVscy5sZW5ndGggJiYgbGV2ZWxzW2xvd2VyXSA8PSB0aWxlWm9vbSkgbG93ZXIrKztcbiAgICAgICAgbG93ZXIgPSBNYXRoLm1heCgwLCBsb3dlciAtIDEpO1xuICAgICAgICBsZXQgdXBwZXIgPSBsb3dlcjtcbiAgICAgICAgd2hpbGUgKHVwcGVyIDwgbGV2ZWxzLmxlbmd0aCAmJiBsZXZlbHNbdXBwZXJdIDwgdGlsZVpvb20gKyAxKSB1cHBlcisrO1xuICAgICAgICB1cHBlciA9IE1hdGgubWluKGxldmVscy5sZW5ndGggLSAxLCB1cHBlcik7XG5cbiAgICAgICAgY29uc3Qgem9vbVJhbmdlID0ge1xuICAgICAgICAgICAgbWluOiBsZXZlbHNbbG93ZXJdLFxuICAgICAgICAgICAgbWF4OiBsZXZlbHNbdXBwZXJdXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gV2UnZCBsaWtlIHRvIGJlIGFibGUgdG8gdXNlIENhbWVyYUV4cHJlc3Npb24gb3IgQ29tcG9zaXRlRXhwcmVzc2lvbiBpbiB0aGVzZVxuICAgICAgICAvLyByZXR1cm4gdHlwZXMgcmF0aGVyIHRoYW4gRXhwcmVzc2lvblNwZWNpZmljYXRpb24sIGJ1dCB0aGUgZm9ybWVyIGFyZSBub3RcbiAgICAgICAgLy8gdHJhbnNmZXJyYWJsZSBhY3Jvc3MgV2ViIFdvcmtlciBib3VuZGFyaWVzLlxuICAgICAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09PSAnY29tcG9zaXRlJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvblR5cGU6ICdjb21wb3NpdGUnLFxuICAgICAgICAgICAgICAgIHpvb21SYW5nZSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlOiAodmFsdWUudmFsdWUgICAgIClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBmb3IgY2FtZXJhIGZ1bmN0aW9ucywgYWxzbyBzYXZlIG9mZiB0aGUgZnVuY3Rpb24gdmFsdWVzXG4gICAgICAgICAgICAvLyBldmFsdWF0ZWQgYXQgdGhlIGNvdmVyaW5nIHpvb20gbGV2ZWxzXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uVHlwZTogJ2NhbWVyYScsXG4gICAgICAgICAgICAgICAgbGF5b3V0U2l6ZTogZXhwcmVzc2lvbi5ldmFsdWF0ZSh7em9vbTogdGlsZVpvb20gKyAxfSksXG4gICAgICAgICAgICAgICAgem9vbVJhbmdlLFxuICAgICAgICAgICAgICAgIHNpemVSYW5nZToge1xuICAgICAgICAgICAgICAgICAgICBtaW46IGV4cHJlc3Npb24uZXZhbHVhdGUoe3pvb206IHpvb21SYW5nZS5taW59KSxcbiAgICAgICAgICAgICAgICAgICAgbWF4OiBleHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOiB6b29tUmFuZ2UubWF4fSlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWU6ICh2YWx1ZS52YWx1ZSAgICAgKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZXZhbHVhdGVTaXplRm9yRmVhdHVyZShzaXplRGF0YSAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxseUV2YWx1YXRlZFNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICBjb25zdCBwYXJ0ID0gcGFydGlhbGx5RXZhbHVhdGVkU2l6ZTtcbiAgICBpZiAoc2l6ZURhdGEuZnVuY3Rpb25UeXBlID09PSAnc291cmNlJykge1xuICAgICAgICByZXR1cm4gc3ltYm9sLmxvd2VyU2l6ZSAvIDEwO1xuICAgIH0gZWxzZSBpZiAoc2l6ZURhdGEuZnVuY3Rpb25UeXBlID09PSAnY29tcG9zaXRlJykge1xuICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUubnVtYmVyKHN5bWJvbC5sb3dlclNpemUgLyAxMCwgc3ltYm9sLnVwcGVyU2l6ZSAvIDEwLCBwYXJ0LnVTaXplVCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBhcnQudVNpemU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBldmFsdWF0ZVNpemVGb3Jab29tKHNpemVEYXRhICAgICAgICAgICwgY3VycmVudFpvb20gICAgICAgICwgcHJvcGVydHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgaWYgKHNpemVEYXRhLmZ1bmN0aW9uVHlwZSA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdVNpemVUOiAwLFxuICAgICAgICAgICAgdVNpemU6IHNpemVEYXRhLmxheW91dFNpemVcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHNpemVEYXRhLmZ1bmN0aW9uVHlwZSA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVTaXplVDogMCxcbiAgICAgICAgICAgIHVTaXplOiAwXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChzaXplRGF0YS5mdW5jdGlvblR5cGUgPT09ICdjYW1lcmEnKSB7XG4gICAgICAgIGNvbnN0IHtwcm9wZXJ0eVZhbHVlLCB6b29tUmFuZ2UsIHNpemVSYW5nZX0gPSBzaXplRGF0YTtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9ICgobm9ybWFsaXplUHJvcGVydHlFeHByZXNzaW9uKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5LnNwZWNpZmljYXRpb24pICAgICApICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAvLyBFdmVuIHRob3VnaCB3ZSBjb3VsZCBnZXQgdGhlIGV4YWN0IHZhbHVlIG9mIHRoZSBjYW1lcmEgZnVuY3Rpb25cbiAgICAgICAgLy8gYXQgeiA9IHRyLnpvb20sIHdlIGludGVudGlvbmFsbHkgZG8gbm90OiBpbnN0ZWFkLCB3ZSBpbnRlcnBvbGF0ZVxuICAgICAgICAvLyBiZXR3ZWVuIHRoZSBjYW1lcmEgZnVuY3Rpb24gdmFsdWVzIGF0IGEgcGFpciBvZiB6b29tIHN0b3BzIGNvdmVyaW5nXG4gICAgICAgIC8vIFt0aWxlWm9vbSwgdGlsZVpvb20gKyAxXSBpbiBvcmRlciB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhpc1xuICAgICAgICAvLyByZXN0cmljdGlvbiBvbiBjb21wb3NpdGUgZnVuY3Rpb25zXG4gICAgICAgIGNvbnN0IHQgPSB1dGlsLmNsYW1wKFxuICAgICAgICAgICAgZXhwcmVzc2lvbi5pbnRlcnBvbGF0aW9uRmFjdG9yKGN1cnJlbnRab29tLCB6b29tUmFuZ2UubWluLCB6b29tUmFuZ2UubWF4KSxcbiAgICAgICAgICAgIDAsIDEpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1U2l6ZVQ6IDAsXG4gICAgICAgICAgICB1U2l6ZTogc2l6ZVJhbmdlLm1pbiArIHQgKiAoc2l6ZVJhbmdlLm1heCAtIHNpemVSYW5nZS5taW4pXG4gICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qge3Byb3BlcnR5VmFsdWUsIHpvb21SYW5nZX0gPSBzaXplRGF0YTtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9ICgobm9ybWFsaXplUHJvcGVydHlFeHByZXNzaW9uKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5LnNwZWNpZmljYXRpb24pICAgICApICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdVNpemVUOiB1dGlsLmNsYW1wKGV4cHJlc3Npb24uaW50ZXJwb2xhdGlvbkZhY3RvcihjdXJyZW50Wm9vbSwgem9vbVJhbmdlLm1pbiwgem9vbVJhbmdlLm1heCksIDAsIDEpLFxuICAgICAgICAgICAgdVNpemU6IDBcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCIvLyAgICAgIFxuXG5jb25zdCBydGxUZXh0UGx1Z2luID0gcmVxdWlyZSgnLi4vc291cmNlL3J0bF90ZXh0X3BsdWdpbicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih0ZXh0ICAgICAgICAsIGxheWVyICAgICAgICAgICAgICAgICAgLCBmZWF0dXJlICAgICAgICAgKSB7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gbGF5ZXIubGF5b3V0LmdldCgndGV4dC10cmFuc2Zvcm0nKS5ldmFsdWF0ZShmZWF0dXJlKTtcbiAgICBpZiAodHJhbnNmb3JtID09PSAndXBwZXJjYXNlJykge1xuICAgICAgICB0ZXh0ID0gdGV4dC50b0xvY2FsZVVwcGVyQ2FzZSgpO1xuICAgIH0gZWxzZSBpZiAodHJhbnNmb3JtID09PSAnbG93ZXJjYXNlJykge1xuICAgICAgICB0ZXh0ID0gdGV4dC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIGlmIChydGxUZXh0UGx1Z2luLmFwcGx5QXJhYmljU2hhcGluZykge1xuICAgICAgICB0ZXh0ID0gcnRsVGV4dFBsdWdpbi5hcHBseUFyYWJpY1NoYXBpbmcodGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRleHQ7XG59O1xuIiwiLy8gICAgICBcblxuY29uc3QgRE9NID0gcmVxdWlyZSgnLi4vdXRpbC9kb20nKTtcbmNvbnN0IFBvaW50ID0gcmVxdWlyZSgnQG1hcGJveC9wb2ludC1nZW9tZXRyeScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jb25zdCBoYW5kbGVycyA9IHtcbiAgICBzY3JvbGxab29tOiByZXF1aXJlKCcuL2hhbmRsZXIvc2Nyb2xsX3pvb20nKSxcbiAgICBib3hab29tOiByZXF1aXJlKCcuL2hhbmRsZXIvYm94X3pvb20nKSxcbiAgICBkcmFnUm90YXRlOiByZXF1aXJlKCcuL2hhbmRsZXIvZHJhZ19yb3RhdGUnKSxcbiAgICBkcmFnUGFuOiByZXF1aXJlKCcuL2hhbmRsZXIvZHJhZ19wYW4nKSxcbiAgICBrZXlib2FyZDogcmVxdWlyZSgnLi9oYW5kbGVyL2tleWJvYXJkJyksXG4gICAgZG91YmxlQ2xpY2tab29tOiByZXF1aXJlKCcuL2hhbmRsZXIvZGJsY2xpY2tfem9vbScpLFxuICAgIHRvdWNoWm9vbVJvdGF0ZTogcmVxdWlyZSgnLi9oYW5kbGVyL3RvdWNoX3pvb21fcm90YXRlJylcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYmluZEhhbmRsZXJzKG1hcCAgICAgLCBvcHRpb25zICAgICkge1xuICAgIGNvbnN0IGVsID0gbWFwLmdldENhbnZhc0NvbnRhaW5lcigpO1xuICAgIGxldCBjb250ZXh0TWVudUV2ZW50ID0gbnVsbDtcbiAgICBsZXQgbW91c2VEb3duID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0UG9zID0gbnVsbDtcbiAgICBsZXQgdGFwcGVkID0gbnVsbDtcblxuICAgIGZvciAoY29uc3QgbmFtZSBpbiBoYW5kbGVycykge1xuICAgICAgICAobWFwICAgICApW25hbWVdID0gbmV3IGhhbmRsZXJzW25hbWVdKG1hcCwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChvcHRpb25zLmludGVyYWN0aXZlICYmIG9wdGlvbnNbbmFtZV0pIHtcbiAgICAgICAgICAgIChtYXAgICAgIClbbmFtZV0uZW5hYmxlKG9wdGlvbnNbbmFtZV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCBvbk1vdXNlT3V0LCBmYWxzZSk7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Nb3VzZURvd24sIGZhbHNlKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwLCBmYWxzZSk7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIGZhbHNlKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCBvbk1vdXNlT3ZlciwgZmFsc2UpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQsIGZhbHNlKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVG91Y2hFbmQsIGZhbHNlKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSwgZmFsc2UpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgb25Ub3VjaENhbmNlbCwgZmFsc2UpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGljaywgZmFsc2UpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgb25EYmxDbGljaywgZmFsc2UpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jywgb25Db250ZXh0TWVudSwgZmFsc2UpO1xuXG4gICAgZnVuY3Rpb24gb25Nb3VzZU91dChlICAgICAgICAgICAgKSB7XG4gICAgICAgIGZpcmVNb3VzZUV2ZW50KCdtb3VzZW91dCcsIGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKCFtYXAuZG91YmxlQ2xpY2tab29tLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgICAgIG1hcC5zdG9wKCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydFBvcyA9IERPTS5tb3VzZVBvcyhlbCwgZSk7XG4gICAgICAgIGZpcmVNb3VzZUV2ZW50KCdtb3VzZWRvd24nLCBlKTtcblxuICAgICAgICBtb3VzZURvd24gPSB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTW91c2VVcChlICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHJvdGF0aW5nID0gbWFwLmRyYWdSb3RhdGUgJiYgbWFwLmRyYWdSb3RhdGUuaXNBY3RpdmUoKTtcblxuICAgICAgICBpZiAoY29udGV4dE1lbnVFdmVudCAmJiAhcm90YXRpbmcpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBiZSB0aGUgY2FzZSBmb3IgTWFjXG4gICAgICAgICAgICBmaXJlTW91c2VFdmVudCgnY29udGV4dG1lbnUnLCBjb250ZXh0TWVudUV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHRNZW51RXZlbnQgPSBudWxsO1xuICAgICAgICBtb3VzZURvd24gPSBmYWxzZTtcbiAgICAgICAgZmlyZU1vdXNlRXZlbnQoJ21vdXNldXAnLCBlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlICAgICAgICAgICAgKSB7XG4gICAgICAgIGlmIChtYXAuZHJhZ1BhbiAmJiBtYXAuZHJhZ1Bhbi5pc0FjdGl2ZSgpKSByZXR1cm47XG4gICAgICAgIGlmIChtYXAuZHJhZ1JvdGF0ZSAmJiBtYXAuZHJhZ1JvdGF0ZS5pc0FjdGl2ZSgpKSByZXR1cm47XG5cbiAgICAgICAgbGV0IHRhcmdldCAgICAgID0gZS50b0VsZW1lbnQgfHwgZS50YXJnZXQ7XG4gICAgICAgIHdoaWxlICh0YXJnZXQgJiYgdGFyZ2V0ICE9PSBlbCkgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgIGlmICh0YXJnZXQgIT09IGVsKSByZXR1cm47XG5cbiAgICAgICAgZmlyZU1vdXNlRXZlbnQoJ21vdXNlbW92ZScsIGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTW91c2VPdmVyKGUgICAgICAgICAgICApIHtcblxuICAgICAgICBsZXQgdGFyZ2V0ICAgICAgPSBlLnRvRWxlbWVudCB8fCBlLnRhcmdldDtcbiAgICAgICAgd2hpbGUgKHRhcmdldCAmJiB0YXJnZXQgIT09IGVsKSB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gZWwpIHJldHVybjtcblxuICAgICAgICBmaXJlTW91c2VFdmVudCgnbW91c2VvdmVyJywgZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KGUgICAgICAgICAgICApIHtcbiAgICAgICAgbWFwLnN0b3AoKTtcbiAgICAgICAgZmlyZVRvdWNoRXZlbnQoJ3RvdWNoc3RhcnQnLCBlKTtcblxuICAgICAgICBpZiAoIWUudG91Y2hlcyB8fCBlLnRvdWNoZXMubGVuZ3RoID4gMSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICghdGFwcGVkKSB7XG4gICAgICAgICAgICB0YXBwZWQgPSBzZXRUaW1lb3V0KG9uVG91Y2hUaW1lb3V0LCAzMDApO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGFwcGVkKTtcbiAgICAgICAgICAgIHRhcHBlZCA9IG51bGw7XG4gICAgICAgICAgICBmaXJlTW91c2VFdmVudCgnZGJsY2xpY2snLCBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uVG91Y2hNb3ZlKGUgICAgICAgICAgICApIHtcbiAgICAgICAgZmlyZVRvdWNoRXZlbnQoJ3RvdWNobW92ZScsIGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uVG91Y2hFbmQoZSAgICAgICAgICAgICkge1xuICAgICAgICBmaXJlVG91Y2hFdmVudCgndG91Y2hlbmQnLCBlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblRvdWNoQ2FuY2VsKGUgICAgICAgICAgICApIHtcbiAgICAgICAgZmlyZVRvdWNoRXZlbnQoJ3RvdWNoY2FuY2VsJywgZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Ub3VjaFRpbWVvdXQoKSB7XG4gICAgICAgIHRhcHBlZCA9IG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25DbGljayhlICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHBvcyA9IERPTS5tb3VzZVBvcyhlbCwgZSk7XG5cbiAgICAgICAgaWYgKHBvcy5lcXVhbHMoKHN0YXJ0UG9zICAgICApKSkge1xuICAgICAgICAgICAgZmlyZU1vdXNlRXZlbnQoJ2NsaWNrJywgZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkRibENsaWNrKGUgICAgICAgICAgICApIHtcbiAgICAgICAgZmlyZU1vdXNlRXZlbnQoJ2RibGNsaWNrJywgZSk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkNvbnRleHRNZW51KGUgICAgICAgICAgICApIHtcbiAgICAgICAgY29uc3Qgcm90YXRpbmcgPSBtYXAuZHJhZ1JvdGF0ZSAmJiBtYXAuZHJhZ1JvdGF0ZS5pc0FjdGl2ZSgpO1xuICAgICAgICBpZiAoIW1vdXNlRG93biAmJiAhcm90YXRpbmcpIHtcbiAgICAgICAgICAgIC8vIFdpbmRvd3M6IGNvbnRleHRtZW51IGZpcmVkIG9uIG1vdXNldXAsIHNvIGZpcmUgZXZlbnQgbm93XG4gICAgICAgICAgICBmaXJlTW91c2VFdmVudCgnY29udGV4dG1lbnUnLCBlKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb3VzZURvd24pIHtcbiAgICAgICAgICAgIC8vIE1hYzogY29udGV4dG1lbnUgZmlyZWQgb24gbW91c2Vkb3duOyB3ZSBzYXZlIGl0IHVudGlsIG1vdXNldXAgZm9yIGNvbnNpc3RlbmN5J3Mgc2FrZVxuICAgICAgICAgICAgY29udGV4dE1lbnVFdmVudCA9IGU7XG4gICAgICAgIH1cblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmlyZU1vdXNlRXZlbnQodHlwZSwgZSkge1xuICAgICAgICBjb25zdCBwb3MgPSBET00ubW91c2VQb3MoZWwsIGUpO1xuXG4gICAgICAgIHJldHVybiBtYXAuZmlyZSh0eXBlLCB7XG4gICAgICAgICAgICBsbmdMYXQ6IG1hcC51bnByb2plY3QocG9zKSxcbiAgICAgICAgICAgIHBvaW50OiBwb3MsXG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpcmVUb3VjaEV2ZW50KHR5cGUsIGUpIHtcbiAgICAgICAgY29uc3QgdG91Y2hlcyA9IERPTS50b3VjaFBvcyhlbCwgZSk7XG4gICAgICAgIGNvbnN0IHNpbmd1bGFyID0gdG91Y2hlcy5yZWR1Y2UoKHByZXYsIGN1cnIsIGksIGFycikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHByZXYuYWRkKGN1cnIuZGl2KGFyci5sZW5ndGgpKTtcbiAgICAgICAgfSwgbmV3IFBvaW50KDAsIDApKTtcblxuICAgICAgICByZXR1cm4gbWFwLmZpcmUodHlwZSwge1xuICAgICAgICAgICAgbG5nTGF0OiBtYXAudW5wcm9qZWN0KHNpbmd1bGFyKSxcbiAgICAgICAgICAgIHBvaW50OiBzaW5ndWxhcixcbiAgICAgICAgICAgIGxuZ0xhdHM6IHRvdWNoZXMubWFwKCh0KSA9PiB7IHJldHVybiBtYXAudW5wcm9qZWN0KHQpOyB9LCB0aGlzKSxcbiAgICAgICAgICAgIHBvaW50czogdG91Y2hlcyxcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGVcbiAgICAgICAgfSk7XG4gICAgfVxufTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbmNvbnN0IGludGVycG9sYXRlID0gcmVxdWlyZSgnLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlJykubnVtYmVyO1xuY29uc3QgYnJvd3NlciA9IHJlcXVpcmUoJy4uL3V0aWwvYnJvd3NlcicpO1xuY29uc3QgTG5nTGF0ID0gcmVxdWlyZSgnLi4vZ2VvL2xuZ19sYXQnKTtcbmNvbnN0IExuZ0xhdEJvdW5kcyA9IHJlcXVpcmUoJy4uL2dlby9sbmdfbGF0X2JvdW5kcycpO1xuY29uc3QgUG9pbnQgPSByZXF1aXJlKCdAbWFwYm94L3BvaW50LWdlb21ldHJ5Jyk7XG5jb25zdCBFdmVudGVkID0gcmVxdWlyZSgnLi4vdXRpbC9ldmVudGVkJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuLyoqXG4gKiBPcHRpb25zIGNvbW1vbiB0byB7QGxpbmsgTWFwI2p1bXBUb30sIHtAbGluayBNYXAjZWFzZVRvfSwgYW5kIHtAbGluayBNYXAjZmx5VG99LCBjb250cm9sbGluZyB0aGUgZGVzaXJlZCBsb2NhdGlvbixcbiAqIHpvb20sIGJlYXJpbmcsIGFuZCBwaXRjaCBvZiB0aGUgY2FtZXJhLiBBbGwgcHJvcGVydGllcyBhcmUgb3B0aW9uYWwsIGFuZCB3aGVuIGEgcHJvcGVydHkgaXMgb21pdHRlZCwgdGhlIGN1cnJlbnRcbiAqIGNhbWVyYSB2YWx1ZSBmb3IgdGhhdCBwcm9wZXJ0eSB3aWxsIHJlbWFpbiB1bmNoYW5nZWQuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2FtZXJhT3B0aW9uc1xuICogQHByb3BlcnR5IHtMbmdMYXRMaWtlfSBjZW50ZXIgVGhlIGRlc2lyZWQgY2VudGVyLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHpvb20gVGhlIGRlc2lyZWQgem9vbSBsZXZlbC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBiZWFyaW5nIFRoZSBkZXNpcmVkIGJlYXJpbmcsIGluIGRlZ3JlZXMuIFRoZSBiZWFyaW5nIGlzIHRoZSBjb21wYXNzIGRpcmVjdGlvbiB0aGF0XG4gKiBpcyBcInVwXCI7IGZvciBleGFtcGxlLCBhIGJlYXJpbmcgb2YgOTDCsCBvcmllbnRzIHRoZSBtYXAgc28gdGhhdCBlYXN0IGlzIHVwLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHBpdGNoIFRoZSBkZXNpcmVkIHBpdGNoLCBpbiBkZWdyZWVzLlxuICogQHByb3BlcnR5IHtMbmdMYXRMaWtlfSBhcm91bmQgSWYgYHpvb21gIGlzIHNwZWNpZmllZCwgYGFyb3VuZGAgZGV0ZXJtaW5lcyB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSB6b29tIGlzIGNlbnRlcmVkLlxuICovXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICBcblxuLyoqXG4gKiBPcHRpb25zIGNvbW1vbiB0byBtYXAgbW92ZW1lbnQgbWV0aG9kcyB0aGF0IGludm9sdmUgYW5pbWF0aW9uLCBzdWNoIGFzIHtAbGluayBNYXAjcGFuQnl9IGFuZFxuICoge0BsaW5rIE1hcCNlYXNlVG99LCBjb250cm9sbGluZyB0aGUgZHVyYXRpb24gYW5kIGVhc2luZyBmdW5jdGlvbiBvZiB0aGUgYW5pbWF0aW9uLiBBbGwgcHJvcGVydGllc1xuICogYXJlIG9wdGlvbmFsLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEFuaW1hdGlvbk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kcy5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGVhc2luZyBBIGZ1bmN0aW9uIHRha2luZyBhIHRpbWUgaW4gdGhlIHJhbmdlIDAuLjEgYW5kIHJldHVybmluZyBhIG51bWJlciB3aGVyZSAwIGlzXG4gKiAgIHRoZSBpbml0aWFsIHN0YXRlIGFuZCAxIGlzIHRoZSBmaW5hbCBzdGF0ZS5cbiAqIEBwcm9wZXJ0eSB7UG9pbnRMaWtlfSBvZmZzZXQgb2YgdGhlIHRhcmdldCBjZW50ZXIgcmVsYXRpdmUgdG8gcmVhbCBtYXAgY29udGFpbmVyIGNlbnRlciBhdCB0aGUgZW5kIG9mIGFuaW1hdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYW5pbWF0ZSBJZiBgZmFsc2VgLCBubyBhbmltYXRpb24gd2lsbCBvY2N1ci5cbiAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgXG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc2V0dGluZyBwYWRkaW5nIG9uIGEgY2FsbCB0byB7QGxpbmsgTWFwI2ZpdEJvdW5kc30uIEFsbCBwcm9wZXJ0aWVzIG9mIHRoaXMgb2JqZWN0IG11c3QgYmVcbiAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQYWRkaW5nT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRvcCBQYWRkaW5nIGluIHBpeGVscyBmcm9tIHRoZSB0b3Agb2YgdGhlIG1hcCBjYW52YXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gYm90dG9tIFBhZGRpbmcgaW4gcGl4ZWxzIGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgbWFwIGNhbnZhcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZWZ0IFBhZGRpbmcgaW4gcGl4ZWxzIGZyb20gdGhlIGxlZnQgb2YgdGhlIG1hcCBjYW52YXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcmlnaHQgUGFkZGluZyBpbiBwaXhlbHMgZnJvbSB0aGUgcmlnaHQgb2YgdGhlIG1hcCBjYW52YXMuXG4gKi9cblxuY2xhc3MgQ2FtZXJhIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcih0cmFuc2Zvcm0gICAgICAgICAgICwgb3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubW92aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgICAgICB0aGlzLl9iZWFyaW5nU25hcCA9IG9wdGlvbnMuYmVhcmluZ1NuYXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGNlbnRlcnBvaW50LlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcmV0dXJucyBUaGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGNlbnRlcnBvaW50LlxuICAgICAqL1xuICAgIGdldENlbnRlcigpICAgICAgICAgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm0uY2VudGVyOyB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXAncyBnZW9ncmFwaGljYWwgY2VudGVycG9pbnQuIEVxdWl2YWxlbnQgdG8gYGp1bXBUbyh7Y2VudGVyOiBjZW50ZXJ9KWAuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSBjZW50ZXIgVGhlIGNlbnRlcnBvaW50IHRvIHNldC5cbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2V0Q2VudGVyKFstNzQsIDM4XSk7XG4gICAgICogQHNlZSBbTW92ZSBzeW1ib2wgd2l0aCB0aGUga2V5Ym9hcmRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcm90YXRpbmctY29udHJvbGxhYmxlLW1hcmtlci8pXG4gICAgICovXG4gICAgc2V0Q2VudGVyKGNlbnRlciAgICAgICAgICAgICwgZXZlbnREYXRhICAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmp1bXBUbyh7Y2VudGVyOiBjZW50ZXJ9LCBldmVudERhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhbnMgdGhlIG1hcCBieSB0aGUgc3BlY2lmaWVkIG9mZmVzdC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIG9mZnNldCBgeGAgYW5kIGB5YCBjb29yZGluYXRlcyBieSB3aGljaCB0byBwYW4gdGhlIG1hcC5cbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKiBAc2VlIFtOYXZpZ2F0ZSB0aGUgbWFwIHdpdGggZ2FtZS1saWtlIGNvbnRyb2xzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2dhbWUtY29udHJvbHMvKVxuICAgICAqL1xuICAgIHBhbkJ5KG9mZnNldCAgICAgICAgICAgLCBvcHRpb25zICAgICAgICAgICAgICAgICAgICwgZXZlbnREYXRhICAgICAgICAgKSB7XG4gICAgICAgIG9mZnNldCA9IFBvaW50LmNvbnZlcnQob2Zmc2V0KS5tdWx0KC0xKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFuVG8odGhpcy50cmFuc2Zvcm0uY2VudGVyLCB1dGlsLmV4dGVuZCh7b2Zmc2V0fSwgb3B0aW9ucyksIGV2ZW50RGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFucyB0aGUgbWFwIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24sIHdpdGggYW4gYW5pbWF0ZWQgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIGxuZ2xhdCBUaGUgbG9jYXRpb24gdG8gcGFuIHRoZSBtYXAgdG8uXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgcGFuVG8obG5nbGF0ICAgICAgICAgICAgLCBvcHRpb25zICAgICAgICAgICAgICAgICAgICwgZXZlbnREYXRhICAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhc2VUbyh1dGlsLmV4dGVuZCh7XG4gICAgICAgICAgICBjZW50ZXI6IGxuZ2xhdFxuICAgICAgICB9LCBvcHRpb25zKSwgZXZlbnREYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBjdXJyZW50IHpvb20gbGV2ZWwuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEByZXR1cm5zIFRoZSBtYXAncyBjdXJyZW50IHpvb20gbGV2ZWwuXG4gICAgICovXG4gICAgZ2V0Wm9vbSgpICAgICAgICAgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm0uem9vbTsgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWFwJ3Mgem9vbSBsZXZlbC4gRXF1aXZhbGVudCB0byBganVtcFRvKHt6b29tOiB6b29tfSlgLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0gem9vbSBUaGUgem9vbSBsZXZlbCB0byBzZXQgKDAtMjApLlxuICAgICAqIEBwYXJhbSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIHpvb21zdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlXG4gICAgICogQGZpcmVzIHpvb21cbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEBmaXJlcyB6b29tZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyB6b29tIHRoZSBtYXAgdG8gNVxuICAgICAqIG1hcC5zZXRab29tKDUpO1xuICAgICAqL1xuICAgIHNldFpvb20oem9vbSAgICAgICAgLCBldmVudERhdGEgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5qdW1wVG8oe3pvb206IHpvb219LCBldmVudERhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBab29tcyB0aGUgbWFwIHRvIHRoZSBzcGVjaWZpZWQgem9vbSBsZXZlbCwgd2l0aCBhbiBhbmltYXRlZCB0cmFuc2l0aW9uLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0gem9vbSBUaGUgem9vbSBsZXZlbCB0byB0cmFuc2l0aW9uIHRvLlxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgem9vbXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVcbiAgICAgKiBAZmlyZXMgem9vbVxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQGZpcmVzIHpvb21lbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICB6b29tVG8oem9vbSAgICAgICAgLCBvcHRpb25zICAgICAgICAgICAgICAgICAgICAsIGV2ZW50RGF0YSAgICAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5lYXNlVG8odXRpbC5leHRlbmQoe1xuICAgICAgICAgICAgem9vbTogem9vbVxuICAgICAgICB9LCBvcHRpb25zKSwgZXZlbnREYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmNyZWFzZXMgdGhlIG1hcCdzIHpvb20gbGV2ZWwgYnkgMS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyB6b29tc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZVxuICAgICAqIEBmaXJlcyB6b29tXG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAZmlyZXMgem9vbWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHpvb21JbihvcHRpb25zICAgICAgICAgICAgICAgICAgICwgZXZlbnREYXRhICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuem9vbVRvKHRoaXMuZ2V0Wm9vbSgpICsgMSwgb3B0aW9ucywgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVjcmVhc2VzIHRoZSBtYXAncyB6b29tIGxldmVsIGJ5IDEuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgem9vbXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVcbiAgICAgKiBAZmlyZXMgem9vbVxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQGZpcmVzIHpvb21lbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICB6b29tT3V0KG9wdGlvbnMgICAgICAgICAgICAgICAgICAgLCBldmVudERhdGEgICAgICAgICApIHtcbiAgICAgICAgdGhpcy56b29tVG8odGhpcy5nZXRab29tKCkgLSAxLCBvcHRpb25zLCBldmVudERhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBjdXJyZW50IGJlYXJpbmcuIFRoZSBiZWFyaW5nIGlzIHRoZSBjb21wYXNzIGRpcmVjdGlvbiB0aGF0IGlzIFxcXCJ1cFxcXCI7IGZvciBleGFtcGxlLCBhIGJlYXJpbmdcbiAgICAgKiBvZiA5MMKwIG9yaWVudHMgdGhlIG1hcCBzbyB0aGF0IGVhc3QgaXMgdXAuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEByZXR1cm5zIFRoZSBtYXAncyBjdXJyZW50IGJlYXJpbmcuXG4gICAgICogQHNlZSBbTmF2aWdhdGUgdGhlIG1hcCB3aXRoIGdhbWUtbGlrZSBjb250cm9sc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nYW1lLWNvbnRyb2xzLylcbiAgICAgKi9cbiAgICBnZXRCZWFyaW5nKCkgICAgICAgICB7IHJldHVybiB0aGlzLnRyYW5zZm9ybS5iZWFyaW5nOyB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXAncyBiZWFyaW5nIChyb3RhdGlvbikuIFRoZSBiZWFyaW5nIGlzIHRoZSBjb21wYXNzIGRpcmVjdGlvbiB0aGF0IGlzIFxcXCJ1cFxcXCI7IGZvciBleGFtcGxlLCBhIGJlYXJpbmdcbiAgICAgKiBvZiA5MMKwIG9yaWVudHMgdGhlIG1hcCBzbyB0aGF0IGVhc3QgaXMgdXAuXG4gICAgICpcbiAgICAgKiBFcXVpdmFsZW50IHRvIGBqdW1wVG8oe2JlYXJpbmc6IGJlYXJpbmd9KWAuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSBiZWFyaW5nIFRoZSBkZXNpcmVkIGJlYXJpbmcuXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gcm90YXRlIHRoZSBtYXAgdG8gOTAgZGVncmVlc1xuICAgICAqIG1hcC5zZXRCZWFyaW5nKDkwKTtcbiAgICAgKi9cbiAgICBzZXRCZWFyaW5nKGJlYXJpbmcgICAgICAgICwgZXZlbnREYXRhICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuanVtcFRvKHtiZWFyaW5nOiBiZWFyaW5nfSwgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUm90YXRlcyB0aGUgbWFwIHRvIHRoZSBzcGVjaWZpZWQgYmVhcmluZywgd2l0aCBhbiBhbmltYXRlZCB0cmFuc2l0aW9uLiBUaGUgYmVhcmluZyBpcyB0aGUgY29tcGFzcyBkaXJlY3Rpb25cbiAgICAgKiB0aGF0IGlzIFxcXCJ1cFxcXCI7IGZvciBleGFtcGxlLCBhIGJlYXJpbmcgb2YgOTDCsCBvcmllbnRzIHRoZSBtYXAgc28gdGhhdCBlYXN0IGlzIHVwLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0gYmVhcmluZyBUaGUgZGVzaXJlZCBiZWFyaW5nLlxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJvdGF0ZVRvKGJlYXJpbmcgICAgICAgICwgb3B0aW9ucyAgICAgICAgICAgICAgICAgICAsIGV2ZW50RGF0YSAgICAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5lYXNlVG8odXRpbC5leHRlbmQoe1xuICAgICAgICAgICAgYmVhcmluZzogYmVhcmluZ1xuICAgICAgICB9LCBvcHRpb25zKSwgZXZlbnREYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGVzIHRoZSBtYXAgc28gdGhhdCBub3J0aCBpcyB1cCAoMMKwIGJlYXJpbmcpLCB3aXRoIGFuIGFuaW1hdGVkIHRyYW5zaXRpb24uXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlc2V0Tm9ydGgob3B0aW9ucyAgICAgICAgICAgICAgICAgICAsIGV2ZW50RGF0YSAgICAgICAgICkge1xuICAgICAgICB0aGlzLnJvdGF0ZVRvKDAsIHV0aWwuZXh0ZW5kKHtkdXJhdGlvbjogMTAwMH0sIG9wdGlvbnMpLCBldmVudERhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTbmFwcyB0aGUgbWFwIHNvIHRoYXQgbm9ydGggaXMgdXAgKDDCsCBiZWFyaW5nKSwgaWYgdGhlIGN1cnJlbnQgYmVhcmluZyBpcyBjbG9zZSBlbm91Z2ggdG8gaXQgKGkuZS4gd2l0aGluIHRoZVxuICAgICAqIGBiZWFyaW5nU25hcGAgdGhyZXNob2xkKS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgc25hcFRvTm9ydGgob3B0aW9ucyAgICAgICAgICAgICAgICAgICAsIGV2ZW50RGF0YSAgICAgICAgICkge1xuICAgICAgICBpZiAoTWF0aC5hYnModGhpcy5nZXRCZWFyaW5nKCkpIDwgdGhpcy5fYmVhcmluZ1NuYXApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc2V0Tm9ydGgob3B0aW9ucywgZXZlbnREYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBjdXJyZW50IHBpdGNoICh0aWx0KS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHJldHVybnMgVGhlIG1hcCdzIGN1cnJlbnQgcGl0Y2gsIG1lYXN1cmVkIGluIGRlZ3JlZXMgYXdheSBmcm9tIHRoZSBwbGFuZSBvZiB0aGUgc2NyZWVuLlxuICAgICAqL1xuICAgIGdldFBpdGNoKCkgICAgICAgICB7IHJldHVybiB0aGlzLnRyYW5zZm9ybS5waXRjaDsgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWFwJ3MgcGl0Y2ggKHRpbHQpLiBFcXVpdmFsZW50IHRvIGBqdW1wVG8oe3BpdGNoOiBwaXRjaH0pYC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHBpdGNoIFRoZSBwaXRjaCB0byBzZXQsIG1lYXN1cmVkIGluIGRlZ3JlZXMgYXdheSBmcm9tIHRoZSBwbGFuZSBvZiB0aGUgc2NyZWVuICgwLTYwKS5cbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIHBpdGNoc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRQaXRjaChwaXRjaCAgICAgICAgLCBldmVudERhdGEgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5qdW1wVG8oe3BpdGNoOiBwaXRjaH0sIGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogUGFucyBhbmQgem9vbXMgdGhlIG1hcCB0byBjb250YWluIGl0cyB2aXNpYmxlIGFyZWEgd2l0aGluIHRoZSBzcGVjaWZpZWQgZ2VvZ3JhcGhpY2FsIGJvdW5kcy5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyByZXNldCB0aGUgbWFwJ3MgYmVhcmluZyB0byAwIGlmIGJlYXJpbmcgaXMgbm9uemVyby5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIGJvdW5kcyBDZW50ZXIgdGhlc2UgYm91bmRzIGluIHRoZSB2aWV3cG9ydCBhbmQgdXNlIHRoZSBoaWdoZXN0XG4gICAgICogICAgICB6b29tIGxldmVsIHVwIHRvIGFuZCBpbmNsdWRpbmcgYE1hcCNnZXRNYXhab29tKClgIHRoYXQgZml0cyB0aGVtIGluIHRoZSB2aWV3cG9ydC5cbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgUGFkZGluZ09wdGlvbnN9IFtvcHRpb25zLnBhZGRpbmddIFRoZSBhbW91bnQgb2YgcGFkZGluZyBpbiBwaXhlbHMgdG8gYWRkIHRvIHRoZSBnaXZlbiBib3VuZHMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5saW5lYXI9ZmFsc2VdIElmIGB0cnVlYCwgdGhlIG1hcCB0cmFuc2l0aW9ucyB1c2luZ1xuICAgICAqICAgICB7QGxpbmsgTWFwI2Vhc2VUb30uIElmIGBmYWxzZWAsIHRoZSBtYXAgdHJhbnNpdGlvbnMgdXNpbmcge0BsaW5rIE1hcCNmbHlUb30uIFNlZVxuICAgICAqICAgICB0aG9zZSBmdW5jdGlvbnMgYW5kIHtAbGluayBBbmltYXRpb25PcHRpb25zfSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgb3B0aW9ucyBhdmFpbGFibGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZWFzaW5nXSBBbiBlYXNpbmcgZnVuY3Rpb24gZm9yIHRoZSBhbmltYXRlZCB0cmFuc2l0aW9uLiBTZWUge0BsaW5rIEFuaW1hdGlvbk9wdGlvbnN9LlxuICAgICAqIEBwYXJhbSB7UG9pbnRMaWtlfSBbb3B0aW9ucy5vZmZzZXQ9WzAsIDBdXSBUaGUgY2VudGVyIG9mIHRoZSBnaXZlbiBib3VuZHMgcmVsYXRpdmUgdG8gdGhlIG1hcCdzIGNlbnRlciwgbWVhc3VyZWQgaW4gcGl4ZWxzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhab29tXSBUaGUgbWF4aW11bSB6b29tIGxldmVsIHRvIGFsbG93IHdoZW4gdGhlIG1hcCB2aWV3IHRyYW5zaXRpb25zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmRzLlxuICAgICAqIEBwYXJhbSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2Bcblx0ICogQGV4YW1wbGVcbiAgICAgKiB2YXIgYmJveCA9IFtbLTc5LCA0M10sIFstNzMsIDQ1XV07XG4gICAgICogbWFwLmZpdEJvdW5kcyhiYm94LCB7XG4gICAgICogICBwYWRkaW5nOiB7dG9wOiAxMCwgYm90dG9tOjI1LCBsZWZ0OiAxNSwgcmlnaHQ6IDV9XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRml0IGEgbWFwIHRvIGEgYm91bmRpbmcgYm94XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZpdGJvdW5kcy8pXG4gICAgICovXG4gICAgZml0Qm91bmRzKGJvdW5kcyAgICAgICAgICAgICAgICAgICwgb3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBldmVudERhdGEgICAgICAgICApIHtcblxuICAgICAgICBvcHRpb25zID0gdXRpbC5leHRlbmQoe1xuICAgICAgICAgICAgcGFkZGluZzoge1xuICAgICAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgICAgICBib3R0b206IDAsXG4gICAgICAgICAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgICAgICAgICAgbGVmdDogMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9mZnNldDogWzAsIDBdLFxuICAgICAgICAgICAgbWF4Wm9vbTogdGhpcy50cmFuc2Zvcm0ubWF4Wm9vbVxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucGFkZGluZyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBvcHRpb25zLnBhZGRpbmc7XG4gICAgICAgICAgICBvcHRpb25zLnBhZGRpbmcgPSB7XG4gICAgICAgICAgICAgICAgdG9wOiBwLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogcCxcbiAgICAgICAgICAgICAgICByaWdodDogcCxcbiAgICAgICAgICAgICAgICBsZWZ0OiBwXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdXRpbC5kZWVwRXF1YWwoT2JqZWN0LmtleXMob3B0aW9ucy5wYWRkaW5nKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBpZiAoYSA8IGIpIHJldHVybiAtMTtcbiAgICAgICAgICAgIGlmIChhID4gYikgcmV0dXJuIDE7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSksIFtcImJvdHRvbVwiLCBcImxlZnRcIiwgXCJyaWdodFwiLCBcInRvcFwiXSkpIHtcbiAgICAgICAgICAgIHV0aWwud2Fybk9uY2UoXCJvcHRpb25zLnBhZGRpbmcgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciwgb3IgYW4gT2JqZWN0IHdpdGgga2V5cyAnYm90dG9tJywgJ2xlZnQnLCAncmlnaHQnLCAndG9wJ1wiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgYm91bmRzID0gTG5nTGF0Qm91bmRzLmNvbnZlcnQoYm91bmRzKTtcblxuICAgICAgICAvLyB3ZSBzZXBhcmF0ZSB0aGUgcGFzc2VkIHBhZGRpbmcgb3B0aW9uIGludG8gdHdvIHBhcnRzLCB0aGUgcGFydCB0aGF0IGRvZXMgbm90IGFmZmVjdCB0aGUgbWFwJ3MgY2VudGVyXG4gICAgICAgIC8vIChsYXRlcmFsIGFuZCB2ZXJ0aWNhbCBwYWRkaW5nKSwgYW5kIHRoZSBwYXJ0IHRoYXQgZG9lcyAocGFkZGluZ09mZnNldCkuIFdlIGFkZCB0aGUgcGFkZGluZyBvZmZzZXRcbiAgICAgICAgLy8gdG8gdGhlIG9wdGlvbnMgYG9mZnNldGAgb2JqZWN0IHdoZXJlIGl0IGNhbiBhbHRlciB0aGUgbWFwJ3MgY2VudGVyIGluIHRoZSBzdWJzZXF1ZW50IGNhbGxzIHRvXG4gICAgICAgIC8vIGBlYXNlVG9gIGFuZCBgZmx5VG9gLlxuICAgICAgICBjb25zdCBwYWRkaW5nT2Zmc2V0ID0gWyhvcHRpb25zLnBhZGRpbmcubGVmdCAtIG9wdGlvbnMucGFkZGluZy5yaWdodCkgLyAyLCAob3B0aW9ucy5wYWRkaW5nLnRvcCAtIG9wdGlvbnMucGFkZGluZy5ib3R0b20pIC8gMl0sXG4gICAgICAgICAgICBsYXRlcmFsUGFkZGluZyA9IE1hdGgubWluKG9wdGlvbnMucGFkZGluZy5yaWdodCwgb3B0aW9ucy5wYWRkaW5nLmxlZnQpLFxuICAgICAgICAgICAgdmVydGljYWxQYWRkaW5nID0gTWF0aC5taW4ob3B0aW9ucy5wYWRkaW5nLnRvcCwgb3B0aW9ucy5wYWRkaW5nLmJvdHRvbSk7XG4gICAgICAgIG9wdGlvbnMub2Zmc2V0ID0gW29wdGlvbnMub2Zmc2V0WzBdICsgcGFkZGluZ09mZnNldFswXSwgb3B0aW9ucy5vZmZzZXRbMV0gKyBwYWRkaW5nT2Zmc2V0WzFdXTtcblxuICAgICAgICBjb25zdCBvZmZzZXQgPSBQb2ludC5jb252ZXJ0KG9wdGlvbnMub2Zmc2V0KSxcbiAgICAgICAgICAgIHRyID0gdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBudyA9IHRyLnByb2plY3QoYm91bmRzLmdldE5vcnRoV2VzdCgpKSxcbiAgICAgICAgICAgIHNlID0gdHIucHJvamVjdChib3VuZHMuZ2V0U291dGhFYXN0KCkpLFxuICAgICAgICAgICAgc2l6ZSA9IHNlLnN1YihudyksXG4gICAgICAgICAgICBzY2FsZVggPSAodHIud2lkdGggLSBsYXRlcmFsUGFkZGluZyAqIDIgLSBNYXRoLmFicyhvZmZzZXQueCkgKiAyKSAvIHNpemUueCxcbiAgICAgICAgICAgIHNjYWxlWSA9ICh0ci5oZWlnaHQgLSB2ZXJ0aWNhbFBhZGRpbmcgKiAyIC0gTWF0aC5hYnMob2Zmc2V0LnkpICogMikgLyBzaXplLnk7XG5cbiAgICAgICAgaWYgKHNjYWxlWSA8IDAgfHwgc2NhbGVYIDwgMCkge1xuICAgICAgICAgICAgdXRpbC53YXJuT25jZSgnTWFwIGNhbm5vdCBmaXQgd2l0aGluIGNhbnZhcyB3aXRoIHRoZSBnaXZlbiBib3VuZHMsIHBhZGRpbmcsIGFuZC9vciBvZmZzZXQuJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMuY2VudGVyID0gdHIudW5wcm9qZWN0KG53LmFkZChzZSkuZGl2KDIpKTtcbiAgICAgICAgb3B0aW9ucy56b29tID0gTWF0aC5taW4odHIuc2NhbGVab29tKHRyLnNjYWxlICogTWF0aC5taW4oc2NhbGVYLCBzY2FsZVkpKSwgb3B0aW9ucy5tYXhab29tKTtcbiAgICAgICAgb3B0aW9ucy5iZWFyaW5nID0gMDtcblxuICAgICAgICByZXR1cm4gb3B0aW9ucy5saW5lYXIgP1xuICAgICAgICAgICAgdGhpcy5lYXNlVG8ob3B0aW9ucywgZXZlbnREYXRhKSA6XG4gICAgICAgICAgICB0aGlzLmZseVRvKG9wdGlvbnMsIGV2ZW50RGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhbnkgY29tYmluYXRpb24gb2YgY2VudGVyLCB6b29tLCBiZWFyaW5nLCBhbmQgcGl0Y2gsIHdpdGhvdXRcbiAgICAgKiBhbiBhbmltYXRlZCB0cmFuc2l0aW9uLiBUaGUgbWFwIHdpbGwgcmV0YWluIGl0cyBjdXJyZW50IHZhbHVlcyBmb3IgYW55XG4gICAgICogZGV0YWlscyBub3Qgc3BlY2lmaWVkIGluIGBvcHRpb25zYC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyB6b29tc3RhcnRcbiAgICAgKiBAZmlyZXMgcGl0Y2hzdGFydFxuICAgICAqIEBmaXJlcyByb3RhdGVcbiAgICAgKiBAZmlyZXMgbW92ZVxuICAgICAqIEBmaXJlcyB6b29tXG4gICAgICogQGZpcmVzIHBpdGNoXG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAZmlyZXMgem9vbWVuZFxuICAgICAqIEBmaXJlcyBwaXRjaGVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIGp1bXBUbyhvcHRpb25zICAgICAgICAgICAgICAgLCBldmVudERhdGEgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG5cbiAgICAgICAgY29uc3QgdHIgPSB0aGlzLnRyYW5zZm9ybTtcbiAgICAgICAgbGV0IHpvb21DaGFuZ2VkID0gZmFsc2UsXG4gICAgICAgICAgICBiZWFyaW5nQ2hhbmdlZCA9IGZhbHNlLFxuICAgICAgICAgICAgcGl0Y2hDaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCd6b29tJyBpbiBvcHRpb25zICYmIHRyLnpvb20gIT09ICtvcHRpb25zLnpvb20pIHtcbiAgICAgICAgICAgIHpvb21DaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyLnpvb20gPSArb3B0aW9ucy56b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuY2VudGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRyLmNlbnRlciA9IExuZ0xhdC5jb252ZXJ0KG9wdGlvbnMuY2VudGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnYmVhcmluZycgaW4gb3B0aW9ucyAmJiB0ci5iZWFyaW5nICE9PSArb3B0aW9ucy5iZWFyaW5nKSB7XG4gICAgICAgICAgICBiZWFyaW5nQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB0ci5iZWFyaW5nID0gK29wdGlvbnMuYmVhcmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgncGl0Y2gnIGluIG9wdGlvbnMgJiYgdHIucGl0Y2ggIT09ICtvcHRpb25zLnBpdGNoKSB7XG4gICAgICAgICAgICBwaXRjaENoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgdHIucGl0Y2ggPSArb3B0aW9ucy5waXRjaDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZSgnbW92ZXN0YXJ0JywgZXZlbnREYXRhKVxuICAgICAgICAgICAgLmZpcmUoJ21vdmUnLCBldmVudERhdGEpO1xuXG4gICAgICAgIGlmICh6b29tQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKCd6b29tc3RhcnQnLCBldmVudERhdGEpXG4gICAgICAgICAgICAgICAgLmZpcmUoJ3pvb20nLCBldmVudERhdGEpXG4gICAgICAgICAgICAgICAgLmZpcmUoJ3pvb21lbmQnLCBldmVudERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJlYXJpbmdDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ3JvdGF0ZScsIGV2ZW50RGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGl0Y2hDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ3BpdGNoc3RhcnQnLCBldmVudERhdGEpXG4gICAgICAgICAgICAgICAgLmZpcmUoJ3BpdGNoJywgZXZlbnREYXRhKVxuICAgICAgICAgICAgICAgIC5maXJlKCdwaXRjaGVuZCcsIGV2ZW50RGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5maXJlKCdtb3ZlZW5kJywgZXZlbnREYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGFueSBjb21iaW5hdGlvbiBvZiBjZW50ZXIsIHpvb20sIGJlYXJpbmcsIGFuZCBwaXRjaCwgd2l0aCBhbiBhbmltYXRlZCB0cmFuc2l0aW9uXG4gICAgICogYmV0d2VlbiBvbGQgYW5kIG5ldyB2YWx1ZXMuIFRoZSBtYXAgd2lsbCByZXRhaW4gaXRzIGN1cnJlbnQgdmFsdWVzIGZvciBhbnlcbiAgICAgKiBkZXRhaWxzIG5vdCBzcGVjaWZpZWQgaW4gYG9wdGlvbnNgLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGRlc2NyaWJpbmcgdGhlIGRlc3RpbmF0aW9uIGFuZCBhbmltYXRpb24gb2YgdGhlIHRyYW5zaXRpb24uXG4gICAgICogICAgICAgICAgICBBY2NlcHRzIHtAbGluayBDYW1lcmFPcHRpb25zfSBhbmQge0BsaW5rIEFuaW1hdGlvbk9wdGlvbnN9LlxuICAgICAqIEBwYXJhbSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIHpvb21zdGFydFxuICAgICAqIEBmaXJlcyBwaXRjaHN0YXJ0XG4gICAgICogQGZpcmVzIHJvdGF0ZVxuICAgICAqIEBmaXJlcyBtb3ZlXG4gICAgICogQGZpcmVzIHpvb21cbiAgICAgKiBAZmlyZXMgcGl0Y2hcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEBmaXJlcyB6b29tZW5kXG4gICAgICogQGZpcmVzIHBpdGNoZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQHNlZSBbTmF2aWdhdGUgdGhlIG1hcCB3aXRoIGdhbWUtbGlrZSBjb250cm9sc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nYW1lLWNvbnRyb2xzLylcbiAgICAgKi9cbiAgICBlYXNlVG8ob3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBldmVudERhdGEgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG5cbiAgICAgICAgb3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHtcbiAgICAgICAgICAgIG9mZnNldDogWzAsIDBdLFxuICAgICAgICAgICAgZHVyYXRpb246IDUwMCxcbiAgICAgICAgICAgIGVhc2luZzogdXRpbC5lYXNlXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmFuaW1hdGUgPT09IGZhbHNlKSBvcHRpb25zLmR1cmF0aW9uID0gMDtcblxuICAgICAgICBjb25zdCB0ciA9IHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgc3RhcnRab29tID0gdGhpcy5nZXRab29tKCksXG4gICAgICAgICAgICBzdGFydEJlYXJpbmcgPSB0aGlzLmdldEJlYXJpbmcoKSxcbiAgICAgICAgICAgIHN0YXJ0UGl0Y2ggPSB0aGlzLmdldFBpdGNoKCksXG5cbiAgICAgICAgICAgIHpvb20gPSAnem9vbScgaW4gb3B0aW9ucyA/ICtvcHRpb25zLnpvb20gOiBzdGFydFpvb20sXG4gICAgICAgICAgICBiZWFyaW5nID0gJ2JlYXJpbmcnIGluIG9wdGlvbnMgPyB0aGlzLl9ub3JtYWxpemVCZWFyaW5nKG9wdGlvbnMuYmVhcmluZywgc3RhcnRCZWFyaW5nKSA6IHN0YXJ0QmVhcmluZyxcbiAgICAgICAgICAgIHBpdGNoID0gJ3BpdGNoJyBpbiBvcHRpb25zID8gK29wdGlvbnMucGl0Y2ggOiBzdGFydFBpdGNoO1xuXG4gICAgICAgIGNvbnN0IHBvaW50QXRPZmZzZXQgPSB0ci5jZW50ZXJQb2ludC5hZGQoUG9pbnQuY29udmVydChvcHRpb25zLm9mZnNldCkpO1xuICAgICAgICBjb25zdCBsb2NhdGlvbkF0T2Zmc2V0ID0gdHIucG9pbnRMb2NhdGlvbihwb2ludEF0T2Zmc2V0KTtcbiAgICAgICAgY29uc3QgY2VudGVyID0gTG5nTGF0LmNvbnZlcnQob3B0aW9ucy5jZW50ZXIgfHwgbG9jYXRpb25BdE9mZnNldCk7XG4gICAgICAgIHRoaXMuX25vcm1hbGl6ZUNlbnRlcihjZW50ZXIpO1xuXG4gICAgICAgIGNvbnN0IGZyb20gPSB0ci5wcm9qZWN0KGxvY2F0aW9uQXRPZmZzZXQpO1xuICAgICAgICBjb25zdCBkZWx0YSA9IHRyLnByb2plY3QoY2VudGVyKS5zdWIoZnJvbSk7XG4gICAgICAgIGNvbnN0IGZpbmFsU2NhbGUgPSB0ci56b29tU2NhbGUoem9vbSAtIHN0YXJ0Wm9vbSk7XG5cbiAgICAgICAgbGV0IGFyb3VuZCwgYXJvdW5kUG9pbnQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuYXJvdW5kKSB7XG4gICAgICAgICAgICBhcm91bmQgPSBMbmdMYXQuY29udmVydChvcHRpb25zLmFyb3VuZCk7XG4gICAgICAgICAgICBhcm91bmRQb2ludCA9IHRyLmxvY2F0aW9uUG9pbnQoYXJvdW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuem9vbWluZyA9ICh6b29tICE9PSBzdGFydFpvb20pO1xuICAgICAgICB0aGlzLnJvdGF0aW5nID0gKHN0YXJ0QmVhcmluZyAhPT0gYmVhcmluZyk7XG4gICAgICAgIHRoaXMucGl0Y2hpbmcgPSAocGl0Y2ggIT09IHN0YXJ0UGl0Y2gpO1xuXG4gICAgICAgIHRoaXMuX3ByZXBhcmVFYXNlKGV2ZW50RGF0YSwgb3B0aW9ucy5ub01vdmVTdGFydCk7XG5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX29uRWFzZUVuZCk7XG5cbiAgICAgICAgdGhpcy5fZWFzZSgoaykgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuem9vbWluZykge1xuICAgICAgICAgICAgICAgIHRyLnpvb20gPSBpbnRlcnBvbGF0ZShzdGFydFpvb20sIHpvb20sIGspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucm90YXRpbmcpIHtcbiAgICAgICAgICAgICAgICB0ci5iZWFyaW5nID0gaW50ZXJwb2xhdGUoc3RhcnRCZWFyaW5nLCBiZWFyaW5nLCBrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnBpdGNoaW5nKSB7XG4gICAgICAgICAgICAgICAgdHIucGl0Y2ggPSBpbnRlcnBvbGF0ZShzdGFydFBpdGNoLCBwaXRjaCwgayk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhcm91bmQpIHtcbiAgICAgICAgICAgICAgICB0ci5zZXRMb2NhdGlvbkF0UG9pbnQoYXJvdW5kLCBhcm91bmRQb2ludCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gdHIuem9vbVNjYWxlKHRyLnpvb20gLSBzdGFydFpvb20pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSB6b29tID4gc3RhcnRab29tID9cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4oMiwgZmluYWxTY2FsZSkgOlxuICAgICAgICAgICAgICAgICAgICBNYXRoLm1heCgwLjUsIGZpbmFsU2NhbGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwZWVkdXAgPSBNYXRoLnBvdyhiYXNlLCAxIC0gayk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q2VudGVyID0gdHIudW5wcm9qZWN0KGZyb20uYWRkKGRlbHRhLm11bHQoayAqIHNwZWVkdXApKS5tdWx0KHNjYWxlKSk7XG4gICAgICAgICAgICAgICAgdHIuc2V0TG9jYXRpb25BdFBvaW50KHRyLnJlbmRlcldvcmxkQ29waWVzID8gbmV3Q2VudGVyLndyYXAoKSA6IG5ld0NlbnRlciwgcG9pbnRBdE9mZnNldCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2ZpcmVNb3ZlRXZlbnRzKGV2ZW50RGF0YSk7XG5cbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGVsYXlFbmRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkVhc2VFbmQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX2FmdGVyRWFzZShldmVudERhdGEpLCBvcHRpb25zLmRlbGF5RW5kRXZlbnRzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWZ0ZXJFYXNlKGV2ZW50RGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9wcmVwYXJlRWFzZShldmVudERhdGEgICAgICAgICAsIG5vTW92ZVN0YXJ0ICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMubW92aW5nID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIW5vTW92ZVN0YXJ0KSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ21vdmVzdGFydCcsIGV2ZW50RGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuem9vbWluZykge1xuICAgICAgICAgICAgdGhpcy5maXJlKCd6b29tc3RhcnQnLCBldmVudERhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBpdGNoaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ3BpdGNoc3RhcnQnLCBldmVudERhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2ZpcmVNb3ZlRXZlbnRzKGV2ZW50RGF0YSAgICAgICAgICkge1xuICAgICAgICB0aGlzLmZpcmUoJ21vdmUnLCBldmVudERhdGEpO1xuICAgICAgICBpZiAodGhpcy56b29taW5nKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ3pvb20nLCBldmVudERhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJvdGF0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ3JvdGF0ZScsIGV2ZW50RGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGl0Y2hpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgncGl0Y2gnLCBldmVudERhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2FmdGVyRWFzZShldmVudERhdGEgICAgICAgICApIHtcbiAgICAgICAgY29uc3Qgd2FzWm9vbWluZyA9IHRoaXMuem9vbWluZztcbiAgICAgICAgY29uc3Qgd2FzUGl0Y2hpbmcgPSB0aGlzLnBpdGNoaW5nO1xuICAgICAgICB0aGlzLm1vdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yb3RhdGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBpdGNoaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHdhc1pvb21pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnem9vbWVuZCcsIGV2ZW50RGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdhc1BpdGNoaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ3BpdGNoZW5kJywgZXZlbnREYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpcmUoJ21vdmVlbmQnLCBldmVudERhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW55IGNvbWJpbmF0aW9uIG9mIGNlbnRlciwgem9vbSwgYmVhcmluZywgYW5kIHBpdGNoLCBhbmltYXRpbmcgdGhlIHRyYW5zaXRpb24gYWxvbmcgYSBjdXJ2ZSB0aGF0XG4gICAgICogZXZva2VzIGZsaWdodC4gVGhlIGFuaW1hdGlvbiBzZWFtbGVzc2x5IGluY29ycG9yYXRlcyB6b29taW5nIGFuZCBwYW5uaW5nIHRvIGhlbHBcbiAgICAgKiB0aGUgdXNlciBtYWludGFpbiBoZXIgYmVhcmluZ3MgZXZlbiBhZnRlciB0cmF2ZXJzaW5nIGEgZ3JlYXQgZGlzdGFuY2UuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgZGVzY3JpYmluZyB0aGUgZGVzdGluYXRpb24gYW5kIGFuaW1hdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi5cbiAgICAgKiAgICAgQWNjZXB0cyB7QGxpbmsgQ2FtZXJhT3B0aW9uc30sIHtAbGluayBBbmltYXRpb25PcHRpb25zfSxcbiAgICAgKiAgICAgYW5kIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5jdXJ2ZT0xLjQyXSBUaGUgem9vbWluZyBcImN1cnZlXCIgdGhhdCB3aWxsIG9jY3VyIGFsb25nIHRoZVxuICAgICAqICAgICBmbGlnaHQgcGF0aC4gQSBoaWdoIHZhbHVlIG1heGltaXplcyB6b29taW5nIGZvciBhbiBleGFnZ2VyYXRlZCBhbmltYXRpb24sIHdoaWxlIGEgbG93XG4gICAgICogICAgIHZhbHVlIG1pbmltaXplcyB6b29taW5nIGZvciBhbiBlZmZlY3QgY2xvc2VyIHRvIHtAbGluayBNYXAjZWFzZVRvfS4gMS40MiBpcyB0aGUgYXZlcmFnZVxuICAgICAqICAgICB2YWx1ZSBzZWxlY3RlZCBieSBwYXJ0aWNpcGFudHMgaW4gdGhlIHVzZXIgc3R1ZHkgZGlzY3Vzc2VkIGluXG4gICAgICogICAgIFt2YW4gV2lqayAoMjAwMyldKGh0dHBzOi8vd3d3Lndpbi50dWUubmwvfnZhbndpamsvem9vbXBhbi5wZGYpLiBBIHZhbHVlIG9mXG4gICAgICogICAgIGBNYXRoLnBvdyg2LCAwLjI1KWAgd291bGQgYmUgZXF1aXZhbGVudCB0byB0aGUgcm9vdCBtZWFuIHNxdWFyZWQgYXZlcmFnZSB2ZWxvY2l0eS4gQVxuICAgICAqICAgICB2YWx1ZSBvZiAxIHdvdWxkIHByb2R1Y2UgYSBjaXJjdWxhciBtb3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1pblpvb21dIFRoZSB6ZXJvLWJhc2VkIHpvb20gbGV2ZWwgYXQgdGhlIHBlYWsgb2YgdGhlIGZsaWdodCBwYXRoLiBJZlxuICAgICAqICAgICBgb3B0aW9ucy5jdXJ2ZWAgaXMgc3BlY2lmaWVkLCB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5zcGVlZD0xLjJdIFRoZSBhdmVyYWdlIHNwZWVkIG9mIHRoZSBhbmltYXRpb24gZGVmaW5lZCBpbiByZWxhdGlvbiB0b1xuICAgICAqICAgICBgb3B0aW9ucy5jdXJ2ZWAuIEEgc3BlZWQgb2YgMS4yIG1lYW5zIHRoYXQgdGhlIG1hcCBhcHBlYXJzIHRvIG1vdmUgYWxvbmcgdGhlIGZsaWdodCBwYXRoXG4gICAgICogICAgIGJ5IDEuMiB0aW1lcyBgb3B0aW9ucy5jdXJ2ZWAgc2NyZWVuZnVscyBldmVyeSBzZWNvbmQuIEEgX3NjcmVlbmZ1bF8gaXMgdGhlIG1hcCdzIHZpc2libGUgc3Bhbi5cbiAgICAgKiAgICAgSXQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIGZpeGVkIHBoeXNpY2FsIGRpc3RhbmNlLCBidXQgdmFyaWVzIGJ5IHpvb20gbGV2ZWwuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnNjcmVlblNwZWVkXSBUaGUgYXZlcmFnZSBzcGVlZCBvZiB0aGUgYW5pbWF0aW9uIG1lYXN1cmVkIGluIHNjcmVlbmZ1bHNcbiAgICAgKiAgICAgcGVyIHNlY29uZCwgYXNzdW1pbmcgYSBsaW5lYXIgdGltaW5nIGN1cnZlLiBJZiBgb3B0aW9ucy5zcGVlZGAgaXMgc3BlY2lmaWVkLCB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhEdXJhdGlvbl0gVGhlIGFuaW1hdGlvbidzIG1heGltdW0gZHVyYXRpb24sIG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kcy5cbiAgICAgKiAgICAgSWYgZHVyYXRpb24gZXhjZWVkcyBtYXhpbXVtIGR1cmF0aW9uLCBpdCByZXNldHMgdG8gMC5cbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyB6b29tc3RhcnRcbiAgICAgKiBAZmlyZXMgcGl0Y2hzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlXG4gICAgICogQGZpcmVzIHpvb21cbiAgICAgKiBAZmlyZXMgcm90YXRlXG4gICAgICogQGZpcmVzIHBpdGNoXG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAZmlyZXMgem9vbWVuZFxuICAgICAqIEBmaXJlcyBwaXRjaGVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gZmx5IHdpdGggZGVmYXVsdCBvcHRpb25zIHRvIG51bGwgaXNsYW5kXG4gICAgICogbWFwLmZseVRvKHtjZW50ZXI6IFswLCAwXSwgem9vbTogOX0pO1xuICAgICAqIC8vIHVzaW5nIGZseVRvIG9wdGlvbnNcbiAgICAgKiBtYXAuZmx5VG8oe1xuICAgICAqICAgY2VudGVyOiBbMCwgMF0sXG4gICAgICogICB6b29tOiA5LFxuICAgICAqICAgc3BlZWQ6IDAuMixcbiAgICAgKiAgIGN1cnZlOiAxLFxuICAgICAqICAgZWFzaW5nKHQpIHtcbiAgICAgKiAgICAgcmV0dXJuIHQ7XG4gICAgICogICB9XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRmx5IHRvIGEgbG9jYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmx5dG8vKVxuICAgICAqIEBzZWUgW1Nsb3dseSBmbHkgdG8gYSBsb2NhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9mbHl0by1vcHRpb25zLylcbiAgICAgKiBAc2VlIFtGbHkgdG8gYSBsb2NhdGlvbiBiYXNlZCBvbiBzY3JvbGwgcG9zaXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvc2Nyb2xsLWZseS10by8pXG4gICAgICovXG4gICAgZmx5VG8ob3B0aW9ucywgZXZlbnREYXRhICAgICAgICAgKSB7XG4gICAgICAgIC8vIFRoaXMgbWV0aG9kIGltcGxlbWVudHMgYW4g4oCcb3B0aW1hbCBwYXRo4oCdIGFuaW1hdGlvbiwgYXMgZGV0YWlsZWQgaW46XG4gICAgICAgIC8vXG4gICAgICAgIC8vIFZhbiBXaWprLCBKYXJrZSBKLjsgTnVpaiwgV2ltIEEuIEEuIOKAnFNtb290aCBhbmQgZWZmaWNpZW50IHpvb21pbmcgYW5kIHBhbm5pbmcu4oCdIElORk9WSVNcbiAgICAgICAgLy8gICDigJkwMy4gcHAuIDE14oCTMjIuIDxodHRwczovL3d3dy53aW4udHVlLm5sL352YW53aWprL3pvb21wYW4ucGRmI3BhZ2U9NT4uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdoZXJlIGFwcGxpY2FibGUsIGxvY2FsIHZhcmlhYmxlIGRvY3VtZW50YXRpb24gYmVnaW5zIHdpdGggdGhlIGFzc29jaWF0ZWQgdmFyaWFibGUgb3JcbiAgICAgICAgLy8gZnVuY3Rpb24gaW4gdmFuIFdpamsgKDIwMDMpLlxuXG4gICAgICAgIHRoaXMuc3RvcCgpO1xuXG4gICAgICAgIG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7XG4gICAgICAgICAgICBvZmZzZXQ6IFswLCAwXSxcbiAgICAgICAgICAgIHNwZWVkOiAxLjIsXG4gICAgICAgICAgICBjdXJ2ZTogMS40MixcbiAgICAgICAgICAgIGVhc2luZzogdXRpbC5lYXNlXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBzdGFydFpvb20gPSB0aGlzLmdldFpvb20oKSxcbiAgICAgICAgICAgIHN0YXJ0QmVhcmluZyA9IHRoaXMuZ2V0QmVhcmluZygpLFxuICAgICAgICAgICAgc3RhcnRQaXRjaCA9IHRoaXMuZ2V0UGl0Y2goKTtcblxuICAgICAgICBjb25zdCB6b29tID0gJ3pvb20nIGluIG9wdGlvbnMgPyB1dGlsLmNsYW1wKCtvcHRpb25zLnpvb20sIHRyLm1pblpvb20sIHRyLm1heFpvb20pIDogc3RhcnRab29tO1xuICAgICAgICBjb25zdCBiZWFyaW5nID0gJ2JlYXJpbmcnIGluIG9wdGlvbnMgPyB0aGlzLl9ub3JtYWxpemVCZWFyaW5nKG9wdGlvbnMuYmVhcmluZywgc3RhcnRCZWFyaW5nKSA6IHN0YXJ0QmVhcmluZztcbiAgICAgICAgY29uc3QgcGl0Y2ggPSAncGl0Y2gnIGluIG9wdGlvbnMgPyArb3B0aW9ucy5waXRjaCA6IHN0YXJ0UGl0Y2g7XG5cbiAgICAgICAgY29uc3Qgc2NhbGUgPSB0ci56b29tU2NhbGUoem9vbSAtIHN0YXJ0Wm9vbSk7XG4gICAgICAgIGNvbnN0IHBvaW50QXRPZmZzZXQgPSB0ci5jZW50ZXJQb2ludC5hZGQoUG9pbnQuY29udmVydChvcHRpb25zLm9mZnNldCkpO1xuICAgICAgICBjb25zdCBsb2NhdGlvbkF0T2Zmc2V0ID0gdHIucG9pbnRMb2NhdGlvbihwb2ludEF0T2Zmc2V0KTtcbiAgICAgICAgY29uc3QgY2VudGVyID0gTG5nTGF0LmNvbnZlcnQob3B0aW9ucy5jZW50ZXIgfHwgbG9jYXRpb25BdE9mZnNldCk7XG4gICAgICAgIHRoaXMuX25vcm1hbGl6ZUNlbnRlcihjZW50ZXIpO1xuXG4gICAgICAgIGNvbnN0IGZyb20gPSB0ci5wcm9qZWN0KGxvY2F0aW9uQXRPZmZzZXQpO1xuICAgICAgICBjb25zdCBkZWx0YSA9IHRyLnByb2plY3QoY2VudGVyKS5zdWIoZnJvbSk7XG5cbiAgICAgICAgbGV0IHJobyA9IG9wdGlvbnMuY3VydmU7XG5cbiAgICAgICAgLy8gd+KCgDogSW5pdGlhbCB2aXNpYmxlIHNwYW4sIG1lYXN1cmVkIGluIHBpeGVscyBhdCB0aGUgaW5pdGlhbCBzY2FsZS5cbiAgICAgICAgY29uc3QgdzAgPSBNYXRoLm1heCh0ci53aWR0aCwgdHIuaGVpZ2h0KSxcbiAgICAgICAgICAgIC8vIHfigoE6IEZpbmFsIHZpc2libGUgc3BhbiwgbWVhc3VyZWQgaW4gcGl4ZWxzIHdpdGggcmVzcGVjdCB0byB0aGUgaW5pdGlhbCBzY2FsZS5cbiAgICAgICAgICAgIHcxID0gdzAgLyBzY2FsZSxcbiAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGUgZmxpZ2h0IHBhdGggYXMgcHJvamVjdGVkIG9udG8gdGhlIGdyb3VuZCBwbGFuZSwgbWVhc3VyZWQgaW4gcGl4ZWxzIGZyb21cbiAgICAgICAgICAgIC8vIHRoZSB3b3JsZCBpbWFnZSBvcmlnaW4gYXQgdGhlIGluaXRpYWwgc2NhbGUuXG4gICAgICAgICAgICB1MSA9IGRlbHRhLm1hZygpO1xuXG4gICAgICAgIGlmICgnbWluWm9vbScgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgbWluWm9vbSA9IHV0aWwuY2xhbXAoTWF0aC5taW4ob3B0aW9ucy5taW5ab29tLCBzdGFydFpvb20sIHpvb20pLCB0ci5taW5ab29tLCB0ci5tYXhab29tKTtcbiAgICAgICAgICAgIC8vIHc8c3ViPm08L3N1Yj46IE1heGltdW0gdmlzaWJsZSBzcGFuLCBtZWFzdXJlZCBpbiBwaXhlbHMgd2l0aCByZXNwZWN0IHRvIHRoZSBpbml0aWFsXG4gICAgICAgICAgICAvLyBzY2FsZS5cbiAgICAgICAgICAgIGNvbnN0IHdNYXggPSB3MCAvIHRyLnpvb21TY2FsZShtaW5ab29tIC0gc3RhcnRab29tKTtcbiAgICAgICAgICAgIHJobyA9IE1hdGguc3FydCh3TWF4IC8gdTEgKiAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIM+BwrJcbiAgICAgICAgY29uc3QgcmhvMiA9IHJobyAqIHJobztcblxuICAgICAgICAvKipcbiAgICAgICAgICogcuG1ojogUmV0dXJucyB0aGUgem9vbS1vdXQgZmFjdG9yIGF0IG9uZSBlbmQgb2YgdGhlIGFuaW1hdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGkgMCBmb3IgdGhlIGFzY2VudCBvciAxIGZvciB0aGUgZGVzY2VudC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIHIoaSkge1xuICAgICAgICAgICAgY29uc3QgYiA9ICh3MSAqIHcxIC0gdzAgKiB3MCArIChpID8gLTEgOiAxKSAqIHJobzIgKiByaG8yICogdTEgKiB1MSkgLyAoMiAqIChpID8gdzEgOiB3MCkgKiByaG8yICogdTEpO1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubG9nKE1hdGguc3FydChiICogYiArIDEpIC0gYik7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBzaW5oKG4pIHsgcmV0dXJuIChNYXRoLmV4cChuKSAtIE1hdGguZXhwKC1uKSkgLyAyOyB9XG4gICAgICAgIGZ1bmN0aW9uIGNvc2gobikgeyByZXR1cm4gKE1hdGguZXhwKG4pICsgTWF0aC5leHAoLW4pKSAvIDI7IH1cbiAgICAgICAgZnVuY3Rpb24gdGFuaChuKSB7IHJldHVybiBzaW5oKG4pIC8gY29zaChuKTsgfVxuXG4gICAgICAgIC8vIHLigoA6IFpvb20tb3V0IGZhY3RvciBkdXJpbmcgYXNjZW50LlxuICAgICAgICBjb25zdCByMCA9IHIoMCk7XG5cbiAgICAgICAgLy8gdyhzKTogUmV0dXJucyB0aGUgdmlzaWJsZSBzcGFuIG9uIHRoZSBncm91bmQsIG1lYXN1cmVkIGluIHBpeGVscyB3aXRoIHJlc3BlY3QgdG8gdGhlXG4gICAgICAgIC8vIGluaXRpYWwgc2NhbGUuIEFzc3VtZXMgYW4gYW5ndWxhciBmaWVsZCBvZiB2aWV3IG9mIDIgYXJjdGFuIMK9IOKJiCA1M8KwLlxuICAgICAgICBsZXQgdyAgICAgICAgICAgICAgICAgICAgID0gZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHJldHVybiAoY29zaChyMCkgLyBjb3NoKHIwICsgcmhvICogcykpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHUocyk6IFJldHVybnMgdGhlIGRpc3RhbmNlIGFsb25nIHRoZSBmbGlnaHQgcGF0aCBhcyBwcm9qZWN0ZWQgb250byB0aGUgZ3JvdW5kIHBsYW5lLFxuICAgICAgICAvLyBtZWFzdXJlZCBpbiBwaXhlbHMgZnJvbSB0aGUgd29ybGQgaW1hZ2Ugb3JpZ2luIGF0IHRoZSBpbml0aWFsIHNjYWxlLlxuICAgICAgICBsZXQgdSAgICAgICAgICAgICAgICAgICAgID0gZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHJldHVybiB3MCAqICgoY29zaChyMCkgKiB0YW5oKHIwICsgcmhvICogcykgLSBzaW5oKHIwKSkgLyByaG8yKSAvIHUxO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFM6IFRvdGFsIGxlbmd0aCBvZiB0aGUgZmxpZ2h0IHBhdGgsIG1lYXN1cmVkIGluIM+BLXNjcmVlbmZ1bHMuXG4gICAgICAgIGxldCBTID0gKHIoMSkgLSByMCkgLyByaG87XG5cbiAgICAgICAgLy8gV2hlbiB14oKAID0gdeKCgSwgdGhlIG9wdGltYWwgcGF0aCBkb2VzbuKAmXQgcmVxdWlyZSBib3RoIGFzY2VudCBhbmQgZGVzY2VudC5cbiAgICAgICAgaWYgKE1hdGguYWJzKHUxKSA8IDAuMDAwMDAxIHx8ICFpc0Zpbml0ZShTKSkge1xuICAgICAgICAgICAgLy8gUGVyZm9ybSBhIG1vcmUgb3IgbGVzcyBpbnN0YW50YW5lb3VzIHRyYW5zaXRpb24gaWYgdGhlIHBhdGggaXMgdG9vIHNob3J0LlxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKHcwIC0gdzEpIDwgMC4wMDAwMDEpIHJldHVybiB0aGlzLmVhc2VUbyhvcHRpb25zLCBldmVudERhdGEpO1xuXG4gICAgICAgICAgICBjb25zdCBrID0gdzEgPCB3MCA/IC0xIDogMTtcbiAgICAgICAgICAgIFMgPSBNYXRoLmFicyhNYXRoLmxvZyh3MSAvIHcwKSkgLyByaG87XG5cbiAgICAgICAgICAgIHUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4gICAgICAgICAgICB3ID0gZnVuY3Rpb24ocykgeyByZXR1cm4gTWF0aC5leHAoayAqIHJobyAqIHMpOyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCdkdXJhdGlvbicgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucy5kdXJhdGlvbiA9ICtvcHRpb25zLmR1cmF0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgViA9ICdzY3JlZW5TcGVlZCcgaW4gb3B0aW9ucyA/ICtvcHRpb25zLnNjcmVlblNwZWVkIC8gcmhvIDogK29wdGlvbnMuc3BlZWQ7XG4gICAgICAgICAgICBvcHRpb25zLmR1cmF0aW9uID0gMTAwMCAqIFMgLyBWO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubWF4RHVyYXRpb24gJiYgb3B0aW9ucy5kdXJhdGlvbiA+IG9wdGlvbnMubWF4RHVyYXRpb24pIHtcbiAgICAgICAgICAgIG9wdGlvbnMuZHVyYXRpb24gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy56b29taW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yb3RhdGluZyA9IChzdGFydEJlYXJpbmcgIT09IGJlYXJpbmcpO1xuICAgICAgICB0aGlzLnBpdGNoaW5nID0gKHBpdGNoICE9PSBzdGFydFBpdGNoKTtcblxuICAgICAgICB0aGlzLl9wcmVwYXJlRWFzZShldmVudERhdGEsIGZhbHNlKTtcblxuICAgICAgICB0aGlzLl9lYXNlKChrKSA9PiB7XG4gICAgICAgICAgICAvLyBzOiBUaGUgZGlzdGFuY2UgdHJhdmVsZWQgYWxvbmcgdGhlIGZsaWdodCBwYXRoLCBtZWFzdXJlZCBpbiDPgS1zY3JlZW5mdWxzLlxuICAgICAgICAgICAgY29uc3QgcyA9IGsgKiBTO1xuICAgICAgICAgICAgY29uc3Qgc2NhbGUgPSAxIC8gdyhzKTtcbiAgICAgICAgICAgIHRyLnpvb20gPSBzdGFydFpvb20gKyB0ci5zY2FsZVpvb20oc2NhbGUpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5yb3RhdGluZykge1xuICAgICAgICAgICAgICAgIHRyLmJlYXJpbmcgPSBpbnRlcnBvbGF0ZShzdGFydEJlYXJpbmcsIGJlYXJpbmcsIGspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucGl0Y2hpbmcpIHtcbiAgICAgICAgICAgICAgICB0ci5waXRjaCA9IGludGVycG9sYXRlKHN0YXJ0UGl0Y2gsIHBpdGNoLCBrKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbmV3Q2VudGVyID0gdHIudW5wcm9qZWN0KGZyb20uYWRkKGRlbHRhLm11bHQodShzKSkpLm11bHQoc2NhbGUpKTtcbiAgICAgICAgICAgIHRyLnNldExvY2F0aW9uQXRQb2ludCh0ci5yZW5kZXJXb3JsZENvcGllcyA/IG5ld0NlbnRlci53cmFwKCkgOiBuZXdDZW50ZXIsIHBvaW50QXRPZmZzZXQpO1xuXG4gICAgICAgICAgICB0aGlzLl9maXJlTW92ZUV2ZW50cyhldmVudERhdGEpO1xuXG4gICAgICAgIH0sICgpID0+IHRoaXMuX2FmdGVyRWFzZShldmVudERhdGEpLCBvcHRpb25zKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpc0Vhc2luZygpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5faXNFYXNpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjYW1lcmEgaXMgbW92aW5nLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcmV0dXJucyBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjYW1lcmEgaXMgbW92aW5nLlxuICAgICAqL1xuICAgIGlzTW92aW5nKCkgICAgICAgICAge1xuICAgICAgICByZXR1cm4gdGhpcy5tb3Zpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcHMgYW55IGFuaW1hdGVkIHRyYW5zaXRpb24gdW5kZXJ3YXkuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHN0b3AoKSAgICAgICB7XG4gICAgICAgIGlmICh0aGlzLl9vbkZyYW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9maW5pc2hBbmltYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfZWFzZShmcmFtZSAgICAgICAgICAgICAgICAgICxcbiAgICAgICAgICBmaW5pc2ggICAgICAgICAgICAsXG4gICAgICAgICAgb3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRlID09PSBmYWxzZSB8fCBvcHRpb25zLmR1cmF0aW9uID09PSAwKSB7XG4gICAgICAgICAgICBmcmFtZSgxKTtcbiAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZWFzZVN0YXJ0ID0gYnJvd3Nlci5ub3coKTtcbiAgICAgICAgICAgIHRoaXMuX2lzRWFzaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2Vhc2VPcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0QW5pbWF0aW9uKChfKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IE1hdGgubWluKChicm93c2VyLm5vdygpIC0gdGhpcy5fZWFzZVN0YXJ0KSAvIHRoaXMuX2Vhc2VPcHRpb25zLmR1cmF0aW9uLCAxKTtcbiAgICAgICAgICAgICAgICBmcmFtZSh0aGlzLl9lYXNlT3B0aW9ucy5lYXNpbmcodCkpO1xuICAgICAgICAgICAgICAgIGlmICh0ID09PSAxKSB0aGlzLnN0b3AoKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0Vhc2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFNob3VsZCBiZSBjYWxsZWQgYXQgdGhlIHRvcCBvZiB0aGUgcmVuZGVyIGxvb3AgdG8gdXBkYXRlIGNhbWVyYSBwb3NpdGlvblxuICAgICAqIGFuZCBvcmllbnRhdGlvbiBiZWZvcmUgdGhleSdyZSByZWFkIGJ5IGFueSByZW5kZXJpbmcgbG9naWMuXG4gICAgICovXG4gICAgX3VwZGF0ZUNhbWVyYSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX29uRnJhbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX29uRnJhbWUodGhpcy50cmFuc2Zvcm0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBTdGFydCB0aGUgY2FtZXJhIGFuaW1hdGlvbiB1c2luZyB0aGUgZ2l2ZW4gb25GcmFtZSBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvbkZyYW1lIEEgY2FsbGJhY2sgcmVzcG9uc2libGUgZm9yIHVwZGF0aW5nIHRoZSB0cmFuc2Zvcm0gdG8gcmVmbGVjdCB0aGUgZGVzaXJlZCBjYW1lcmEgcG9zaXRpb24gYW5kIG9yaWVudGF0aW9uLCBhbmQgYWxzbyBmb3IgZmlyaW5nIGFueSByZWxldmFudCBjYW1lcmEgbW92ZW1lbnQgZXZlbnRzLlxuICAgICAqIEBwYXJhbSBmaW5pc2ggQSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoaXMgYW5pbWF0aW9uIGlzIHN0b3BwZWQgKGkuZS4sIHdoZW4gYENhbWVyYSNzdG9wKClgIGlzIGNhbGxlZCkuXG4gICAgICovXG4gICAgX3N0YXJ0QW5pbWF0aW9uKG9uRnJhbWUgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaCAgICAgICAgICAgICA9ICgpID0+IHt9KSAgICAgICB7XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgICB0aGlzLl9vbkZyYW1lID0gb25GcmFtZTtcbiAgICAgICAgdGhpcy5fZmluaXNoRm4gPSBmaW5pc2g7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfZmluaXNoQW5pbWF0aW9uKCkge1xuICAgICAgICBkZWxldGUgdGhpcy5fb25GcmFtZTtcbiAgICAgICAgLy8gVGhlIGZpbmlzaCBmdW5jdGlvbiBtaWdodCBlbWl0IGV2ZW50cyB3aGljaCB0cmlnZ2VyIG5ldyBhbmltYXRpb24sXG4gICAgICAgIC8vIHdoaWNoIHNldHMgYSBuZXcgX2ZpbmlzaEZuLiBFbnN1cmUgd2UgZG9uJ3QgZGVsZXRlIGl0XG4gICAgICAgIC8vIHVuaW50ZW50aW9uYWxseS5cbiAgICAgICAgY29uc3QgZmluaXNoID0gdGhpcy5fZmluaXNoRm47XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9maW5pc2hGbjtcbiAgICAgICAgZmluaXNoLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBiZWFyaW5nIHNvIHRoYXQgaXQncyBudW1lcmljYWxseSBjbG9zZSB0byB0aGUgY3VycmVudCBvbmUgc28gdGhhdCBpdCBpbnRlcnBvbGF0ZXMgcHJvcGVybHlcbiAgICBfbm9ybWFsaXplQmVhcmluZyhiZWFyaW5nICAgICAgICAsIGN1cnJlbnRCZWFyaW5nICAgICAgICApIHtcbiAgICAgICAgYmVhcmluZyA9IHV0aWwud3JhcChiZWFyaW5nLCAtMTgwLCAxODApO1xuICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5hYnMoYmVhcmluZyAtIGN1cnJlbnRCZWFyaW5nKTtcbiAgICAgICAgaWYgKE1hdGguYWJzKGJlYXJpbmcgLSAzNjAgLSBjdXJyZW50QmVhcmluZykgPCBkaWZmKSBiZWFyaW5nIC09IDM2MDtcbiAgICAgICAgaWYgKE1hdGguYWJzKGJlYXJpbmcgKyAzNjAgLSBjdXJyZW50QmVhcmluZykgPCBkaWZmKSBiZWFyaW5nICs9IDM2MDtcbiAgICAgICAgcmV0dXJuIGJlYXJpbmc7XG4gICAgfVxuXG4gICAgLy8gSWYgYSBwYXRoIGNyb3NzaW5nIHRoZSBhbnRpbWVyaWRpYW4gd291bGQgYmUgc2hvcnRlciwgZXh0ZW5kIHRoZSBmaW5hbCBjb29yZGluYXRlIHNvIHRoYXRcbiAgICAvLyBpbnRlcnBvbGF0aW5nIGJldHdlZW4gdGhlIHR3byBlbmRwb2ludHMgd2lsbCBjcm9zcyBpdC5cbiAgICBfbm9ybWFsaXplQ2VudGVyKGNlbnRlciAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy50cmFuc2Zvcm07XG4gICAgICAgIGlmICghdHIucmVuZGVyV29ybGRDb3BpZXMgfHwgdHIubG5nUmFuZ2UpIHJldHVybjtcblxuICAgICAgICBjb25zdCBkZWx0YSA9IGNlbnRlci5sbmcgLSB0ci5jZW50ZXIubG5nO1xuICAgICAgICBjZW50ZXIubG5nICs9XG4gICAgICAgICAgICBkZWx0YSA+IDE4MCA/IC0zNjAgOlxuICAgICAgICAgICAgZGVsdGEgPCAtMTgwID8gMzYwIDogMDtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ2FtZXJhO1xuIiwiLy8gICAgICBcblxuY29uc3QgRE9NID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsL3V0aWwnKTtcbmNvbnN0IGNvbmZpZyA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvY29uZmlnJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4vKipcbiAqIEFuIGBBdHRyaWJ1dGlvbkNvbnRyb2xgIGNvbnRyb2wgcHJlc2VudHMgdGhlIG1hcCdzIFthdHRyaWJ1dGlvbiBpbmZvcm1hdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9oZWxwL2F0dHJpYnV0aW9uLykuXG4gKlxuICogQGltcGxlbWVudHMge0lDb250cm9sfVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jb21wYWN0XSBJZiBgdHJ1ZWAgZm9yY2UgYSBjb21wYWN0IGF0dHJpYnV0aW9uIHRoYXQgc2hvd3MgdGhlIGZ1bGwgYXR0cmlidXRpb24gb24gbW91c2UgaG92ZXIsIG9yIGlmIGBmYWxzZWAgZm9yY2UgdGhlIGZ1bGwgYXR0cmlidXRpb24gY29udHJvbC4gVGhlIGRlZmF1bHQgaXMgYSByZXNwb25zaXZlIGF0dHJpYnV0aW9uIHRoYXQgY29sbGFwc2VzIHdoZW4gdGhlIG1hcCBpcyBsZXNzIHRoYW4gNjQwIHBpeGVscyB3aWRlLlxuICogQGV4YW1wbGVcbiAqIHZhciBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHthdHRyaWJ1dGlvbkNvbnRyb2w6IGZhbHNlfSlcbiAqICAgICAuYWRkQ29udHJvbChuZXcgbWFwYm94Z2wuQXR0cmlidXRpb25Db250cm9sKHtcbiAqICAgICAgICAgY29tcGFjdDogdHJ1ZVxuICogICAgIH0pKTtcbiAqL1xuY2xhc3MgQXR0cmlidXRpb25Db250cm9sIHtcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zICAgICApIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICB1dGlsLmJpbmRBbGwoW1xuICAgICAgICAgICAgJ191cGRhdGVFZGl0TGluaycsXG4gICAgICAgICAgICAnX3VwZGF0ZURhdGEnLFxuICAgICAgICAgICAgJ191cGRhdGVDb21wYWN0J1xuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICBnZXREZWZhdWx0UG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiAnYm90dG9tLXJpZ2h0JztcbiAgICB9XG5cbiAgICBvbkFkZChtYXAgICAgICkge1xuICAgICAgICBjb25zdCBjb21wYWN0ID0gdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5jb21wYWN0O1xuXG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWN0cmwgbWFwYm94Z2wtY3RybC1hdHRyaWInKTtcblxuICAgICAgICBpZiAoY29tcGFjdCkge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWNvbXBhY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUF0dHJpYnV0aW9ucygpO1xuICAgICAgICB0aGlzLl91cGRhdGVFZGl0TGluaygpO1xuXG4gICAgICAgIHRoaXMuX21hcC5vbignc291cmNlZGF0YScsIHRoaXMuX3VwZGF0ZURhdGEpO1xuICAgICAgICB0aGlzLl9tYXAub24oJ21vdmVlbmQnLCB0aGlzLl91cGRhdGVFZGl0TGluayk7XG5cbiAgICAgICAgaWYgKGNvbXBhY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdyZXNpemUnLCB0aGlzLl91cGRhdGVDb21wYWN0KTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNvbXBhY3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIERPTS5yZW1vdmUodGhpcy5fY29udGFpbmVyKTtcblxuICAgICAgICB0aGlzLl9tYXAub2ZmKCdzb3VyY2VkYXRhJywgdGhpcy5fdXBkYXRlRGF0YSk7XG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdmVlbmQnLCB0aGlzLl91cGRhdGVFZGl0TGluayk7XG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ3Jlc2l6ZScsIHRoaXMuX3VwZGF0ZUNvbXBhY3QpO1xuXG4gICAgICAgIHRoaXMuX21hcCA9ICh1bmRlZmluZWQgICAgICk7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUVkaXRMaW5rKCkge1xuICAgICAgICBsZXQgZWRpdExpbmsgPSB0aGlzLl9lZGl0TGluaztcbiAgICAgICAgaWYgKCFlZGl0TGluaykge1xuICAgICAgICAgICAgZWRpdExpbmsgPSB0aGlzLl9lZGl0TGluayA9ICh0aGlzLl9jb250YWluZXIucXVlcnlTZWxlY3RvcignLm1hcGJveC1pbXByb3ZlLW1hcCcpICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0gW1xuICAgICAgICAgICAge2tleTogXCJvd25lclwiLCB2YWx1ZTogdGhpcy5zdHlsZU93bmVyfSxcbiAgICAgICAgICAgIHtrZXk6IFwiaWRcIiwgdmFsdWU6IHRoaXMuc3R5bGVJZH0sXG4gICAgICAgICAgICB7a2V5OiBcImFjY2Vzc190b2tlblwiLCB2YWx1ZTogY29uZmlnLkFDQ0VTU19UT0tFTn1cbiAgICAgICAgXTtcblxuICAgICAgICBpZiAoZWRpdExpbmspIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtU3RyaW5nID0gcGFyYW1zLnJlZHVjZSgoYWNjLCBuZXh0LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG5leHQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjICs9IGAke25leHQua2V5fT0ke25leHQudmFsdWV9JHtpIDwgcGFyYW1zLmxlbmd0aCAtIDEgPyAnJicgOiAnJ31gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfSwgYD9gKTtcbiAgICAgICAgICAgIGVkaXRMaW5rLmhyZWYgPSBgaHR0cHM6Ly93d3cubWFwYm94LmNvbS9mZWVkYmFjay8ke3BhcmFtU3RyaW5nfSR7dGhpcy5fbWFwLl9oYXNoID8gdGhpcy5fbWFwLl9oYXNoLmdldEhhc2hTdHJpbmcodHJ1ZSkgOiAnJ31gO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZURhdGEoZSAgICAgKSB7XG4gICAgICAgIGlmIChlICYmIGUuc291cmNlRGF0YVR5cGUgPT09ICdtZXRhZGF0YScpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUF0dHJpYnV0aW9ucygpO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlRWRpdExpbmsoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVBdHRyaWJ1dGlvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWFwLnN0eWxlKSByZXR1cm47XG4gICAgICAgIGxldCBhdHRyaWJ1dGlvbnMgICAgICAgICAgICAgICAgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy5fbWFwLnN0eWxlLnN0eWxlc2hlZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlc2hlZXQgICAgICA9IHRoaXMuX21hcC5zdHlsZS5zdHlsZXNoZWV0O1xuICAgICAgICAgICAgdGhpcy5zdHlsZU93bmVyID0gc3R5bGVzaGVldC5vd25lcjtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVJZCA9IHN0eWxlc2hlZXQuaWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZXMgPSB0aGlzLl9tYXAuc3R5bGUuc291cmNlQ2FjaGVzO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gc291cmNlQ2FjaGVzW2lkXS5nZXRTb3VyY2UoKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2UuYXR0cmlidXRpb24gJiYgYXR0cmlidXRpb25zLmluZGV4T2Yoc291cmNlLmF0dHJpYnV0aW9uKSA8IDApIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbnMucHVzaChzb3VyY2UuYXR0cmlidXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGFueSBlbnRyaWVzIHRoYXQgYXJlIHN1YnN0cmluZ3Mgb2YgYW5vdGhlciBlbnRyeS5cbiAgICAgICAgLy8gZmlyc3Qgc29ydCBieSBsZW5ndGggc28gdGhhdCBzdWJzdHJpbmdzIGNvbWUgZmlyc3RcbiAgICAgICAgYXR0cmlidXRpb25zLnNvcnQoKGEsIGIpID0+IGEubGVuZ3RoIC0gYi5sZW5ndGgpO1xuICAgICAgICBhdHRyaWJ1dGlvbnMgPSBhdHRyaWJ1dGlvbnMuZmlsdGVyKChhdHRyaWIsIGkpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IGF0dHJpYnV0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGlvbnNbal0uaW5kZXhPZihhdHRyaWIpID49IDApIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChhdHRyaWJ1dGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuaW5uZXJIVE1MID0gYXR0cmlidXRpb25zLmpvaW4oJyB8ICcpO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWF0dHJpYi1lbXB0eScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWF0dHJpYi1lbXB0eScpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlbW92ZSBvbGQgRE9NIG5vZGUgZnJvbSBfZWRpdExpbmtcbiAgICAgICAgdGhpcy5fZWRpdExpbmsgPSBudWxsO1xuICAgIH1cblxuICAgIF91cGRhdGVDb21wYWN0KCkge1xuICAgICAgICBpZiAodGhpcy5fbWFwLmdldENhbnZhc0NvbnRhaW5lcigpLm9mZnNldFdpZHRoIDw9IDY0MCkge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWNvbXBhY3QnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jb21wYWN0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBBdHRyaWJ1dGlvbkNvbnRyb2w7XG4iLCIvLyAgICAgIFxuXG5jb25zdCBET00gPSByZXF1aXJlKCcuLi8uLi91dGlsL2RvbScpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xuY29uc3Qgd2luZG93ID0gcmVxdWlyZSgnLi4vLi4vdXRpbC93aW5kb3cnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbi8qKlxuICogQSBgRnVsbHNjcmVlbkNvbnRyb2xgIGNvbnRyb2wgY29udGFpbnMgYSBidXR0b24gZm9yIHRvZ2dsaW5nIHRoZSBtYXAgaW4gYW5kIG91dCBvZiBmdWxsc2NyZWVuIG1vZGUuXG4gKlxuICogQGltcGxlbWVudHMge0lDb250cm9sfVxuICogQGV4YW1wbGVcbiAqIG1hcC5hZGRDb250cm9sKG5ldyBtYXBib3hnbC5GdWxsc2NyZWVuQ29udHJvbCgpKTtcbiAqIEBzZWUgW1ZpZXcgYSBmdWxsc2NyZWVuIG1hcF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9mdWxsc2NyZWVuLylcbiAqL1xuXG5jbGFzcyBGdWxsc2NyZWVuQ29udHJvbCB7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9mdWxsc2NyZWVuID0gZmFsc2U7XG4gICAgICAgIHV0aWwuYmluZEFsbChbXG4gICAgICAgICAgICAnX29uQ2xpY2tGdWxsc2NyZWVuJyxcbiAgICAgICAgICAgICdfY2hhbmdlSWNvbidcbiAgICAgICAgXSwgdGhpcyk7XG4gICAgICAgIGlmICgnb25mdWxsc2NyZWVuY2hhbmdlJyBpbiB3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2Z1bGxzY3JlZW5jaGFuZ2UgPSAnZnVsbHNjcmVlbmNoYW5nZSc7XG4gICAgICAgIH0gZWxzZSBpZiAoJ29ubW96ZnVsbHNjcmVlbmNoYW5nZScgaW4gd2luZG93LmRvY3VtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9mdWxsc2NyZWVuY2hhbmdlID0gJ21vemZ1bGxzY3JlZW5jaGFuZ2UnO1xuICAgICAgICB9IGVsc2UgaWYgKCdvbndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnIGluIHdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgICAgICAgdGhpcy5fZnVsbHNjcmVlbmNoYW5nZSA9ICd3ZWJraXRmdWxsc2NyZWVuY2hhbmdlJztcbiAgICAgICAgfSBlbHNlIGlmICgnb25tc2Z1bGxzY3JlZW5jaGFuZ2UnIGluIHdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgICAgICAgdGhpcy5fZnVsbHNjcmVlbmNoYW5nZSA9ICdNU0Z1bGxzY3JlZW5DaGFuZ2UnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NsYXNzTmFtZSA9ICdtYXBib3hnbC1jdHJsJztcbiAgICB9XG5cbiAgICBvbkFkZChtYXAgICAgICkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX21hcENvbnRhaW5lciA9IHRoaXMuX21hcC5nZXRDb250YWluZXIoKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgYCR7dGhpcy5fY2xhc3NOYW1lfSBtYXBib3hnbC1jdHJsLWdyb3VwYCk7XG4gICAgICAgIGlmICh0aGlzLl9jaGVja0Z1bGxzY3JlZW5TdXBwb3J0KCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldHVwVUkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgdXRpbC53YXJuT25jZSgnVGhpcyBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBmdWxsc2NyZWVuIG1vZGUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBvblJlbW92ZSgpIHtcbiAgICAgICAgRE9NLnJlbW92ZSh0aGlzLl9jb250YWluZXIpO1xuICAgICAgICB0aGlzLl9tYXAgPSAobnVsbCAgICAgKTtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5fZnVsbHNjcmVlbmNoYW5nZSwgdGhpcy5fY2hhbmdlSWNvbik7XG4gICAgfVxuXG4gICAgX2NoZWNrRnVsbHNjcmVlblN1cHBvcnQoKSB7XG4gICAgICAgIHJldHVybiAhIShcbiAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5mdWxsc2NyZWVuRW5hYmxlZCB8fFxuICAgICAgICAgICAgKHdpbmRvdy5kb2N1bWVudCAgICAgKS5tb3pGdWxsU2NyZWVuRW5hYmxlZCB8fFxuICAgICAgICAgICAgKHdpbmRvdy5kb2N1bWVudCAgICAgKS5tc0Z1bGxzY3JlZW5FbmFibGVkIHx8XG4gICAgICAgICAgICAod2luZG93LmRvY3VtZW50ICAgICApLndlYmtpdEZ1bGxzY3JlZW5FbmFibGVkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgX3NldHVwVUkoKSB7XG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuX2Z1bGxzY3JlZW5CdXR0b24gPSBET00uY3JlYXRlKCdidXR0b24nLCAoYCR7dGhpcy5fY2xhc3NOYW1lfS1pY29uICR7dGhpcy5fY2xhc3NOYW1lfS1mdWxsc2NyZWVuYCksIHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiVG9nZ2xlIGZ1bGxzY3JlZW5cIik7XG4gICAgICAgIGJ1dHRvbi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgIHRoaXMuX2Z1bGxzY3JlZW5CdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrRnVsbHNjcmVlbik7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHRoaXMuX2Z1bGxzY3JlZW5jaGFuZ2UsIHRoaXMuX2NoYW5nZUljb24pO1xuICAgIH1cblxuICAgIF9pc0Z1bGxzY3JlZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mdWxsc2NyZWVuO1xuICAgIH1cblxuICAgIF9jaGFuZ2VJY29uKCkge1xuICAgICAgICBjb25zdCBmdWxsc2NyZWVuRWxlbWVudCA9XG4gICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgfHxcbiAgICAgICAgICAgICh3aW5kb3cuZG9jdW1lbnQgICAgICkubW96RnVsbFNjcmVlbkVsZW1lbnQgfHxcbiAgICAgICAgICAgICh3aW5kb3cuZG9jdW1lbnQgICAgICkud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQgfHxcbiAgICAgICAgICAgICh3aW5kb3cuZG9jdW1lbnQgICAgICkubXNGdWxsc2NyZWVuRWxlbWVudDtcblxuICAgICAgICBpZiAoKGZ1bGxzY3JlZW5FbGVtZW50ID09PSB0aGlzLl9tYXBDb250YWluZXIpICE9PSB0aGlzLl9mdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICB0aGlzLl9mdWxsc2NyZWVuID0gIXRoaXMuX2Z1bGxzY3JlZW47XG4gICAgICAgICAgICB0aGlzLl9mdWxsc2NyZWVuQnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoYCR7dGhpcy5fY2xhc3NOYW1lfS1zaHJpbmtgKTtcbiAgICAgICAgICAgIHRoaXMuX2Z1bGxzY3JlZW5CdXR0b24uY2xhc3NMaXN0LnRvZ2dsZShgJHt0aGlzLl9jbGFzc05hbWV9LWZ1bGxzY3JlZW5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbkNsaWNrRnVsbHNjcmVlbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzRnVsbHNjcmVlbigpKSB7XG4gICAgICAgICAgICBpZiAod2luZG93LmRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgKHdpbmRvdy5kb2N1bWVudCAgICAgKS5leGl0RnVsbHNjcmVlbigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh3aW5kb3cuZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbikge1xuICAgICAgICAgICAgICAgICh3aW5kb3cuZG9jdW1lbnQgICAgICkubW96Q2FuY2VsRnVsbFNjcmVlbigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh3aW5kb3cuZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgICh3aW5kb3cuZG9jdW1lbnQgICAgICkubXNFeGl0RnVsbHNjcmVlbigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh3aW5kb3cuZG9jdW1lbnQud2Via2l0Q2FuY2VsRnVsbFNjcmVlbikge1xuICAgICAgICAgICAgICAgICh3aW5kb3cuZG9jdW1lbnQgICAgICkud2Via2l0Q2FuY2VsRnVsbFNjcmVlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX21hcENvbnRhaW5lci5yZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgdGhpcy5fbWFwQ29udGFpbmVyLnJlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbWFwQ29udGFpbmVyLm1velJlcXVlc3RGdWxsU2NyZWVuKSB7XG4gICAgICAgICAgICAodGhpcy5fbWFwQ29udGFpbmVyICAgICApLm1velJlcXVlc3RGdWxsU2NyZWVuKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbWFwQ29udGFpbmVyLm1zUmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICh0aGlzLl9tYXBDb250YWluZXIgICAgICkubXNSZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX21hcENvbnRhaW5lci53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgKHRoaXMuX21hcENvbnRhaW5lciAgICAgKS53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bGxzY3JlZW5Db250cm9sO1xuIiwiLy8gICAgICBcblxuY29uc3QgRXZlbnRlZCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZXZlbnRlZCcpO1xuY29uc3QgRE9NID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKTtcbmNvbnN0IHdpbmRvdyA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvd2luZG93Jyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcbmNvbnN0IExuZ0xhdCA9IHJlcXVpcmUoJy4uLy4uL2dlby9sbmdfbGF0Jyk7XG5jb25zdCBNYXJrZXIgPSByZXF1aXJlKCcuLi9tYXJrZXInKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIHBvc2l0aW9uT3B0aW9uczoge1xuICAgICAgICBlbmFibGVIaWdoQWNjdXJhY3k6IGZhbHNlLFxuICAgICAgICB0aW1lb3V0OiA2MDAwIC8qIDYgc2VjICovXG4gICAgfSxcbiAgICBmaXRCb3VuZHNPcHRpb25zOiB7XG4gICAgICAgIG1heFpvb206IDE1XG4gICAgfSxcbiAgICB0cmFja1VzZXJMb2NhdGlvbjogZmFsc2UsXG4gICAgc2hvd1VzZXJMb2NhdGlvbjogdHJ1ZVxufTtcbmNvbnN0IGNsYXNzTmFtZSA9ICdtYXBib3hnbC1jdHJsJztcblxubGV0IHN1cHBvcnRzR2VvbG9jYXRpb247XG5cbmZ1bmN0aW9uIGNoZWNrR2VvbG9jYXRpb25TdXBwb3J0KGNhbGxiYWNrKSB7XG4gICAgaWYgKHN1cHBvcnRzR2VvbG9jYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYWxsYmFjayhzdXBwb3J0c0dlb2xvY2F0aW9uKTtcblxuICAgIH0gZWxzZSBpZiAod2luZG93Lm5hdmlnYXRvci5wZXJtaXNzaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIG5hdmlnYXRvci5wZXJtaXNzaW9ucyBoYXMgaW5jb21wbGV0ZSBicm93c2VyIHN1cHBvcnRcbiAgICAgICAgLy8gaHR0cDovL2Nhbml1c2UuY29tLyNmZWF0PXBlcm1pc3Npb25zLWFwaVxuICAgICAgICAvLyBUZXN0IGZvciB0aGUgY2FzZSB3aGVyZSBhIGJyb3dzZXIgZGlzYWJsZXMgR2VvbG9jYXRpb24gYmVjYXVzZSBvZiBhblxuICAgICAgICAvLyBpbnNlY3VyZSBvcmlnaW5cbiAgICAgICAgd2luZG93Lm5hdmlnYXRvci5wZXJtaXNzaW9ucy5xdWVyeSh7IG5hbWU6ICdnZW9sb2NhdGlvbicgfSkudGhlbigocCkgPT4ge1xuICAgICAgICAgICAgc3VwcG9ydHNHZW9sb2NhdGlvbiA9IHAuc3RhdGUgIT09ICdkZW5pZWQnO1xuICAgICAgICAgICAgY2FsbGJhY2soc3VwcG9ydHNHZW9sb2NhdGlvbik7XG4gICAgICAgIH0pO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3VwcG9ydHNHZW9sb2NhdGlvbiA9ICEhd2luZG93Lm5hdmlnYXRvci5nZW9sb2NhdGlvbjtcbiAgICAgICAgY2FsbGJhY2soc3VwcG9ydHNHZW9sb2NhdGlvbik7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgYEdlb2xvY2F0ZUNvbnRyb2xgIGNvbnRyb2wgcHJvdmlkZXMgYSBidXR0b24gdGhhdCB1c2VzIHRoZSBicm93c2VyJ3MgZ2VvbG9jYXRpb25cbiAqIEFQSSB0byBsb2NhdGUgdGhlIHVzZXIgb24gdGhlIG1hcC5cbiAqXG4gKiBOb3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgZ2VvbG9jYXRpb24sXG4gKiBhbmQgc29tZSB1c2VycyBtYXkgZGlzYWJsZSB0aGUgZmVhdHVyZS4gR2VvbG9jYXRpb24gc3VwcG9ydCBmb3IgbW9kZXJuXG4gKiBicm93c2VycyBpbmNsdWRpbmcgQ2hyb21lIHJlcXVpcmVzIHNpdGVzIHRvIGJlIHNlcnZlZCBvdmVyIEhUVFBTLiBJZlxuICogZ2VvbG9jYXRpb24gc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlLCB0aGUgR2VvbG9jYXRlQ29udHJvbCB3aWxsIG5vdFxuICogYmUgdmlzaWJsZS5cbiAqXG4gKiBUaGUgem9vbSBsZXZlbCBhcHBsaWVkIHdpbGwgZGVwZW5kIG9uIHRoZSBhY2N1cmFjeSBvZiB0aGUgZ2VvbG9jYXRpb24gcHJvdmlkZWQgYnkgdGhlIGRldmljZS5cbiAqXG4gKiBUaGUgR2VvbG9jYXRlQ29udHJvbCBoYXMgdHdvIG1vZGVzLiBJZiBgdHJhY2tVc2VyTG9jYXRpb25gIGlzIGBmYWxzZWAgKGRlZmF1bHQpIHRoZSBjb250cm9sIGFjdHMgYXMgYSBidXR0b24sIHdoaWNoIHdoZW4gcHJlc3NlZCB3aWxsIHNldCB0aGUgbWFwJ3MgY2FtZXJhIHRvIHRhcmdldCB0aGUgdXNlciBsb2NhdGlvbi4gSWYgdGhlIHVzZXIgbW92ZXMsIHRoZSBtYXAgd29uJ3QgdXBkYXRlLiBUaGlzIGlzIG1vc3Qgc3VpdGVkIGZvciB0aGUgZGVza3RvcC4gSWYgYHRyYWNrVXNlckxvY2F0aW9uYCBpcyBgdHJ1ZWAgdGhlIGNvbnRyb2wgYWN0cyBhcyBhIHRvZ2dsZSBidXR0b24gdGhhdCB3aGVuIGFjdGl2ZSB0aGUgdXNlcidzIGxvY2F0aW9uIGlzIGFjdGl2ZWx5IG1vbml0b3JlZCBmb3IgY2hhbmdlcy4gSW4gdGhpcyBtb2RlIHRoZSBHZW9sb2NhdGVDb250cm9sIGhhcyB0aHJlZSBzdGF0ZXM6XG4gKiAqIGFjdGl2ZSAtIHRoZSBtYXAncyBjYW1lcmEgYXV0b21hdGljYWxseSB1cGRhdGVzIGFzIHRoZSB1c2VyJ3MgbG9jYXRpb24gY2hhbmdlcywga2VlcGluZyB0aGUgbG9jYXRpb24gZG90IGluIHRoZSBjZW50ZXIuXG4gKiAqIHBhc3NpdmUgLSB0aGUgdXNlcidzIGxvY2F0aW9uIGRvdCBhdXRvbWF0aWNhbGx5IHVwZGF0ZXMsIGJ1dCB0aGUgbWFwJ3MgY2FtZXJhIGRvZXMgbm90LlxuICogKiBkaXNhYmxlZFxuICpcbiAqIEBpbXBsZW1lbnRzIHtJQ29udHJvbH1cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5wb3NpdGlvbk9wdGlvbnM9e2VuYWJsZUhpZ2hBY2N1cmFjeTogZmFsc2UsIHRpbWVvdXQ6IDYwMDB9XSBBIEdlb2xvY2F0aW9uIEFQSSBbUG9zaXRpb25PcHRpb25zXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUG9zaXRpb25PcHRpb25zKSBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuZml0Qm91bmRzT3B0aW9ucz17bWF4Wm9vbTogMTV9XSBBIFtgZml0Qm91bmRzYF0oI01hcCNmaXRCb3VuZHMpIG9wdGlvbnMgb2JqZWN0IHRvIHVzZSB3aGVuIHRoZSBtYXAgaXMgcGFubmVkIGFuZCB6b29tZWQgdG8gdGhlIHVzZXIncyBsb2NhdGlvbi4gVGhlIGRlZmF1bHQgaXMgdG8gdXNlIGEgYG1heFpvb21gIG9mIDE1IHRvIGxpbWl0IGhvdyBmYXIgdGhlIG1hcCB3aWxsIHpvb20gaW4gZm9yIHZlcnkgYWNjdXJhdGUgbG9jYXRpb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uPWZhbHNlXSBJZiBgdHJ1ZWAgdGhlIEdlb2xvY2F0ZSBDb250cm9sIGJlY29tZXMgYSB0b2dnbGUgYnV0dG9uIGFuZCB3aGVuIGFjdGl2ZSB0aGUgbWFwIHdpbGwgcmVjZWl2ZSB1cGRhdGVzIHRvIHRoZSB1c2VyJ3MgbG9jYXRpb24gYXMgaXQgY2hhbmdlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5zaG93VXNlckxvY2F0aW9uPXRydWVdIEJ5IGRlZmF1bHQgYSBkb3Qgd2lsbCBiZSBzaG93biBvbiB0aGUgbWFwIGF0IHRoZSB1c2VyJ3MgbG9jYXRpb24uIFNldCB0byBgZmFsc2VgIHRvIGRpc2FibGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIG1hcC5hZGRDb250cm9sKG5ldyBtYXBib3hnbC5HZW9sb2NhdGVDb250cm9sKHtcbiAqICAgICBwb3NpdGlvbk9wdGlvbnM6IHtcbiAqICAgICAgICAgZW5hYmxlSGlnaEFjY3VyYWN5OiB0cnVlXG4gKiAgICAgfSxcbiAqICAgICB0cmFja1VzZXJMb2NhdGlvbjogdHJ1ZVxuICogfSkpO1xuICovXG5jbGFzcyBHZW9sb2NhdGVDb250cm9sIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zICAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gdXRpbC5leHRlbmQoe30sIGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTtcblxuICAgICAgICB1dGlsLmJpbmRBbGwoW1xuICAgICAgICAgICAgJ19vblN1Y2Nlc3MnLFxuICAgICAgICAgICAgJ19vbkVycm9yJyxcbiAgICAgICAgICAgICdfZmluaXNoJyxcbiAgICAgICAgICAgICdfc2V0dXBVSScsXG4gICAgICAgICAgICAnX3VwZGF0ZUNhbWVyYScsXG4gICAgICAgICAgICAnX3VwZGF0ZU1hcmtlcicsXG4gICAgICAgICAgICAnX29uQ2xpY2tHZW9sb2NhdGUnXG4gICAgICAgIF0sIHRoaXMpO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcCAgICAgKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgYCR7Y2xhc3NOYW1lfSAke2NsYXNzTmFtZX0tZ3JvdXBgKTtcbiAgICAgICAgY2hlY2tHZW9sb2NhdGlvblN1cHBvcnQodGhpcy5fc2V0dXBVSSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIC8vIGNsZWFyIHRoZSBnZW9sb2NhdGlvbiB3YXRjaCBpZiBleGlzdHNcbiAgICAgICAgaWYgKHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2godGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEKTtcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCA9ICh1bmRlZmluZWQgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbGVhciB0aGUgbWFya2VyIGZyb20gdGhlIG1hcFxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX3VzZXJMb2NhdGlvbkRvdE1hcmtlci5yZW1vdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIERPTS5yZW1vdmUodGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5fbWFwID0gKHVuZGVmaW5lZCAgICAgKTtcbiAgICB9XG5cbiAgICBfb25TdWNjZXNzKHBvc2l0aW9uICAgICAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICAvLyBrZWVwIGEgcmVjb3JkIG9mIHRoZSBwb3NpdGlvbiBzbyB0aGF0IGlmIHRoZSBzdGF0ZSBpcyBCQUNLR1JPVU5EIGFuZCB0aGUgdXNlclxuICAgICAgICAgICAgLy8gY2xpY2tzIHRoZSBidXR0b24sIHdlIGNhbiBtb3ZlIHRvIEFDVElWRV9MT0NLIGltbWVkaWF0ZWx5IHdpdGhvdXQgd2FpdGluZyBmb3JcbiAgICAgICAgICAgIC8vIHdhdGNoUG9zaXRpb24gdG8gdHJpZ2dlciBfb25TdWNjZXNzXG4gICAgICAgICAgICB0aGlzLl9sYXN0S25vd25Qb3NpdGlvbiA9IHBvc2l0aW9uO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX3dhdGNoU3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ1dBSVRJTkdfQUNUSVZFJzpcbiAgICAgICAgICAgIGNhc2UgJ0FDVElWRV9MT0NLJzpcbiAgICAgICAgICAgIGNhc2UgJ0FDVElWRV9FUlJPUic6XG4gICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdBQ1RJVkVfTE9DSyc7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQkFDS0dST1VORCc6XG4gICAgICAgICAgICBjYXNlICdCQUNLR1JPVU5EX0VSUk9SJzpcbiAgICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gJ0JBQ0tHUk9VTkQnO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQtZXJyb3InKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZCcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UsIGBVbmV4cGVjdGVkIHdhdGNoU3RhdGUgJHt0aGlzLl93YXRjaFN0YXRlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgc2hvd1VzZXJMb2NhdGlvbiBhbmQgdGhlIHdhdGNoIHN0YXRlIGlzbid0IG9mZiB0aGVuIHVwZGF0ZSB0aGUgbWFya2VyIGxvY2F0aW9uXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbiAmJiB0aGlzLl93YXRjaFN0YXRlICE9PSAnT0ZGJykge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWFya2VyKHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIGluIG5vcm1hbCBtb2RlIChub3Qgd2F0Y2ggbW9kZSksIG9yIGlmIGluIHdhdGNoIG1vZGUgYW5kIHRoZSBzdGF0ZSBpcyBhY3RpdmUgd2F0Y2hcbiAgICAgICAgLy8gdGhlbiB1cGRhdGUgdGhlIGNhbWVyYVxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbiB8fCB0aGlzLl93YXRjaFN0YXRlID09PSAnQUNUSVZFX0xPQ0snKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDYW1lcmEocG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9kb3RFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLXVzZXItbG9jYXRpb24tZG90LXN0YWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpcmUoJ2dlb2xvY2F0ZScsIHBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy5fZmluaXNoKCk7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUNhbWVyYShwb3NpdGlvbiAgICAgICAgICApIHtcbiAgICAgICAgY29uc3QgY2VudGVyID0gbmV3IExuZ0xhdChwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlLCBwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGUpO1xuICAgICAgICBjb25zdCByYWRpdXMgPSBwb3NpdGlvbi5jb29yZHMuYWNjdXJhY3k7XG5cbiAgICAgICAgdGhpcy5fbWFwLmZpdEJvdW5kcyhjZW50ZXIudG9Cb3VuZHMocmFkaXVzKSwgdGhpcy5vcHRpb25zLmZpdEJvdW5kc09wdGlvbnMsIHtcbiAgICAgICAgICAgIGdlb2xvY2F0ZVNvdXJjZTogdHJ1ZSAvLyB0YWcgdGhpcyBjYW1lcmEgY2hhbmdlIHNvIGl0IHdvbid0IGNhdXNlIHRoZSBjb250cm9sIHRvIGNoYW5nZSB0byBiYWNrZ3JvdW5kIHN0YXRlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF91cGRhdGVNYXJrZXIocG9zaXRpb24gICAgICAgICAgICkge1xuICAgICAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX3VzZXJMb2NhdGlvbkRvdE1hcmtlci5zZXRMbmdMYXQoW3Bvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUsIHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZV0pLmFkZFRvKHRoaXMuX21hcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl91c2VyTG9jYXRpb25Eb3RNYXJrZXIucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25FcnJvcihlcnJvciAgICAgICAgICAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIFBFUk1JU1NJT05fREVOSUVEXG4gICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdPRkYnO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUtZXJyb3InKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kLWVycm9yJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2xlYXJXYXRjaCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLl93YXRjaFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnV0FJVElOR19BQ1RJVkUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gJ0FDVElWRV9FUlJPUic7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZS1lcnJvcicpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdBQ1RJVkVfTE9DSyc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnQUNUSVZFX0VSUk9SJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHR1cm4gbWFya2VyIGdyZXlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnQkFDS0dST1VORCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnQkFDS0dST1VORF9FUlJPUic7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHR1cm4gbWFya2VyIGdyZXlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnQUNUSVZFX0VSUk9SJzpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBgVW5leHBlY3RlZCB3YXRjaFN0YXRlICR7dGhpcy5fd2F0Y2hTdGF0ZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fd2F0Y2hTdGF0ZSAhPT0gJ09GRicgJiYgdGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2RvdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtdXNlci1sb2NhdGlvbi1kb3Qtc3RhbGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCBlcnJvcik7XG5cbiAgICAgICAgdGhpcy5fZmluaXNoKCk7XG4gICAgfVxuXG4gICAgX2ZpbmlzaCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVvdXRJZCkgeyBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dElkKTsgfVxuICAgICAgICB0aGlzLl90aW1lb3V0SWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgX3NldHVwVUkoc3VwcG9ydGVkICAgICAgICAgKSB7XG4gICAgICAgIGlmIChzdXBwb3J0ZWQgPT09IGZhbHNlKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIChlICAgICAgICAgICAgKSA9PiBlLnByZXZlbnREZWZhdWx0KCkpO1xuICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24gPSBET00uY3JlYXRlKCdidXR0b24nLFxuICAgICAgICAgICAgYCR7Y2xhc3NOYW1lfS1pY29uICR7Y2xhc3NOYW1lfS1nZW9sb2NhdGVgLFxuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnR5cGUgPSAnYnV0dG9uJztcbiAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdHZW9sb2NhdGUnKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnT0ZGJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdoZW4gc2hvd1VzZXJMb2NhdGlvbiBpcyBlbmFibGVkLCBrZWVwIHRoZSBHZW9sb2NhdGUgYnV0dG9uIGRpc2FibGVkIHVudGlsIHRoZSBkZXZpY2UgbG9jYXRpb24gbWFya2VyIGlzIHNldHVwIG9uIHRoZSBtYXBcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9kb3RFbGVtZW50ID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLXVzZXItbG9jYXRpb24tZG90Jyk7XG5cbiAgICAgICAgICAgIHRoaXMuX3VzZXJMb2NhdGlvbkRvdE1hcmtlciA9IG5ldyBNYXJrZXIodGhpcy5fZG90RWxlbWVudCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHRoaXMuX3dhdGNoU3RhdGUgPSAnT0ZGJztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsXG4gICAgICAgICAgICB0aGlzLl9vbkNsaWNrR2VvbG9jYXRlLmJpbmQodGhpcykpO1xuXG4gICAgICAgIC8vIHdoZW4gdGhlIGNhbWVyYSBpcyBjaGFuZ2VkIChhbmQgaXQncyBub3QgYXMgYSByZXN1bHQgb2YgdGhlIEdlb2xvY2F0aW9uIENvbnRyb2wpIGNoYW5nZVxuICAgICAgICAvLyB0aGUgd2F0Y2ggbW9kZSB0byBiYWNrZ3JvdW5kIHdhdGNoLCBzbyB0aGF0IHRoZSBtYXJrZXIgaXMgdXBkYXRlZCBidXQgbm90IHRoZSBjYW1lcmEuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbignbW92ZXN0YXJ0JywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFldmVudC5nZW9sb2NhdGVTb3VyY2UgJiYgdGhpcy5fd2F0Y2hTdGF0ZSA9PT0gJ0FDVElWRV9MT0NLJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gJ0JBQ0tHUk9VTkQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZCcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKCd0cmFja3VzZXJsb2NhdGlvbmVuZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uQ2xpY2tHZW9sb2NhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSB3YXRjaFN0YXRlIGFuZCBkbyBhbnkgb3V0Z29pbmcgc3RhdGUgY2xlYW51cFxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLl93YXRjaFN0YXRlKSB7XG4gICAgICAgICAgICBjYXNlICdPRkYnOlxuICAgICAgICAgICAgICAgIC8vIHR1cm4gb24gdGhlIEdlb2xvY2F0ZSBDb250cm9sXG4gICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdXQUlUSU5HX0FDVElWRSc7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ3RyYWNrdXNlcmxvY2F0aW9uc3RhcnQnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1dBSVRJTkdfQUNUSVZFJzpcbiAgICAgICAgICAgIGNhc2UgJ0FDVElWRV9MT0NLJzpcbiAgICAgICAgICAgIGNhc2UgJ0FDVElWRV9FUlJPUic6XG4gICAgICAgICAgICBjYXNlICdCQUNLR1JPVU5EX0VSUk9SJzpcbiAgICAgICAgICAgICAgICAvLyB0dXJuIG9mZiB0aGUgR2VvbG9jYXRlIENvbnRyb2xcbiAgICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gJ09GRic7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZS1lcnJvcicpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQtZXJyb3InKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgndHJhY2t1c2VybG9jYXRpb25lbmQnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0JBQ0tHUk9VTkQnOlxuICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnQUNUSVZFX0xPQ0snO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kJyk7XG4gICAgICAgICAgICAgICAgLy8gc2V0IGNhbWVyYSB0byBsYXN0IGtub3duIGxvY2F0aW9uXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2xhc3RLbm93blBvc2l0aW9uKSB0aGlzLl91cGRhdGVDYW1lcmEodGhpcy5fbGFzdEtub3duUG9zaXRpb24pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKCd0cmFja3VzZXJsb2NhdGlvbnN0YXJ0Jyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSwgYFVuZXhwZWN0ZWQgd2F0Y2hTdGF0ZSAke3RoaXMuX3dhdGNoU3RhdGV9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGluY29taW5nIHN0YXRlIHNldHVwXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX3dhdGNoU3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ1dBSVRJTkdfQUNUSVZFJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0FDVElWRV9MT0NLJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBQ1RJVkVfRVJST1InOlxuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZS1lcnJvcicpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQkFDS0dST1VORCc6XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0JBQ0tHUk9VTkRfRVJST1InOlxuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQtZXJyb3InKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ09GRic6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSwgYFVuZXhwZWN0ZWQgd2F0Y2hTdGF0ZSAke3RoaXMuX3dhdGNoU3RhdGV9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG1hbmFnZSBnZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uIC8gZ2VvbG9jYXRpb24uY2xlYXJXYXRjaFxuICAgICAgICAgICAgaWYgKHRoaXMuX3dhdGNoU3RhdGUgPT09ICdPRkYnICYmIHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gY2xlYXIgd2F0Y2hQb3NpdGlvbiBhcyB3ZSd2ZSBjaGFuZ2VkIHRvIGFuIE9GRiBzdGF0ZVxuICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyV2F0Y2goKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBlbmFibGUgd2F0Y2hQb3NpdGlvbiBzaW5jZSB3YXRjaFN0YXRlIGlzIG5vdCBPRkYgYW5kIHRoZXJlIGlzIG5vIHdhdGNoUG9zaXRpb24gYWxyZWFkeSBydW5uaW5nXG5cbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICd0cnVlJyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQgPSB3aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uU3VjY2VzcywgdGhpcy5fb25FcnJvciwgdGhpcy5vcHRpb25zLnBvc2l0aW9uT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihcbiAgICAgICAgICAgICAgICB0aGlzLl9vblN1Y2Nlc3MsIHRoaXMuX29uRXJyb3IsIHRoaXMub3B0aW9ucy5wb3NpdGlvbk9wdGlvbnMpO1xuXG4gICAgICAgICAgICAvLyBUaGlzIHRpbWVvdXQgZW5zdXJlcyB0aGF0IHdlIHN0aWxsIGNhbGwgZmluaXNoKCkgZXZlbiBpZlxuICAgICAgICAgICAgLy8gdGhlIHVzZXIgZGVjbGluZXMgdG8gc2hhcmUgdGhlaXIgbG9jYXRpb24gaW4gRmlyZWZveFxuICAgICAgICAgICAgdGhpcy5fdGltZW91dElkID0gc2V0VGltZW91dCh0aGlzLl9maW5pc2gsIDEwMDAwIC8qIDEwc2VjICovKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jbGVhcldhdGNoKCkge1xuICAgICAgICB3aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2godGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEKTtcblxuICAgICAgICB0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQgPSAodW5kZWZpbmVkICAgICApO1xuICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAnZmFsc2UnKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1hcmtlcihudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBHZW9sb2NhdGVDb250cm9sO1xuXG4vKiBHZW9sb2NhdGUgQ29udHJvbCBXYXRjaCBTdGF0ZXNcbiAqIFRoaXMgaXMgdGhlIHByaXZhdGUgc3RhdGUgb2YgdGhlIGNvbnRyb2wuXG4gKlxuICogT0ZGXG4gKiAgICBvZmYvaW5hY3RpdmVcbiAqIFdBSVRJTkdfQUNUSVZFXG4gKiAgICBHZW9sb2NhdGUgQ29udHJvbCB3YXMgY2xpY2tlZCBidXQgc3RpbGwgd2FpdGluZyBmb3IgR2VvbG9jYXRpb24gQVBJIHJlc3BvbnNlIHdpdGggdXNlciBsb2NhdGlvblxuICogQUNUSVZFX0xPQ0tcbiAqICAgIFNob3dpbmcgdGhlIHVzZXIgbG9jYXRpb24gYXMgYSBkb3QgQU5EIHRyYWNraW5nIHRoZSBjYW1lcmEgdG8gYmUgZml4ZWQgdG8gdGhlaXIgbG9jYXRpb24uIElmIHRoZWlyIGxvY2F0aW9uIGNoYW5nZXMgdGhlIG1hcCBtb3ZlcyB0byBmb2xsb3cuXG4gKiBBQ1RJVkVfRVJST1JcbiAqICAgIFRoZXJlIHdhcyBlbiBlcnJvciBmcm9tIHRoZSBHZW9sb2NhdGlvbiBBUEkgd2hpbGUgdHJ5aW5nIHRvIHNob3cgYW5kIHRyYWNrIHRoZSB1c2VyIGxvY2F0aW9uLlxuICogQkFDS0dST1VORFxuICogICAgU2hvd2luZyB0aGUgdXNlciBsb2NhdGlvbiBhcyBhIGRvdCBidXQgdGhlIGNhbWVyYSBkb2Vzbid0IGZvbGxvdyB0aGVpciBsb2NhdGlvbiBhcyBpdCBjaGFuZ2VzLlxuICogQkFDS0dST1VORF9FUlJPUlxuICogICAgVGhlcmUgd2FzIGFuIGVycm9yIGZyb20gdGhlIEdlb2xvY2F0aW9uIEFQSSB3aGlsZSB0cnlpbmcgdG8gc2hvdyAoYnV0IG5vdCB0cmFjaykgdGhlIHVzZXIgbG9jYXRpb24uXG4gKi9cblxuXG4vKipcbiAqIEZpcmVkIG9uIGVhY2ggR2VvbG9jYXRpb24gQVBJIHBvc2l0aW9uIHVwZGF0ZSB3aGljaCByZXR1cm5lZCBhcyBzdWNjZXNzLlxuICpcbiAqIEBldmVudCBnZW9sb2NhdGVcbiAqIEBtZW1iZXJvZiBHZW9sb2NhdGVDb250cm9sXG4gKiBAaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb259IGRhdGEgVGhlIHJldHVybmVkIFtQb3NpdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1Bvc2l0aW9uKSBvYmplY3QgZnJvbSB0aGUgY2FsbGJhY2sgaW4gW0dlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbigpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvR2VvbG9jYXRpb24vZ2V0Q3VycmVudFBvc2l0aW9uKSBvciBbR2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbigpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvR2VvbG9jYXRpb24vd2F0Y2hQb3NpdGlvbikuXG4gKlxuICovXG5cbi8qKlxuICogRmlyZWQgb24gZWFjaCBHZW9sb2NhdGlvbiBBUEkgcG9zaXRpb24gdXBkYXRlIHdoaWNoIHJldHVybmVkIGFzIGFuIGVycm9yLlxuICpcbiAqIEBldmVudCBlcnJvclxuICogQG1lbWJlcm9mIEdlb2xvY2F0ZUNvbnRyb2xcbiAqIEBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtQb3NpdGlvbkVycm9yfSBkYXRhIFRoZSByZXR1cm5lZCBbUG9zaXRpb25FcnJvcl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1Bvc2l0aW9uRXJyb3IpIG9iamVjdCBmcm9tIHRoZSBjYWxsYmFjayBpbiBbR2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HZW9sb2NhdGlvbi9nZXRDdXJyZW50UG9zaXRpb24pIG9yIFtHZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HZW9sb2NhdGlvbi93YXRjaFBvc2l0aW9uKS5cbiAqXG4gKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBHZW9sb2NhdGUgQ29udHJvbCBjaGFuZ2VzIHRvIHRoZSBhY3RpdmUgbG9jayBzdGF0ZSwgd2hpY2ggaGFwcGVucyBlaXRoZXIgdXBvbiBmaXJzdCBvYnRhaW5pbmcgYSBzdWNjZXNzZnVsIEdlb2xvY2F0aW9uIEFQSSBwb3NpdGlvbiBmb3IgdGhlIHVzZXIgKGEgZ2VvbG9jYXRlIGV2ZW50IHdpbGwgZm9sbG93KSwgb3IgdGhlIHVzZXIgY2xpY2tzIHRoZSBnZW9sb2NhdGUgYnV0dG9uIHdoZW4gaW4gdGhlIGJhY2tncm91bmQgc3RhdGUgd2hpY2ggdXNlcyB0aGUgbGFzdCBrbm93biBwb3NpdGlvbiB0byByZWNlbnRlciB0aGUgbWFwIGFuZCBlbnRlciBhY3RpdmUgbG9jayBzdGF0ZSAobm8gZ2VvbG9jYXRlIGV2ZW50IHdpbGwgZm9sbG93IHVubGVzcyB0aGUgdXNlcnMncyBsb2NhdGlvbiBjaGFuZ2VzKS5cbiAqXG4gKiBAZXZlbnQgdHJhY2t1c2VybG9jYXRpb25zdGFydFxuICogQG1lbWJlcm9mIEdlb2xvY2F0ZUNvbnRyb2xcbiAqIEBpbnN0YW5jZVxuICpcbiAqL1xuXG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIEdlb2xvY2F0ZSBDb250cm9sIGNoYW5nZXMgdG8gdGhlIGJhY2tncm91bmQgc3RhdGUsIHdoaWNoIGhhcHBlbnMgd2hlbiBhIHVzZXIgY2hhbmdlcyB0aGUgY2FtZXJhIGR1cmluZyBhbiBhY3RpdmUgcG9zaXRpb24gbG9jay4gVGhpcyBvbmx5IGFwcGxpZXMgd2hlbiB0cmFja1VzZXJMb2NhdGlvbiBpcyB0cnVlLiBJbiB0aGUgYmFja2dyb3VuZCBzdGF0ZSwgdGhlIGRvdCBvbiB0aGUgbWFwIHdpbGwgdXBkYXRlIHdpdGggbG9jYXRpb24gdXBkYXRlcyBidXQgdGhlIGNhbWVyYSB3aWxsIG5vdC5cbiAqXG4gKiBAZXZlbnQgdHJhY2t1c2VybG9jYXRpb25lbmRcbiAqIEBtZW1iZXJvZiBHZW9sb2NhdGVDb250cm9sXG4gKiBAaW5zdGFuY2VcbiAqXG4gKi9cbiIsIi8vICAgICAgXG5cbmNvbnN0IERPTSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4vKipcbiAqIEEgYExvZ29Db250cm9sYCBpcyBhIGNvbnRyb2wgdGhhdCBhZGRzIHRoZSBNYXBib3ggd2F0ZXJtYXJrXG4gKiB0byB0aGUgbWFwIGFzIHJlcXVpcmVkIGJ5IHRoZSBbdGVybXMgb2Ygc2VydmljZV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS90b3MvKSBmb3IgTWFwYm94XG4gKiB2ZWN0b3IgdGlsZXMgYW5kIGNvcmUgc3R5bGVzLlxuICpcbiAqIEBpbXBsZW1lbnRzIHtJQ29udHJvbH1cbiAqIEBwcml2YXRlXG4qKi9cblxuY2xhc3MgTG9nb0NvbnRyb2wge1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB1dGlsLmJpbmRBbGwoWydfdXBkYXRlTG9nbyddLCB0aGlzKTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXAgICAgICkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1jdHJsJyk7XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IERPTS5jcmVhdGUoJ2EnLCAnbWFwYm94Z2wtY3RybC1sb2dvJyk7XG4gICAgICAgIGFuY2hvci50YXJnZXQgPSBcIl9ibGFua1wiO1xuICAgICAgICBhbmNob3IuaHJlZiA9IFwiaHR0cHM6Ly93d3cubWFwYm94LmNvbS9cIjtcbiAgICAgICAgYW5jaG9yLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJNYXBib3ggbG9nb1wiKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKGFuY2hvcik7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgIHRoaXMuX21hcC5vbignc291cmNlZGF0YScsIHRoaXMuX3VwZGF0ZUxvZ28pO1xuICAgICAgICB0aGlzLl91cGRhdGVMb2dvKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIERPTS5yZW1vdmUodGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignc291cmNlZGF0YScsIHRoaXMuX3VwZGF0ZUxvZ28pO1xuICAgIH1cblxuICAgIGdldERlZmF1bHRQb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICdib3R0b20tbGVmdCc7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUxvZ28oZSAgICAgKSB7XG4gICAgICAgIGlmICghZSB8fCBlLnNvdXJjZURhdGFUeXBlID09PSAnbWV0YWRhdGEnKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuc3R5bGUuZGlzcGxheSA9IHRoaXMuX2xvZ29SZXF1aXJlZCgpID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9sb2dvUmVxdWlyZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWFwLnN0eWxlKSByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGVzID0gdGhpcy5fbWFwLnN0eWxlLnNvdXJjZUNhY2hlcztcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBzb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZUNhY2hlc1tpZF0uZ2V0U291cmNlKCk7XG4gICAgICAgICAgICBpZiAoc291cmNlLm1hcGJveF9sb2dvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBMb2dvQ29udHJvbDtcbiIsIi8vICAgICAgXG5cbmNvbnN0IERPTSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG5jb25zdCBEcmFnUm90YXRlSGFuZGxlciA9IHJlcXVpcmUoJy4uL2hhbmRsZXIvZHJhZ19yb3RhdGUnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIHNob3dDb21wYXNzOiB0cnVlLFxuICAgIHNob3dab29tOiB0cnVlXG59O1xuXG4vKipcbiAqIEEgYE5hdmlnYXRpb25Db250cm9sYCBjb250cm9sIGNvbnRhaW5zIHpvb20gYnV0dG9ucyBhbmQgYSBjb21wYXNzLlxuICpcbiAqIEBpbXBsZW1lbnRzIHtJQ29udHJvbH1cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2hvd0NvbXBhc3M9dHJ1ZV0gSWYgYHRydWVgIHRoZSBjb21wYXNzIGJ1dHRvbiBpcyBpbmNsdWRlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2hvd1pvb209dHJ1ZV0gSWYgYHRydWVgIHRoZSB6b29tLWluIGFuZCB6b29tLW91dCBidXR0b25zIGFyZSBpbmNsdWRlZC5cbiAqIEBleGFtcGxlXG4gKiB2YXIgbmF2ID0gbmV3IG1hcGJveGdsLk5hdmlnYXRpb25Db250cm9sKCk7XG4gKiBtYXAuYWRkQ29udHJvbChuYXYsICd0b3AtbGVmdCcpO1xuICogQHNlZSBbRGlzcGxheSBtYXAgbmF2aWdhdGlvbiBjb250cm9sc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9uYXZpZ2F0aW9uLylcbiAqIEBzZWUgW0FkZCBhIHRoaXJkIHBhcnR5IHZlY3RvciB0aWxlIHNvdXJjZV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS90aGlyZC1wYXJ0eS8pXG4gKi9cbmNsYXNzIE5hdmlnYXRpb25Db250cm9sIHtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucyAgICAgKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5fY29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWN0cmwgbWFwYm94Z2wtY3RybC1ncm91cCcpO1xuICAgICAgICB0aGlzLl9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCAoZSkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dab29tKSB7XG4gICAgICAgICAgICB0aGlzLl96b29tSW5CdXR0b24gPSB0aGlzLl9jcmVhdGVCdXR0b24oJ21hcGJveGdsLWN0cmwtaWNvbiBtYXBib3hnbC1jdHJsLXpvb20taW4nLCAnWm9vbSBJbicsICgpID0+IHRoaXMuX21hcC56b29tSW4oKSk7XG4gICAgICAgICAgICB0aGlzLl96b29tT3V0QnV0dG9uID0gdGhpcy5fY3JlYXRlQnV0dG9uKCdtYXBib3hnbC1jdHJsLWljb24gbWFwYm94Z2wtY3RybC16b29tLW91dCcsICdab29tIE91dCcsICgpID0+IHRoaXMuX21hcC56b29tT3V0KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0NvbXBhc3MpIHtcbiAgICAgICAgICAgIHV0aWwuYmluZEFsbChbXG4gICAgICAgICAgICAgICAgJ19yb3RhdGVDb21wYXNzQXJyb3cnXG4gICAgICAgICAgICBdLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbXBhc3MgPSB0aGlzLl9jcmVhdGVCdXR0b24oJ21hcGJveGdsLWN0cmwtaWNvbiBtYXBib3hnbC1jdHJsLWNvbXBhc3MnLCAnUmVzZXQgTm9ydGgnLCAoKSA9PiB0aGlzLl9tYXAucmVzZXROb3J0aCgpKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbXBhc3NBcnJvdyA9IERPTS5jcmVhdGUoJ3NwYW4nLCAnbWFwYm94Z2wtY3RybC1jb21wYXNzLWFycm93JywgdGhpcy5fY29tcGFzcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfcm90YXRlQ29tcGFzc0Fycm93KCkge1xuICAgICAgICBjb25zdCByb3RhdGUgPSBgcm90YXRlKCR7dGhpcy5fbWFwLnRyYW5zZm9ybS5hbmdsZSAqICgxODAgLyBNYXRoLlBJKX1kZWcpYDtcbiAgICAgICAgdGhpcy5fY29tcGFzc0Fycm93LnN0eWxlLnRyYW5zZm9ybSA9IHJvdGF0ZTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXAgICAgICkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0NvbXBhc3MpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbigncm90YXRlJywgdGhpcy5fcm90YXRlQ29tcGFzc0Fycm93KTtcbiAgICAgICAgICAgIHRoaXMuX3JvdGF0ZUNvbXBhc3NBcnJvdygpO1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlciA9IG5ldyBEcmFnUm90YXRlSGFuZGxlcihtYXAsIHtidXR0b246ICdsZWZ0JywgZWxlbWVudDogdGhpcy5fY29tcGFzc30pO1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlci5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xuICAgIH1cblxuICAgIG9uUmVtb3ZlKCkge1xuICAgICAgICBET00ucmVtb3ZlKHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0NvbXBhc3MpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ3JvdGF0ZScsIHRoaXMuX3JvdGF0ZUNvbXBhc3NBcnJvdyk7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVyLmRpc2FibGUoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9oYW5kbGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHRoaXMuX21hcDtcbiAgICB9XG5cbiAgICBfY3JlYXRlQnV0dG9uKGNsYXNzTmFtZSAgICAgICAgLCBhcmlhTGFiZWwgICAgICAgICwgZm4gICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGEgPSBET00uY3JlYXRlKCdidXR0b24nLCBjbGFzc05hbWUsIHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgIGEudHlwZSA9ICdidXR0b24nO1xuICAgICAgICBhLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGFyaWFMYWJlbCk7XG4gICAgICAgIGEuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmbik7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBOYXZpZ2F0aW9uQ29udHJvbDtcbiIsIi8vICAgICAgXG5cbmNvbnN0IERPTSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4vKipcbiAqIEEgYFNjYWxlQ29udHJvbGAgY29udHJvbCBkaXNwbGF5cyB0aGUgcmF0aW8gb2YgYSBkaXN0YW5jZSBvbiB0aGUgbWFwIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRpc3RhbmNlIG9uIHRoZSBncm91bmQuXG4gKlxuICogQGltcGxlbWVudHMge0lDb250cm9sfVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdpZHRoPScxMDAnXSBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHNjYWxlIGNvbnRyb2wgaW4gcGl4ZWxzLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnVuaXQ9J21ldHJpYyddIFVuaXQgb2YgdGhlIGRpc3RhbmNlIChgJ2ltcGVyaWFsJ2AsIGAnbWV0cmljJ2Agb3IgYCduYXV0aWNhbCdgKS5cbiAqIEBleGFtcGxlXG4gKiBtYXAuYWRkQ29udHJvbChuZXcgbWFwYm94Z2wuU2NhbGVDb250cm9sKHtcbiAqICAgICBtYXhXaWR0aDogODAsXG4gKiAgICAgdW5pdDogJ2ltcGVyaWFsJ1xuICogfSkpO1xuICovXG5jbGFzcyBTY2FsZUNvbnRyb2wge1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zICAgICApIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICB1dGlsLmJpbmRBbGwoW1xuICAgICAgICAgICAgJ19vbk1vdmUnXG4gICAgICAgIF0sIHRoaXMpO1xuICAgIH1cblxuICAgIGdldERlZmF1bHRQb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICdib3R0b20tbGVmdCc7XG4gICAgfVxuXG4gICAgX29uTW92ZSgpIHtcbiAgICAgICAgdXBkYXRlU2NhbGUodGhpcy5fbWFwLCB0aGlzLl9jb250YWluZXIsIHRoaXMub3B0aW9ucyk7XG4gICAgfVxuXG4gICAgb25BZGQobWFwICAgICApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9jb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLXNjYWxlJywgbWFwLmdldENvbnRhaW5lcigpKTtcblxuICAgICAgICB0aGlzLl9tYXAub24oJ21vdmUnLCB0aGlzLl9vbk1vdmUpO1xuICAgICAgICB0aGlzLl9vbk1vdmUoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xuICAgIH1cblxuICAgIG9uUmVtb3ZlKCkge1xuICAgICAgICBET00ucmVtb3ZlKHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdmUnLCB0aGlzLl9vbk1vdmUpO1xuICAgICAgICB0aGlzLl9tYXAgPSAodW5kZWZpbmVkICAgICApO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTY2FsZUNvbnRyb2w7XG5cbmZ1bmN0aW9uIHVwZGF0ZVNjYWxlKG1hcCwgY29udGFpbmVyLCBvcHRpb25zKSB7XG4gICAgLy8gQSBob3Jpem9udGFsIHNjYWxlIGlzIGltYWdpbmVkIHRvIGJlIHByZXNlbnQgYXQgY2VudGVyIG9mIHRoZSBtYXBcbiAgICAvLyBjb250YWluZXIgd2l0aCBtYXhpbXVtIGxlbmd0aCAoRGVmYXVsdCkgYXMgMTAwcHguXG4gICAgLy8gVXNpbmcgc3BoZXJpY2FsIGxhdyBvZiBjb3NpbmVzIGFwcHJveGltYXRpb24sIHRoZSByZWFsIGRpc3RhbmNlIGlzXG4gICAgLy8gZm91bmQgYmV0d2VlbiB0aGUgdHdvIGNvb3JkaW5hdGVzLlxuICAgIGNvbnN0IG1heFdpZHRoID0gb3B0aW9ucyAmJiBvcHRpb25zLm1heFdpZHRoIHx8IDEwMDtcblxuICAgIGNvbnN0IHkgPSBtYXAuX2NvbnRhaW5lci5jbGllbnRIZWlnaHQgLyAyO1xuICAgIGNvbnN0IG1heE1ldGVycyA9IGdldERpc3RhbmNlKG1hcC51bnByb2plY3QoWzAsIHldKSwgbWFwLnVucHJvamVjdChbbWF4V2lkdGgsIHldKSk7XG4gICAgLy8gVGhlIHJlYWwgZGlzdGFuY2UgY29ycmVzcG9uZGluZyB0byAxMDBweCBzY2FsZSBsZW5ndGggaXMgcm91bmRlZCBvZmYgdG9cbiAgICAvLyBuZWFyIHByZXR0eSBudW1iZXIgYW5kIHRoZSBzY2FsZSBsZW5ndGggZm9yIHRoZSBzYW1lIGlzIGZvdW5kIG91dC5cbiAgICAvLyBEZWZhdWx0IHVuaXQgb2YgdGhlIHNjYWxlIGlzIGJhc2VkIG9uIFVzZXIncyBsb2NhbGUuXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy51bml0ID09PSAnaW1wZXJpYWwnKSB7XG4gICAgICAgIGNvbnN0IG1heEZlZXQgPSAzLjI4MDggKiBtYXhNZXRlcnM7XG4gICAgICAgIGlmIChtYXhGZWV0ID4gNTI4MCkge1xuICAgICAgICAgICAgY29uc3QgbWF4TWlsZXMgPSBtYXhGZWV0IC8gNTI4MDtcbiAgICAgICAgICAgIHNldFNjYWxlKGNvbnRhaW5lciwgbWF4V2lkdGgsIG1heE1pbGVzLCAnbWknKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFNjYWxlKGNvbnRhaW5lciwgbWF4V2lkdGgsIG1heEZlZXQsICdmdCcpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRpb25zICYmIG9wdGlvbnMudW5pdCA9PT0gJ25hdXRpY2FsJykge1xuICAgICAgICBjb25zdCBtYXhOYXV0aWNhbHMgPSBtYXhNZXRlcnMgLyAxODUyO1xuICAgICAgICBzZXRTY2FsZShjb250YWluZXIsIG1heFdpZHRoLCBtYXhOYXV0aWNhbHMsICdubScpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFNjYWxlKGNvbnRhaW5lciwgbWF4V2lkdGgsIG1heE1ldGVycywgJ20nKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNldFNjYWxlKGNvbnRhaW5lciwgbWF4V2lkdGgsIG1heERpc3RhbmNlLCB1bml0KSB7XG4gICAgbGV0IGRpc3RhbmNlID0gZ2V0Um91bmROdW0obWF4RGlzdGFuY2UpO1xuICAgIGNvbnN0IHJhdGlvID0gZGlzdGFuY2UgLyBtYXhEaXN0YW5jZTtcblxuICAgIGlmICh1bml0ID09PSAnbScgJiYgZGlzdGFuY2UgPj0gMTAwMCkge1xuICAgICAgICBkaXN0YW5jZSA9IGRpc3RhbmNlIC8gMTAwMDtcbiAgICAgICAgdW5pdCA9ICdrbSc7XG4gICAgfVxuXG4gICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gYCR7bWF4V2lkdGggKiByYXRpb31weGA7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IGRpc3RhbmNlICsgdW5pdDtcbn1cblxuZnVuY3Rpb24gZ2V0RGlzdGFuY2UobGF0bG5nMSwgbGF0bG5nMikge1xuICAgIC8vIFVzZXMgc3BoZXJpY2FsIGxhdyBvZiBjb3NpbmVzIGFwcHJveGltYXRpb24uXG4gICAgY29uc3QgUiA9IDYzNzEwMDA7XG5cbiAgICBjb25zdCByYWQgPSBNYXRoLlBJIC8gMTgwLFxuICAgICAgICBsYXQxID0gbGF0bG5nMS5sYXQgKiByYWQsXG4gICAgICAgIGxhdDIgPSBsYXRsbmcyLmxhdCAqIHJhZCxcbiAgICAgICAgYSA9IE1hdGguc2luKGxhdDEpICogTWF0aC5zaW4obGF0MikgK1xuICAgICAgICAgIE1hdGguY29zKGxhdDEpICogTWF0aC5jb3MobGF0MikgKiBNYXRoLmNvcygobGF0bG5nMi5sbmcgLSBsYXRsbmcxLmxuZykgKiByYWQpO1xuXG4gICAgY29uc3QgbWF4TWV0ZXJzID0gUiAqIE1hdGguYWNvcyhNYXRoLm1pbihhLCAxKSk7XG4gICAgcmV0dXJuIG1heE1ldGVycztcblxufVxuXG5mdW5jdGlvbiBnZXRSb3VuZE51bShudW0pIHtcbiAgICBjb25zdCBwb3cxMCA9IE1hdGgucG93KDEwLCAoYCR7TWF0aC5mbG9vcihudW0pfWApLmxlbmd0aCAtIDEpO1xuICAgIGxldCBkID0gbnVtIC8gcG93MTA7XG5cbiAgICBkID0gZCA+PSAxMCA/IDEwIDpcbiAgICAgICAgZCA+PSA1ID8gNSA6XG4gICAgICAgIGQgPj0gMyA/IDMgOlxuICAgICAgICBkID49IDIgPyAyIDogMTtcblxuICAgIHJldHVybiBwb3cxMCAqIGQ7XG59XG4iLCIvLyAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWFwTW91c2VFdmVudFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUuXG4gKiBAcHJvcGVydHkge01hcH0gdGFyZ2V0IFRoZSBgTWFwYCBvYmplY3QgdGhhdCBmaXJlZCB0aGUgZXZlbnQuXG4gKiBAcHJvcGVydHkge01vdXNlRXZlbnR9IG9yaWdpbmFsRXZlbnRcbiAqIEBwcm9wZXJ0eSB7UG9pbnR9IHBvaW50IFRoZSBwaXhlbCBjb29yZGluYXRlcyBvZiB0aGUgbW91c2UgZXZlbnQgdGFyZ2V0LCByZWxhdGl2ZSB0byB0aGUgbWFwXG4gKiAgIGFuZCBtZWFzdXJlZCBmcm9tIHRoZSB0b3AgbGVmdCBjb3JuZXIuXG4gKiBAcHJvcGVydHkge0xuZ0xhdH0gbG5nTGF0IFRoZSBnZW9ncmFwaGljIGxvY2F0aW9uIG9uIHRoZSBtYXAgb2YgdGhlIG1vdXNlIGV2ZW50IHRhcmdldC5cbiAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWFwVG91Y2hFdmVudFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUuXG4gKiBAcHJvcGVydHkge01hcH0gdGFyZ2V0IFRoZSBgTWFwYCBvYmplY3QgdGhhdCBmaXJlZCB0aGUgZXZlbnQuXG4gKiBAcHJvcGVydHkge1RvdWNoRXZlbnR9IG9yaWdpbmFsRXZlbnRcbiAqIEBwcm9wZXJ0eSB7UG9pbnR9IHBvaW50IFRoZSBwaXhlbCBjb29yZGluYXRlcyBvZiB0aGUgY2VudGVyIG9mIHRoZSB0b3VjaCBldmVudCBwb2ludHMsIHJlbGF0aXZlIHRvIHRoZSBtYXBcbiAqICAgYW5kIG1lYXN1cmVkIGZyb20gdGhlIHRvcCBsZWZ0IGNvcm5lci5cbiAqIEBwcm9wZXJ0eSB7TG5nTGF0fSBsbmdMYXQgVGhlIGdlb2dyYXBoaWMgbG9jYXRpb24gb24gdGhlIG1hcCBvZiB0aGUgY2VudGVyIG9mIHRoZSB0b3VjaCBldmVudCBwb2ludHMuXG4gKiBAcHJvcGVydHkge0FycmF5PFBvaW50Pn0gcG9pbnRzIFRoZSBhcnJheSBvZiBwaXhlbCBjb29yZGluYXRlcyBjb3JyZXNwb25kaW5nIHRvXG4gKiAgIGEgW3RvdWNoIGV2ZW50J3MgYHRvdWNoZXNgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVG91Y2hFdmVudC90b3VjaGVzKVxuICogICBwcm9wZXJ0eS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8TG5nTGF0Pn0gbG5nTGF0cyBUaGUgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9ucyBvbiB0aGUgbWFwIGNvcnJlc3BvbmRpbmcgdG9cbiAqICAgYSBbdG91Y2ggZXZlbnQncyBgdG91Y2hlc2BdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ub3VjaEV2ZW50L3RvdWNoZXMpXG4gKiAgIHByb3BlcnR5LlxuICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNYXBCb3hab29tRXZlbnRcbiAqIEBwcm9wZXJ0eSB7TW91c2VFdmVudH0gb3JpZ2luYWxFdmVudFxuICogQHByb3BlcnR5IHtMbmdMYXRCb3VuZHN9IGJveFpvb21Cb3VuZHMgVGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgXCJib3ggem9vbVwiIGludGVyYWN0aW9uLlxuICogICBUaGlzIHByb3BlcnR5IGlzIG9ubHkgcHJvdmlkZWQgZm9yIGBib3h6b29tZW5kYCBldmVudHMuXG4gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBcblxuLyoqXG4gKiBBIGBNYXBEYXRhRXZlbnRgIG9iamVjdCBpcyBlbWl0dGVkIHdpdGggdGhlIHtAbGluayBNYXAuZXZlbnQ6ZGF0YX1cbiAqIGFuZCB7QGxpbmsgTWFwLmV2ZW50OmRhdGFsb2FkaW5nfSBldmVudHMuIFBvc3NpYmxlIHZhbHVlcyBmb3JcbiAqIGBkYXRhVHlwZWBzIGFyZTpcbiAqXG4gKiAtIGAnc291cmNlJ2A6IFRoZSBub24tdGlsZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhbnkgc291cmNlXG4gKiAtIGAnc3R5bGUnYDogVGhlIFtzdHlsZV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8pIHVzZWQgYnkgdGhlIG1hcFxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1hcERhdGFFdmVudFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGF0YVR5cGUgVGhlIHR5cGUgb2YgZGF0YSB0aGF0IGhhcyBjaGFuZ2VkLiBPbmUgb2YgYCdzb3VyY2UnYCwgYCdzdHlsZSdgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbaXNTb3VyY2VMb2FkZWRdIFRydWUgaWYgdGhlIGV2ZW50IGhhcyBhIGBkYXRhVHlwZWAgb2YgYHNvdXJjZWAgYW5kIHRoZSBzb3VyY2UgaGFzIG5vIG91dHN0YW5kaW5nIG5ldHdvcmsgcmVxdWVzdHMuXG4gKiBAcHJvcGVydHkge09iamVjdH0gW3NvdXJjZV0gVGhlIFtzdHlsZSBzcGVjIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzb3VyY2VdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI3NvdXJjZXMpIGlmIHRoZSBldmVudCBoYXMgYSBgZGF0YVR5cGVgIG9mIGBzb3VyY2VgLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzb3VyY2VEYXRhVHlwZV0gSW5jbHVkZWQgaWYgdGhlIGV2ZW50IGhhcyBhIGBkYXRhVHlwZWAgb2YgYHNvdXJjZWAgYW5kIHRoZSBldmVudCBzaWduYWxzXG4gKiB0aGF0IGludGVybmFsIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQgb3IgY2hhbmdlZC4gUG9zc2libGUgdmFsdWVzIGFyZSBgbWV0YWRhdGFgIGFuZCBgY29udGVudGAuXG4gKiBAcHJvcGVydHkge09iamVjdH0gW3RpbGVdIFRoZSB0aWxlIGJlaW5nIGxvYWRlZCBvciBjaGFuZ2VkLCBpZiB0aGUgZXZlbnQgaGFzIGEgYGRhdGFUeXBlYCBvZiBgc291cmNlYCBhbmRcbiAqIHRoZSBldmVudCBpcyByZWxhdGVkIHRvIGxvYWRpbmcgb2YgYSB0aWxlLlxuICogQHByb3BlcnR5IHtDb29yZGluYXRlfSBbY29vcmRdIFRoZSBjb29yZGluYXRlIG9mIHRoZSB0aWxlIGlmIHRoZSBldmVudCBoYXMgYSBgZGF0YVR5cGVgIG9mIGBzb3VyY2VgIGFuZFxuICogdGhlIGV2ZW50IGlzIHJlbGF0ZWQgdG8gbG9hZGluZyBvZiBhIHRpbGUuXG4gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiBcblxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICBcbiAgICAgICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICBcbiAgICAgICAgICAgICAgIFxuXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICAgICAgICAgICBcblxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICAgICAgICAgICBcblxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICAgICAgIFxuXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICAgICAgICAgICBcblxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcblxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICBcblxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICAgICAgICAgICBcblxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICAgICAgICAgICBcblxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICAgICBcblxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICBcbiAgICAgICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICBcbiAgICAgICAgICAgICAgIFxuXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICAgICAgICAgICBcblxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICBcbiAgICAgICAgICAgIFxuXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcblxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICBcbiAgICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICAgICAgICAgICBcblxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICBcbiAgICAgICAgICAgICAgICBcblxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICAgIFxuXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICAgIFxuXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICBcbiAgICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICBcblxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICAgICAgICAgICBcblxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgIFxuICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuIiwiLy8gICAgICBcblxuY29uc3QgRE9NID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKTtcbmNvbnN0IExuZ0xhdEJvdW5kcyA9IHJlcXVpcmUoJy4uLy4uL2dlby9sbmdfbGF0X2JvdW5kcycpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xuY29uc3Qgd2luZG93ID0gcmVxdWlyZSgnLi4vLi4vdXRpbC93aW5kb3cnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbi8qKlxuICogVGhlIGBCb3hab29tSGFuZGxlcmAgYWxsb3dzIHRoZSB1c2VyIHRvIHpvb20gdGhlIG1hcCB0byBmaXQgd2l0aGluIGEgYm91bmRpbmcgYm94LlxuICogVGhlIGJvdW5kaW5nIGJveCBpcyBkZWZpbmVkIGJ5IGNsaWNraW5nIGFuZCBob2xkaW5nIGBzaGlmdGAgd2hpbGUgZHJhZ2dpbmcgdGhlIGN1cnNvci5cbiAqXG4gKiBAcGFyYW0ge01hcH0gbWFwIFRoZSBNYXBib3ggR0wgSlMgbWFwIHRvIGFkZCB0aGUgaGFuZGxlciB0by5cbiAqL1xuY2xhc3MgQm94Wm9vbUhhbmRsZXIge1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihtYXAgICAgICkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX2VsID0gbWFwLmdldENhbnZhc0NvbnRhaW5lcigpO1xuICAgICAgICB0aGlzLl9jb250YWluZXIgPSBtYXAuZ2V0Q29udGFpbmVyKCk7XG5cbiAgICAgICAgdXRpbC5iaW5kQWxsKFtcbiAgICAgICAgICAgICdfb25Nb3VzZURvd24nLFxuICAgICAgICAgICAgJ19vbk1vdXNlTW92ZScsXG4gICAgICAgICAgICAnX29uTW91c2VVcCcsXG4gICAgICAgICAgICAnX29uS2V5RG93bidcbiAgICAgICAgXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqL1xuICAgIGlzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZW5hYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUsIGkuZS4gY3VycmVudGx5IGJlaW5nIHVzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgYWN0aXZlLlxuICAgICAqL1xuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9hY3RpdmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJib3ggem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC5ib3hab29tLmVuYWJsZSgpO1xuICAgICAqL1xuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcblxuICAgICAgICAvLyB0aGUgZXZlbnQgbGlzdGVuZXJzIGZvciB0aGUgRHJhZ1BhbkhhbmRsZXIgaGF2ZSB0byBmaXJlIF9hZnRlcl8gdGhlIGV2ZW50IGxpc3RlbmVyIGZvciBCb3hab29tSGFuZGxlciBpbiBvcmRlcixcbiAgICAgICAgLy8gZm9yIHRoZSBEcmFnUGFuSGFuZGxlcidzIGNoZWNrIG9uIG1hcC5ib3hab29tLmlzQWN0aXZlKCkgdG8gdGVsbCB3aGV0aGVyIG9yIG5vdCB0byBpZ25vcmUgYSBrZXlkb3duIGV2ZW50XG4gICAgICAgIC8vIHNvIHRoaXMgbWFrZXMgc3VyZSB0aGUgZmlyaW5nIG9yZGVyIGlzIHByZXNlcnZlZCBpZiB0aGUgQm94Wm9vbUhhbmRsZXIgaXMgZW5hYmxlZCBhZnRlciB0aGUgRHJhZ1BhbkhhbmRsZXIuXG4gICAgICAgIGlmICh0aGlzLl9tYXAuZHJhZ1BhbikgdGhpcy5fbWFwLmRyYWdQYW4uZGlzYWJsZSgpO1xuICAgICAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9vbk1vdXNlRG93biwgZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5fbWFwLmRyYWdQYW4pIHRoaXMuX21hcC5kcmFnUGFuLmVuYWJsZSgpO1xuXG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIHRoZSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICAgbWFwLmJveFpvb20uZGlzYWJsZSgpO1xuICAgICAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9vbk1vdXNlRG93bik7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBfb25Nb3VzZURvd24oZSAgICAgICAgICAgICkge1xuICAgICAgICBpZiAoIShlLnNoaWZ0S2V5ICYmIGUuYnV0dG9uID09PSAwKSkgcmV0dXJuO1xuXG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX29uS2V5RG93biwgZmFsc2UpO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX29uTW91c2VVcCwgZmFsc2UpO1xuXG4gICAgICAgIERPTS5kaXNhYmxlRHJhZygpO1xuICAgICAgICB0aGlzLl9zdGFydFBvcyA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZSk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgX29uTW91c2VNb3ZlKGUgICAgICAgICAgICApIHtcbiAgICAgICAgY29uc3QgcDAgPSB0aGlzLl9zdGFydFBvcyxcbiAgICAgICAgICAgIHAxID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcblxuICAgICAgICBpZiAoIXRoaXMuX2JveCkge1xuICAgICAgICAgICAgdGhpcy5fYm94ID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWJveHpvb20nLCB0aGlzLl9jb250YWluZXIpO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWNyb3NzaGFpcicpO1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdib3h6b29tc3RhcnQnLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1pblggPSBNYXRoLm1pbihwMC54LCBwMS54KSxcbiAgICAgICAgICAgIG1heFggPSBNYXRoLm1heChwMC54LCBwMS54KSxcbiAgICAgICAgICAgIG1pblkgPSBNYXRoLm1pbihwMC55LCBwMS55KSxcbiAgICAgICAgICAgIG1heFkgPSBNYXRoLm1heChwMC55LCBwMS55KTtcblxuICAgICAgICBET00uc2V0VHJhbnNmb3JtKHRoaXMuX2JveCwgYHRyYW5zbGF0ZSgke21pblh9cHgsJHttaW5ZfXB4KWApO1xuXG4gICAgICAgIHRoaXMuX2JveC5zdHlsZS53aWR0aCA9IGAke21heFggLSBtaW5YfXB4YDtcbiAgICAgICAgdGhpcy5fYm94LnN0eWxlLmhlaWdodCA9IGAke21heFkgLSBtaW5ZfXB4YDtcbiAgICB9XG5cbiAgICBfb25Nb3VzZVVwKGUgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKGUuYnV0dG9uICE9PSAwKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcDAgPSB0aGlzLl9zdGFydFBvcyxcbiAgICAgICAgICAgIHAxID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKSxcbiAgICAgICAgICAgIGJvdW5kcyA9IG5ldyBMbmdMYXRCb3VuZHMoKVxuICAgICAgICAgICAgICAgIC5leHRlbmQodGhpcy5fbWFwLnVucHJvamVjdChwMCkpXG4gICAgICAgICAgICAgICAgLmV4dGVuZCh0aGlzLl9tYXAudW5wcm9qZWN0KHAxKSk7XG5cbiAgICAgICAgdGhpcy5fZmluaXNoKCk7XG5cbiAgICAgICAgaWYgKHAwLnggPT09IHAxLnggJiYgcDAueSA9PT0gcDEueSkge1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdib3h6b29tY2FuY2VsJywgZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9tYXBcbiAgICAgICAgICAgICAgICAuZml0Qm91bmRzKGJvdW5kcywge2xpbmVhcjogdHJ1ZX0pXG4gICAgICAgICAgICAgICAgLmZpcmUoJ2JveHpvb21lbmQnLCB7IG9yaWdpbmFsRXZlbnQ6IGUsIGJveFpvb21Cb3VuZHM6IGJvdW5kcyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbktleURvd24oZSAgICAgICAgICAgICAgICkge1xuICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAyNykge1xuICAgICAgICAgICAgdGhpcy5fZmluaXNoKCk7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ2JveHpvb21jYW5jZWwnLCBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9maW5pc2goKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX29uS2V5RG93biwgZmFsc2UpO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX29uTW91c2VVcCwgZmFsc2UpO1xuXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jcm9zc2hhaXInKTtcblxuICAgICAgICBpZiAodGhpcy5fYm94KSB7XG4gICAgICAgICAgICBET00ucmVtb3ZlKHRoaXMuX2JveCk7XG4gICAgICAgICAgICB0aGlzLl9ib3ggPSAobnVsbCAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIERPTS5lbmFibGVEcmFnKCk7XG4gICAgfVxuXG4gICAgX2ZpcmVFdmVudCh0eXBlICAgICAgICAsIGUgICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuZmlyZSh0eXBlLCB7IG9yaWdpbmFsRXZlbnQ6IGUgfSk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEJveFpvb21IYW5kbGVyO1xuIiwiLy8gICAgICBcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuLyoqXG4gKiBUaGUgYERvdWJsZUNsaWNrWm9vbUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tIHRoZSBtYXAgYXQgYSBwb2ludCBieVxuICogZG91YmxlIGNsaWNraW5nLlxuICpcbiAqIEBwYXJhbSB7TWFwfSBtYXAgVGhlIE1hcGJveCBHTCBKUyBtYXAgdG8gYWRkIHRoZSBoYW5kbGVyIHRvLlxuICovXG5jbGFzcyBEb3VibGVDbGlja1pvb21IYW5kbGVyIHtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKG1hcCAgICAgKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcblxuICAgICAgICB1dGlsLmJpbmRBbGwoW1xuICAgICAgICAgICAgJ19vbkRibENsaWNrJyxcbiAgICAgICAgICAgICdfb25ab29tRW5kJ1xuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiZG91YmxlIGNsaWNrIHRvIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJkb3VibGUgY2xpY2sgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJkb3VibGUgY2xpY2sgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGFjdGl2ZSwgaS5lLiBjdXJyZW50bHkgYmVpbmcgdXNlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwiZG91YmxlIGNsaWNrIHRvIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUuXG4gICAgICovXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2FjdGl2ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcImRvdWJsZSBjbGljayB0byB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5kb3VibGVDbGlja1pvb20uZW5hYmxlKCk7XG4gICAgICovXG4gICAgZW5hYmxlKCkge1xuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9tYXAub24oJ2RibGNsaWNrJywgdGhpcy5fb25EYmxDbGljayk7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIHRoZSBcImRvdWJsZSBjbGljayB0byB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5kb3VibGVDbGlja1pvb20uZGlzYWJsZSgpO1xuICAgICAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdkYmxjbGljaycsIHRoaXMuX29uRGJsQ2xpY2spO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgX29uRGJsQ2xpY2soZSAgICAgKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuX21hcC5vbignem9vbWVuZCcsIHRoaXMuX29uWm9vbUVuZCk7XG4gICAgICAgIHRoaXMuX21hcC56b29tVG8oXG4gICAgICAgICAgICB0aGlzLl9tYXAuZ2V0Wm9vbSgpICsgKGUub3JpZ2luYWxFdmVudC5zaGlmdEtleSA/IC0xIDogMSksXG4gICAgICAgICAgICB7YXJvdW5kOiBlLmxuZ0xhdH0sXG4gICAgICAgICAgICBlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgX29uWm9vbUVuZCgpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ3pvb21lbmQnLCB0aGlzLl9vblpvb21FbmQpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBEb3VibGVDbGlja1pvb21IYW5kbGVyO1xuIiwiLy8gICAgICBcblxuY29uc3QgRE9NID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsL3V0aWwnKTtcbmNvbnN0IHdpbmRvdyA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvd2luZG93Jyk7XG5jb25zdCBicm93c2VyID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9icm93c2VyJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNvbnN0IGluZXJ0aWFMaW5lYXJpdHkgPSAwLjMsXG4gICAgaW5lcnRpYUVhc2luZyA9IHV0aWwuYmV6aWVyKDAsIDAsIGluZXJ0aWFMaW5lYXJpdHksIDEpLFxuICAgIGluZXJ0aWFNYXhTcGVlZCA9IDE0MDAsIC8vIHB4L3NcbiAgICBpbmVydGlhRGVjZWxlcmF0aW9uID0gMjUwMDsgLy8gcHgvc14yXG5cbi8qKlxuICogVGhlIGBEcmFnUGFuSGFuZGxlcmAgYWxsb3dzIHRoZSB1c2VyIHRvIHBhbiB0aGUgbWFwIGJ5IGNsaWNraW5nIGFuZCBkcmFnZ2luZ1xuICogdGhlIGN1cnNvci5cbiAqXG4gKiBAcGFyYW0ge01hcH0gbWFwIFRoZSBNYXBib3ggR0wgSlMgbWFwIHRvIGFkZCB0aGUgaGFuZGxlciB0by5cbiAqL1xuY2xhc3MgRHJhZ1BhbkhhbmRsZXIge1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IobWFwICAgICApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9lbCA9IG1hcC5nZXRDYW52YXNDb250YWluZXIoKTtcblxuICAgICAgICB1dGlsLmJpbmRBbGwoW1xuICAgICAgICAgICAgJ19vbkRvd24nLFxuICAgICAgICAgICAgJ19vbk1vdmUnLFxuICAgICAgICAgICAgJ19vblVwJyxcbiAgICAgICAgICAgICdfb25Ub3VjaEVuZCcsXG4gICAgICAgICAgICAnX29uTW91c2VVcCcsXG4gICAgICAgICAgICAnX29uRHJhZ0ZyYW1lJyxcbiAgICAgICAgICAgICdfb25EcmFnRmluaXNoZWQnXG4gICAgICAgIF0sIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2VuYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gaXMgYWN0aXZlLCBpLmUuIGN1cnJlbnRseSBiZWluZyB1c2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uIGlzIGFjdGl2ZS5cbiAgICAgKi9cbiAgICBpc0FjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fYWN0aXZlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdGhlIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmRyYWdQYW4uZW5hYmxlKCk7XG4gICAgICovXG4gICAgZW5hYmxlKCkge1xuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9lbC5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC10b3VjaC1kcmFnLXBhbicpO1xuICAgICAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9vbkRvd24pO1xuICAgICAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fb25Eb3duKTtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgdGhlIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmRyYWdQYW4uZGlzYWJsZSgpO1xuICAgICAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9lbC5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC10b3VjaC1kcmFnLXBhbicpO1xuICAgICAgICB0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9vbkRvd24pO1xuICAgICAgICB0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fb25Eb3duKTtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIF9vbkRvd24oZSAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMuX2lnbm9yZUV2ZW50KGUpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHJldHVybjtcblxuICAgICAgICBpZiAoZS50b3VjaGVzKSB7XG4gICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5fb25Nb3ZlKTtcbiAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX29uVG91Y2hFbmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX29uTW91c2VVcCk7XG4gICAgICAgIH1cbiAgICAgICAgLyogRGVhY3RpdmF0ZSBEcmFnUGFuIHdoZW4gdGhlIHdpbmRvdyBsb29zZXMgZm9jdXMuIE90aGVyd2lzZSBpZiBhIG1vdXNldXAgb2NjdXJzIHdoZW4gdGhlIHdpbmRvdyBpc24ndCBpbiBmb2N1cywgRHJhZ1BhbiB3aWxsIHN0aWxsIGJlIGFjdGl2ZSBldmVuIHRob3VnaCB0aGUgbW91c2UgaXMgbm8gbG9uZ2VyIHByZXNzZWQuICovXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5fb25Nb3VzZVVwKTtcblxuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcHJldmlvdXNQb3MgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpO1xuICAgICAgICB0aGlzLl9pbmVydGlhID0gW1ticm93c2VyLm5vdygpLCB0aGlzLl9wcmV2aW91c1Bvc11dO1xuICAgIH1cblxuICAgIF9vbk1vdmUoZSAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMuX2lnbm9yZUV2ZW50KGUpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2xhc3RNb3ZlRXZlbnQgPSBlO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgY29uc3QgcG9zID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcbiAgICAgICAgdGhpcy5fZHJhaW5JbmVydGlhQnVmZmVyKCk7XG4gICAgICAgIHRoaXMuX2luZXJ0aWEucHVzaChbYnJvd3Nlci5ub3coKSwgcG9zXSk7XG5cbiAgICAgICAgLy8gaWYgdGhlIGRyYWdnaW5nIGFuaW1hdGlvbiB3YXMgaW50ZXJydXB0ZWQgKGUuZy4gYnkgYW5vdGhlciBoYW5kbGVyKSxcbiAgICAgICAgLy8gd2UgbmVlZCB0byByZWVzdGFibGlzaCBhIF9wcmV2aW91c1BvcyBiZWZvcmUgd2UgY2FuIHJlc3VtZSBkcmFnZ2luZ1xuICAgICAgICBpZiAoIXRoaXMuX3ByZXZpb3VzUG9zKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmV2aW91c1BvcyA9IHBvcztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3BvcyA9IHBvcztcblxuICAgICAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkge1xuICAgICAgICAgICAgLy8gd2UgdHJlYXQgdGhlIGZpcnN0IG1vdmUgZXZlbnQgKHJhdGhlciB0aGFuIHRoZSBtb3VzZWRvd24gZXZlbnQpXG4gICAgICAgICAgICAvLyBhcyB0aGUgc3RhcnQgb2YgdGhlIGRyYWdcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9tYXAubW92aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnZHJhZ3N0YXJ0JywgZSk7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ21vdmVzdGFydCcsIGUpO1xuXG4gICAgICAgICAgICB0aGlzLl9tYXAuX3N0YXJ0QW5pbWF0aW9uKHRoaXMuX29uRHJhZ0ZyYW1lLCB0aGlzLl9vbkRyYWdGaW5pc2hlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbnN1cmUgYSBuZXcgcmVuZGVyIGZyYW1lIGlzIHNjaGVkdWxlZFxuICAgICAgICB0aGlzLl9tYXAuX3VwZGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCBpbiBlYWNoIHJlbmRlciBmcmFtZSB3aGlsZSBkcmFnZ2luZyBpcyBoYXBwZW5pbmcuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfb25EcmFnRnJhbWUodHIgICAgICAgICAgICkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5fbGFzdE1vdmVFdmVudDtcbiAgICAgICAgaWYgKCFlKSByZXR1cm47XG5cbiAgICAgICAgdHIuc2V0TG9jYXRpb25BdFBvaW50KHRyLnBvaW50TG9jYXRpb24odGhpcy5fcHJldmlvdXNQb3MpLCB0aGlzLl9wb3MpO1xuICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ2RyYWcnLCBlKTtcbiAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdtb3ZlJywgZSk7XG5cbiAgICAgICAgdGhpcy5fcHJldmlvdXNQb3MgPSB0aGlzLl9wb3M7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sYXN0TW92ZUV2ZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGRyYWdnaW5nIHN0b3BzLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX29uRHJhZ0ZpbmlzaGVkKGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQWN0aXZlKCkpIHJldHVybjtcblxuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xhc3RNb3ZlRXZlbnQ7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9wcmV2aW91c1BvcztcbiAgICAgICAgZGVsZXRlIHRoaXMuX3BvcztcblxuICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ2RyYWdlbmQnLCBlKTtcbiAgICAgICAgdGhpcy5fZHJhaW5JbmVydGlhQnVmZmVyKCk7XG5cbiAgICAgICAgY29uc3QgZmluaXNoID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm1vdmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdtb3ZlZW5kJywgZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWE7XG4gICAgICAgIGlmIChpbmVydGlhLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdCA9IGluZXJ0aWFbaW5lcnRpYS5sZW5ndGggLSAxXSxcbiAgICAgICAgICAgIGZpcnN0ID0gaW5lcnRpYVswXSxcbiAgICAgICAgICAgIGZsaW5nT2Zmc2V0ID0gbGFzdFsxXS5zdWIoZmlyc3RbMV0pLFxuICAgICAgICAgICAgZmxpbmdEdXJhdGlvbiA9IChsYXN0WzBdIC0gZmlyc3RbMF0pIC8gMTAwMDtcblxuICAgICAgICBpZiAoZmxpbmdEdXJhdGlvbiA9PT0gMCB8fCBsYXN0WzFdLmVxdWFscyhmaXJzdFsxXSkpIHtcbiAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIHB4L3MgdmVsb2NpdHkgJiBhZGp1c3QgZm9yIGluY3JlYXNlZCBpbml0aWFsIGFuaW1hdGlvbiBzcGVlZCB3aGVuIGVhc2luZyBvdXRcbiAgICAgICAgY29uc3QgdmVsb2NpdHkgPSBmbGluZ09mZnNldC5tdWx0KGluZXJ0aWFMaW5lYXJpdHkgLyBmbGluZ0R1cmF0aW9uKTtcbiAgICAgICAgbGV0IHNwZWVkID0gdmVsb2NpdHkubWFnKCk7IC8vIHB4L3NcblxuICAgICAgICBpZiAoc3BlZWQgPiBpbmVydGlhTWF4U3BlZWQpIHtcbiAgICAgICAgICAgIHNwZWVkID0gaW5lcnRpYU1heFNwZWVkO1xuICAgICAgICAgICAgdmVsb2NpdHkuX3VuaXQoKS5fbXVsdChzcGVlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IHNwZWVkIC8gKGluZXJ0aWFEZWNlbGVyYXRpb24gKiBpbmVydGlhTGluZWFyaXR5KSxcbiAgICAgICAgICAgIG9mZnNldCA9IHZlbG9jaXR5Lm11bHQoLWR1cmF0aW9uIC8gMik7XG5cbiAgICAgICAgdGhpcy5fbWFwLnBhbkJ5KG9mZnNldCwge1xuICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uICogMTAwMCxcbiAgICAgICAgICAgIGVhc2luZzogaW5lcnRpYUVhc2luZyxcbiAgICAgICAgICAgIG5vTW92ZVN0YXJ0OiB0cnVlXG4gICAgICAgIH0sIHsgb3JpZ2luYWxFdmVudDogZSB9KTtcbiAgICB9XG5cbiAgICBfb25VcChlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5fb25EcmFnRmluaXNoZWQoZSk7XG4gICAgfVxuXG4gICAgX29uTW91c2VVcChlICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5faWdub3JlRXZlbnQoZSkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fb25VcChlKTtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZVVwKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLl9vbk1vdXNlVXApO1xuICAgIH1cblxuICAgIF9vblRvdWNoRW5kKGUgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMuX2lnbm9yZUV2ZW50KGUpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX29uVXAoZSk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9vbk1vdmUpO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9vblRvdWNoRW5kKTtcbiAgICB9XG5cbiAgICBfZmlyZUV2ZW50KHR5cGUgICAgICAgICwgZSAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuZmlyZSh0eXBlLCBlID8geyBvcmlnaW5hbEV2ZW50OiBlIH0gOiB7fSk7XG4gICAgfVxuXG4gICAgX2lnbm9yZUV2ZW50KGUgICAgICkge1xuICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9tYXA7XG5cbiAgICAgICAgaWYgKG1hcC5ib3hab29tICYmIG1hcC5ib3hab29tLmlzQWN0aXZlKCkpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAobWFwLmRyYWdSb3RhdGUgJiYgbWFwLmRyYWdSb3RhdGUuaXNBY3RpdmUoKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChlLnRvdWNoZXMpIHtcbiAgICAgICAgICAgIHJldHVybiAoZS50b3VjaGVzLmxlbmd0aCA+IDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGUuY3RybEtleSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZS50eXBlICE9PSAnbW91c2Vtb3ZlJyAmJiBlLmJ1dHRvbiAmJiBlLmJ1dHRvbiAhPT0gMDsgLy8gbGVmdCBidXR0b25cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9kcmFpbkluZXJ0aWFCdWZmZXIoKSB7XG4gICAgICAgIGNvbnN0IGluZXJ0aWEgPSB0aGlzLl9pbmVydGlhLFxuICAgICAgICAgICAgbm93ID0gYnJvd3Nlci5ub3coKSxcbiAgICAgICAgICAgIGN1dG9mZiA9IDE2MDsgICAvLyBtc2VjXG5cbiAgICAgICAgd2hpbGUgKGluZXJ0aWEubGVuZ3RoID4gMCAmJiBub3cgLSBpbmVydGlhWzBdWzBdID4gY3V0b2ZmKSBpbmVydGlhLnNoaWZ0KCk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERyYWdQYW5IYW5kbGVyO1xuIiwiLy8gICAgICBcblxuY29uc3QgRE9NID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsL3V0aWwnKTtcbmNvbnN0IHdpbmRvdyA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvd2luZG93Jyk7XG5jb25zdCBicm93c2VyID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9icm93c2VyJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNvbnN0IGluZXJ0aWFMaW5lYXJpdHkgPSAwLjI1LFxuICAgIGluZXJ0aWFFYXNpbmcgPSB1dGlsLmJlemllcigwLCAwLCBpbmVydGlhTGluZWFyaXR5LCAxKSxcbiAgICBpbmVydGlhTWF4U3BlZWQgPSAxODAsIC8vIGRlZy9zXG4gICAgaW5lcnRpYURlY2VsZXJhdGlvbiA9IDcyMDsgLy8gZGVnL3NeMlxuXG4vKipcbiAqIFRoZSBgRHJhZ1JvdGF0ZUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byByb3RhdGUgdGhlIG1hcCBieSBjbGlja2luZyBhbmRcbiAqIGRyYWdnaW5nIHRoZSBjdXJzb3Igd2hpbGUgaG9sZGluZyB0aGUgcmlnaHQgbW91c2UgYnV0dG9uIG9yIGBjdHJsYCBrZXkuXG4gKlxuICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwYm94IEdMIEpTIG1hcCB0byBhZGQgdGhlIGhhbmRsZXIgdG8uXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYmVhcmluZ1NuYXBdIFRoZSB0aHJlc2hvbGQsIG1lYXN1cmVkIGluIGRlZ3JlZXMsIHRoYXQgZGV0ZXJtaW5lcyB3aGVuIHRoZSBtYXAnc1xuICogICBiZWFyaW5nIHdpbGwgc25hcCB0byBub3J0aC5cbiAqIEBwYXJhbSB7Ym9vbH0gW29wdGlvbnMucGl0Y2hXaXRoUm90YXRlPXRydWVdIENvbnRyb2wgdGhlIG1hcCBwaXRjaCBpbiBhZGRpdGlvbiB0byB0aGUgYmVhcmluZ1xuICovXG5jbGFzcyBEcmFnUm90YXRlSGFuZGxlciB7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKG1hcCAgICAgLCBvcHRpb25zICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fZWwgPSBvcHRpb25zLmVsZW1lbnQgfHwgbWFwLmdldENhbnZhc0NvbnRhaW5lcigpO1xuICAgICAgICB0aGlzLl9idXR0b24gPSBvcHRpb25zLmJ1dHRvbiB8fCAncmlnaHQnO1xuICAgICAgICB0aGlzLl9iZWFyaW5nU25hcCA9IG9wdGlvbnMuYmVhcmluZ1NuYXAgfHwgMDtcbiAgICAgICAgdGhpcy5fcGl0Y2hXaXRoUm90YXRlID0gb3B0aW9ucy5waXRjaFdpdGhSb3RhdGUgIT09IGZhbHNlO1xuXG4gICAgICAgIHV0aWwuYmluZEFsbChbXG4gICAgICAgICAgICAnX29uRG93bicsXG4gICAgICAgICAgICAnX29uTW92ZScsXG4gICAgICAgICAgICAnX29uVXAnLFxuICAgICAgICAgICAgJ19vbkRyYWdGcmFtZScsXG4gICAgICAgICAgICAnX29uRHJhZ0ZpbmlzaGVkJ1xuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIGlzIGFjdGl2ZSwgaS5lLiBjdXJyZW50bHkgYmVpbmcgdXNlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUuXG4gICAgICovXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2FjdGl2ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5kcmFnUm90YXRlLmVuYWJsZSgpO1xuICAgICAqL1xuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fb25Eb3duKTtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgdGhlIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmRyYWdSb3RhdGUuZGlzYWJsZSgpO1xuICAgICAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9vbkRvd24pO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgX29uRG93bihlICAgICAgICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXAuYm94Wm9vbSAmJiB0aGlzLl9tYXAuYm94Wm9vbS5pc0FjdGl2ZSgpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLl9tYXAuZHJhZ1BhbiAmJiB0aGlzLl9tYXAuZHJhZ1Bhbi5pc0FjdGl2ZSgpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy5fYnV0dG9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICBjb25zdCBidXR0b24gPSAoZS5jdHJsS2V5ID8gMCA6IDIpOyAgIC8vID8gY3RybCtsZWZ0IGJ1dHRvbiA6IHJpZ2h0IGJ1dHRvblxuICAgICAgICAgICAgbGV0IGV2ZW50QnV0dG9uID0gZS5idXR0b247XG4gICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5JbnN0YWxsVHJpZ2dlciAhPT0gJ3VuZGVmaW5lZCcgJiYgZS5idXR0b24gPT09IDIgJiYgZS5jdHJsS2V5ICYmXG4gICAgICAgICAgICAgICAgd2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybS50b1VwcGVyQ2FzZSgpLmluZGV4T2YoJ01BQycpID49IDApIHtcbiAgICAgICAgICAgICAgICAvLyBGaXggZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8zMTMxOlxuICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggKGRldGVjdGVkIGJ5IEluc3RhbGxUcmlnZ2VyKSBvbiBNYWMgZGV0ZXJtaW5lcyBlLmJ1dHRvbiA9IDIgd2hlblxuICAgICAgICAgICAgICAgIC8vIHVzaW5nIENvbnRyb2wgKyBsZWZ0IGNsaWNrXG4gICAgICAgICAgICAgICAgZXZlbnRCdXR0b24gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV2ZW50QnV0dG9uICE9PSBidXR0b24pIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChlLmN0cmxLZXkgfHwgZS5idXR0b24gIT09IDApIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIERPTS5kaXNhYmxlRHJhZygpO1xuXG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdmUsIHtjYXB0dXJlOiB0cnVlfSk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25VcCk7XG4gICAgICAgIC8qIERlYWN0aXZhdGUgRHJhZ1JvdGF0ZSB3aGVuIHRoZSB3aW5kb3cgbG9vc2VzIGZvY3VzLiBPdGhlcndpc2UgaWYgYSBtb3VzZXVwIG9jY3VycyB3aGVuIHRoZSB3aW5kb3cgaXNuJ3QgaW4gZm9jdXMsIERyYWdSb3RhdGUgd2lsbCBzdGlsbCBiZSBhY3RpdmUgZXZlbiB0aG91Z2ggdGhlIG1vdXNlIGlzIG5vIGxvbmdlciBwcmVzc2VkLiAqL1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMuX29uVXApO1xuXG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pbmVydGlhID0gW1ticm93c2VyLm5vdygpLCB0aGlzLl9tYXAuZ2V0QmVhcmluZygpXV07XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzUG9zID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcbiAgICAgICAgdGhpcy5fY2VudGVyID0gdGhpcy5fbWFwLnRyYW5zZm9ybS5jZW50ZXJQb2ludDsgIC8vIENlbnRlciBvZiByb3RhdGlvblxuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBfb25Nb3ZlKGUgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5fbGFzdE1vdmVFdmVudCA9IGU7XG4gICAgICAgIGNvbnN0IHBvcyA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZSk7XG4gICAgICAgIC8vIGlmIHRoZSBkcmFnZ2luZyBhbmltYXRpb24gd2FzIGludGVycnVwdGVkIChlLmcuIGJ5IGFub3RoZXIgaGFuZGxlciksXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gcmVlc3RhYmxpc2ggYSBfcHJldmlvdXNQb3MgYmVmb3JlIHdlIGNhbiByZXN1bWUgZHJhZ2dpbmdcbiAgICAgICAgaWYgKCF0aGlzLl9wcmV2aW91c1Bvcykge1xuICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNQb3MgPSBwb3M7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wb3MgPSBwb3M7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9tYXAubW92aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgncm90YXRlc3RhcnQnLCBlKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnbW92ZXN0YXJ0JywgZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5fcGl0Y2hXaXRoUm90YXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdwaXRjaHN0YXJ0JywgZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX21hcC5fc3RhcnRBbmltYXRpb24odGhpcy5fb25EcmFnRnJhbWUsIHRoaXMuX29uRHJhZ0ZpbmlzaGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVuc3VyZSBhIG5ldyByZW5kZXIgZnJhbWUgaXMgc2NoZWR1bGVkXG4gICAgICAgIHRoaXMuX21hcC5fdXBkYXRlKCk7XG4gICAgfVxuXG4gICAgX29uVXAoZSAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uTW92ZSwge2NhcHR1cmU6IHRydWV9KTtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9vblVwKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLl9vblVwKTtcblxuICAgICAgICBET00uZW5hYmxlRHJhZygpO1xuXG4gICAgICAgIHRoaXMuX29uRHJhZ0ZpbmlzaGVkKGUpO1xuICAgIH1cblxuICAgIF9vbkRyYWdGcmFtZSh0ciAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLl9sYXN0TW92ZUV2ZW50O1xuICAgICAgICBpZiAoIWUpIHJldHVybjtcblxuICAgICAgICBjb25zdCBwMSA9IHRoaXMuX3ByZXZpb3VzUG9zLFxuICAgICAgICAgICAgcDIgPSB0aGlzLl9wb3MsXG4gICAgICAgICAgICBiZWFyaW5nRGlmZiA9IChwMS54IC0gcDIueCkgKiAwLjgsXG4gICAgICAgICAgICBwaXRjaERpZmYgPSAocDEueSAtIHAyLnkpICogLTAuNSxcbiAgICAgICAgICAgIGJlYXJpbmcgPSB0ci5iZWFyaW5nIC0gYmVhcmluZ0RpZmYsXG4gICAgICAgICAgICBwaXRjaCA9IHRyLnBpdGNoIC0gcGl0Y2hEaWZmLFxuICAgICAgICAgICAgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWEsXG4gICAgICAgICAgICBsYXN0ID0gaW5lcnRpYVtpbmVydGlhLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgIHRoaXMuX2RyYWluSW5lcnRpYUJ1ZmZlcigpO1xuICAgICAgICBpbmVydGlhLnB1c2goW2Jyb3dzZXIubm93KCksIHRoaXMuX21hcC5fbm9ybWFsaXplQmVhcmluZyhiZWFyaW5nLCBsYXN0WzFdKV0pO1xuXG4gICAgICAgIHRyLmJlYXJpbmcgPSBiZWFyaW5nO1xuICAgICAgICBpZiAodGhpcy5fcGl0Y2hXaXRoUm90YXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ3BpdGNoJywgZSk7XG4gICAgICAgICAgICB0ci5waXRjaCA9IHBpdGNoO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdyb3RhdGUnLCBlKTtcbiAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdtb3ZlJywgZSk7XG5cbiAgICAgICAgZGVsZXRlIHRoaXMuX2xhc3RNb3ZlRXZlbnQ7XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzUG9zID0gdGhpcy5fcG9zO1xuICAgIH1cblxuICAgIF9vbkRyYWdGaW5pc2hlZChlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQWN0aXZlKCkpIHJldHVybjtcblxuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xhc3RNb3ZlRXZlbnQ7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9wcmV2aW91c1BvcztcblxuICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ3JvdGF0ZWVuZCcsIGUpO1xuICAgICAgICB0aGlzLl9kcmFpbkluZXJ0aWFCdWZmZXIoKTtcblxuICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9tYXAsXG4gICAgICAgICAgICBtYXBCZWFyaW5nID0gbWFwLmdldEJlYXJpbmcoKSxcbiAgICAgICAgICAgIGluZXJ0aWEgPSB0aGlzLl9pbmVydGlhO1xuXG4gICAgICAgIGNvbnN0IGZpbmlzaCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhtYXBCZWFyaW5nKSA8IHRoaXMuX2JlYXJpbmdTbmFwKSB7XG4gICAgICAgICAgICAgICAgbWFwLnJlc2V0Tm9ydGgoe25vTW92ZVN0YXJ0OiB0cnVlfSwgeyBvcmlnaW5hbEV2ZW50OiBlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAubW92aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdtb3ZlZW5kJywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fcGl0Y2hXaXRoUm90YXRlKSB0aGlzLl9maXJlRXZlbnQoJ3BpdGNoZW5kJywgZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGluZXJ0aWEubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgZmluaXNoKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdCA9IGluZXJ0aWFbMF0sXG4gICAgICAgICAgICBsYXN0ID0gaW5lcnRpYVtpbmVydGlhLmxlbmd0aCAtIDFdLFxuICAgICAgICAgICAgcHJldmlvdXMgPSBpbmVydGlhW2luZXJ0aWEubGVuZ3RoIC0gMl07XG4gICAgICAgIGxldCBiZWFyaW5nID0gbWFwLl9ub3JtYWxpemVCZWFyaW5nKG1hcEJlYXJpbmcsIHByZXZpb3VzWzFdKTtcbiAgICAgICAgY29uc3QgZmxpbmdEaWZmID0gbGFzdFsxXSAtIGZpcnN0WzFdLFxuICAgICAgICAgICAgc2lnbiA9IGZsaW5nRGlmZiA8IDAgPyAtMSA6IDEsXG4gICAgICAgICAgICBmbGluZ0R1cmF0aW9uID0gKGxhc3RbMF0gLSBmaXJzdFswXSkgLyAxMDAwO1xuXG4gICAgICAgIGlmIChmbGluZ0RpZmYgPT09IDAgfHwgZmxpbmdEdXJhdGlvbiA9PT0gMCkge1xuICAgICAgICAgICAgZmluaXNoKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3BlZWQgPSBNYXRoLmFicyhmbGluZ0RpZmYgKiAoaW5lcnRpYUxpbmVhcml0eSAvIGZsaW5nRHVyYXRpb24pKTsgIC8vIGRlZy9zXG4gICAgICAgIGlmIChzcGVlZCA+IGluZXJ0aWFNYXhTcGVlZCkge1xuICAgICAgICAgICAgc3BlZWQgPSBpbmVydGlhTWF4U3BlZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IHNwZWVkIC8gKGluZXJ0aWFEZWNlbGVyYXRpb24gKiBpbmVydGlhTGluZWFyaXR5KSxcbiAgICAgICAgICAgIG9mZnNldCA9IHNpZ24gKiBzcGVlZCAqIChkdXJhdGlvbiAvIDIpO1xuXG4gICAgICAgIGJlYXJpbmcgKz0gb2Zmc2V0O1xuXG4gICAgICAgIGlmIChNYXRoLmFicyhtYXAuX25vcm1hbGl6ZUJlYXJpbmcoYmVhcmluZywgMCkpIDwgdGhpcy5fYmVhcmluZ1NuYXApIHtcbiAgICAgICAgICAgIGJlYXJpbmcgPSBtYXAuX25vcm1hbGl6ZUJlYXJpbmcoMCwgYmVhcmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXAucm90YXRlVG8oYmVhcmluZywge1xuICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uICogMTAwMCxcbiAgICAgICAgICAgIGVhc2luZzogaW5lcnRpYUVhc2luZyxcbiAgICAgICAgICAgIG5vTW92ZVN0YXJ0OiB0cnVlXG4gICAgICAgIH0sIHsgb3JpZ2luYWxFdmVudDogZSB9KTtcbiAgICB9XG5cbiAgICBfZmlyZUV2ZW50KHR5cGUgICAgICAgICwgZSAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuZmlyZSh0eXBlLCBlID8geyBvcmlnaW5hbEV2ZW50OiBlIH0gOiB7fSk7XG4gICAgfVxuXG4gICAgX2RyYWluSW5lcnRpYUJ1ZmZlcigpIHtcbiAgICAgICAgY29uc3QgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWEsXG4gICAgICAgICAgICBub3cgPSBicm93c2VyLm5vdygpLFxuICAgICAgICAgICAgY3V0b2ZmID0gMTYwOyAgIC8vbXNlY1xuXG4gICAgICAgIHdoaWxlIChpbmVydGlhLmxlbmd0aCA+IDAgJiYgbm93IC0gaW5lcnRpYVswXVswXSA+IGN1dG9mZilcbiAgICAgICAgICAgIGluZXJ0aWEuc2hpZnQoKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRHJhZ1JvdGF0ZUhhbmRsZXI7XG4iLCIvLyAgICAgIFxuXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jb25zdCBwYW5TdGVwID0gMTAwLFxuICAgIGJlYXJpbmdTdGVwID0gMTUsXG4gICAgcGl0Y2hTdGVwID0gMTA7XG5cbi8qKlxuICogVGhlIGBLZXlib2FyZEhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tLCByb3RhdGUsIGFuZCBwYW4gdGhlIG1hcCB1c2luZ1xuICogdGhlIGZvbGxvd2luZyBrZXlib2FyZCBzaG9ydGN1dHM6XG4gKlxuICogLSBgPWAgLyBgK2A6IEluY3JlYXNlIHRoZSB6b29tIGxldmVsIGJ5IDEuXG4gKiAtIGBTaGlmdC09YCAvIGBTaGlmdC0rYDogSW5jcmVhc2UgdGhlIHpvb20gbGV2ZWwgYnkgMi5cbiAqIC0gYC1gOiBEZWNyZWFzZSB0aGUgem9vbSBsZXZlbCBieSAxLlxuICogLSBgU2hpZnQtLWA6IERlY3JlYXNlIHRoZSB6b29tIGxldmVsIGJ5IDIuXG4gKiAtIEFycm93IGtleXM6IFBhbiBieSAxMDAgcGl4ZWxzLlxuICogLSBgU2hpZnQr4oeiYDogSW5jcmVhc2UgdGhlIHJvdGF0aW9uIGJ5IDE1IGRlZ3JlZXMuXG4gKiAtIGBTaGlmdCvih6BgOiBEZWNyZWFzZSB0aGUgcm90YXRpb24gYnkgMTUgZGVncmVlcy5cbiAqIC0gYFNoaWZ0K+KHoWA6IEluY3JlYXNlIHRoZSBwaXRjaCBieSAxMCBkZWdyZWVzLlxuICogLSBgU2hpZnQr4oejYDogRGVjcmVhc2UgdGhlIHBpdGNoIGJ5IDEwIGRlZ3JlZXMuXG4gKlxuICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwYm94IEdMIEpTIG1hcCB0byBhZGQgdGhlIGhhbmRsZXIgdG8uXG4gKi9cbmNsYXNzIEtleWJvYXJkSGFuZGxlciB7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihtYXAgICAgICkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX2VsID0gbWFwLmdldENhbnZhc0NvbnRhaW5lcigpO1xuXG4gICAgICAgIHV0aWwuYmluZEFsbChbXG4gICAgICAgICAgICAnX29uS2V5RG93bidcbiAgICAgICAgXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGtleWJvYXJkIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGtleWJvYXJkIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMga2V5Ym9hcmQgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5rZXlib2FyZC5lbmFibGUoKTtcbiAgICAgKi9cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9vbktleURvd24sIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMga2V5Ym9hcmQgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5rZXlib2FyZC5kaXNhYmxlKCk7XG4gICAgICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9vbktleURvd24pO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgX29uS2V5RG93bihlICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGlmIChlLmFsdEtleSB8fCBlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSByZXR1cm47XG5cbiAgICAgICAgbGV0IHpvb21EaXIgPSAwO1xuICAgICAgICBsZXQgYmVhcmluZ0RpciA9IDA7XG4gICAgICAgIGxldCBwaXRjaERpciA9IDA7XG4gICAgICAgIGxldCB4RGlyID0gMDtcbiAgICAgICAgbGV0IHlEaXIgPSAwO1xuXG4gICAgICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7XG4gICAgICAgIGNhc2UgNjE6XG4gICAgICAgIGNhc2UgMTA3OlxuICAgICAgICBjYXNlIDE3MTpcbiAgICAgICAgY2FzZSAxODc6XG4gICAgICAgICAgICB6b29tRGlyID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTg5OlxuICAgICAgICBjYXNlIDEwOTpcbiAgICAgICAgY2FzZSAxNzM6XG4gICAgICAgICAgICB6b29tRGlyID0gLTE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM3OlxuICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBiZWFyaW5nRGlyID0gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB4RGlyID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBiZWFyaW5nRGlyID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHhEaXIgPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgcGl0Y2hEaXIgPSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgeURpciA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA0MDpcbiAgICAgICAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgcGl0Y2hEaXIgPSAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgeURpciA9IDE7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDtcbiAgICAgICAgY29uc3Qgem9vbSA9IG1hcC5nZXRab29tKCk7XG5cbiAgICAgICAgY29uc3QgZWFzZU9wdGlvbnMgPSB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxuICAgICAgICAgICAgZGVsYXlFbmRFdmVudHM6IDUwMCxcbiAgICAgICAgICAgIGVhc2luZzogZWFzZU91dCxcblxuICAgICAgICAgICAgem9vbTogem9vbURpciA/IE1hdGgucm91bmQoem9vbSkgKyB6b29tRGlyICogKGUuc2hpZnRLZXkgPyAyIDogMSkgOiB6b29tLFxuICAgICAgICAgICAgYmVhcmluZzogbWFwLmdldEJlYXJpbmcoKSArIGJlYXJpbmdEaXIgKiBiZWFyaW5nU3RlcCxcbiAgICAgICAgICAgIHBpdGNoOiBtYXAuZ2V0UGl0Y2goKSArIHBpdGNoRGlyICogcGl0Y2hTdGVwLFxuICAgICAgICAgICAgb2Zmc2V0OiBbLXhEaXIgKiBwYW5TdGVwLCAteURpciAqIHBhblN0ZXBdLFxuICAgICAgICAgICAgY2VudGVyOiBtYXAuZ2V0Q2VudGVyKClcbiAgICAgICAgfTtcblxuICAgICAgICBtYXAuZWFzZVRvKGVhc2VPcHRpb25zLCB7b3JpZ2luYWxFdmVudDogZX0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZWFzZU91dCh0KSB7XG4gICAgcmV0dXJuIHQgKiAoMiAtIHQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEtleWJvYXJkSGFuZGxlcjtcbiIsIi8vICAgICAgXG5cbmNvbnN0IERPTSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG5jb25zdCBicm93c2VyID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9icm93c2VyJyk7XG5jb25zdCB3aW5kb3cgPSByZXF1aXJlKCcuLi8uLi91dGlsL3dpbmRvdycpO1xuY29uc3QgaW50ZXJwb2xhdGUgPSByZXF1aXJlKCcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGUnKS5udW1iZXI7XG5jb25zdCBMbmdMYXQgPSByZXF1aXJlKCcuLi8uLi9nZW8vbG5nX2xhdCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4vLyBkZWx0YVkgdmFsdWUgZm9yIG1vdXNlIHNjcm9sbCB3aGVlbCBpZGVudGlmaWNhdGlvblxuY29uc3Qgd2hlZWxab29tRGVsdGEgPSA0LjAwMDI0NDE0MDYyNTtcbi8vIFRoZXNlIG1hZ2ljIG51bWJlcnMgY29udHJvbCB0aGUgcmF0ZSBvZiB6b29tLiBUcmFja3BhZCBldmVudHMgZmlyZSBhdCBhIGdyZWF0ZXJcbi8vIGZyZXF1ZW5jeSB0aGFuIG1vdXNlIHNjcm9sbCB3aGVlbCwgc28gcmVkdWNlIHRoZSB6b29tIHJhdGUgcGVyIHdoZWVsIHRpY2tcbmNvbnN0IGRlZmF1bHRab29tUmF0ZSA9IDEgLyAxMDA7XG5jb25zdCB3aGVlbFpvb21SYXRlID0gMSAvIDQ1MDtcblxuLy8gdXBwZXIgYm91bmQgb24gaG93IG11Y2ggd2Ugc2NhbGUgdGhlIG1hcCBpbiBhbnkgc2luZ2xlIHJlbmRlciBmcmFtZTsgdGhpc1xuLy8gaXMgdXNlZCB0byBsaW1pdCB6b29tIHJhdGUgaW4gdGhlIGNhc2Ugb2YgdmVyeSBmYXN0IHNjcm9sbGluZ1xuY29uc3QgbWF4U2NhbGVQZXJGcmFtZSA9IDI7XG5cbmNvbnN0IHVhID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSxcbiAgICBmaXJlZm94ID0gdWEuaW5kZXhPZignZmlyZWZveCcpICE9PSAtMSxcbiAgICBzYWZhcmkgPSB1YS5pbmRleE9mKCdzYWZhcmknKSAhPT0gLTEgJiYgdWEuaW5kZXhPZignY2hyb20nKSA9PT0gLTE7XG5cbi8qKlxuICogVGhlIGBTY3JvbGxab29tSGFuZGxlcmAgYWxsb3dzIHRoZSB1c2VyIHRvIHpvb20gdGhlIG1hcCBieSBzY3JvbGxpbmcuXG4gKlxuICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwYm94IEdMIEpTIG1hcCB0byBhZGQgdGhlIGhhbmRsZXIgdG8uXG4gKi9cbmNsYXNzIFNjcm9sbFpvb21IYW5kbGVyIHtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCBmb3IgZGVsYXllZC1oYW5kbGluZyBvZiBhIHNpbmdsZSB3aGVlbCBtb3ZlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VkIHRvIGRlbGF5IGZpbmFsICd7bW92ZSx6b29tfWVuZCcgZXZlbnRzXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IobWFwICAgICApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9lbCA9IG1hcC5nZXRDYW52YXNDb250YWluZXIoKTtcblxuICAgICAgICB0aGlzLl9kZWx0YSA9IDA7XG5cbiAgICAgICAgdXRpbC5iaW5kQWxsKFtcbiAgICAgICAgICAgICdfb25XaGVlbCcsXG4gICAgICAgICAgICAnX29uVGltZW91dCcsXG4gICAgICAgICAgICAnX29uU2Nyb2xsRnJhbWUnLFxuICAgICAgICAgICAgJ19vblNjcm9sbEZpbmlzaGVkJ1xuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwic2Nyb2xsIHRvIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJzY3JvbGwgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9hY3RpdmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJzY3JvbGwgdG8gem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5hcm91bmRdIElmIFwiY2VudGVyXCIgaXMgcGFzc2VkLCBtYXAgd2lsbCB6b29tIGFyb3VuZCBjZW50ZXIgb2YgbWFwXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICAgbWFwLnNjcm9sbFpvb20uZW5hYmxlKCk7XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgbWFwLnNjcm9sbFpvb20uZW5hYmxlKHsgYXJvdW5kOiAnY2VudGVyJyB9KVxuICAgICAqL1xuICAgIGVuYWJsZShvcHRpb25zICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLl9vbldoZWVsLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuX2VsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLCB0aGlzLl9vbldoZWVsLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9hcm91bmRDZW50ZXIgPSBvcHRpb25zICYmIG9wdGlvbnMuYXJvdW5kID09PSAnY2VudGVyJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJzY3JvbGwgdG8gem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC5zY3JvbGxab29tLmRpc2FibGUoKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLl9vbldoZWVsKTtcbiAgICAgICAgdGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V3aGVlbCcsIHRoaXMuX29uV2hlZWwpO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgX29uV2hlZWwoZSAgICAgKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IDA7XG5cbiAgICAgICAgaWYgKGUudHlwZSA9PT0gJ3doZWVsJykge1xuICAgICAgICAgICAgdmFsdWUgPSBlLmRlbHRhWTtcbiAgICAgICAgICAgIC8vIEZpcmVmb3ggZG91YmxlcyB0aGUgdmFsdWVzIG9uIHJldGluYSBzY3JlZW5zLi4uXG4gICAgICAgICAgICAvLyBSZW1vdmUgYGFueWAgY2FzdHMgd2hlbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvNDg3OSBpcyBmaXhlZC5cbiAgICAgICAgICAgIGlmIChmaXJlZm94ICYmIGUuZGVsdGFNb2RlID09PSAod2luZG93LldoZWVsRXZlbnQgICAgICkuRE9NX0RFTFRBX1BJWEVMKSB2YWx1ZSAvPSBicm93c2VyLmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgICAgICBpZiAoZS5kZWx0YU1vZGUgPT09ICh3aW5kb3cuV2hlZWxFdmVudCAgICAgKS5ET01fREVMVEFfTElORSkgdmFsdWUgKj0gNDA7XG5cbiAgICAgICAgfSBlbHNlIGlmIChlLnR5cGUgPT09ICdtb3VzZXdoZWVsJykge1xuICAgICAgICAgICAgdmFsdWUgPSAtZS53aGVlbERlbHRhWTtcbiAgICAgICAgICAgIGlmIChzYWZhcmkpIHZhbHVlID0gdmFsdWUgLyAzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm93ID0gYnJvd3Nlci5ub3coKSxcbiAgICAgICAgICAgIHRpbWVEZWx0YSA9IG5vdyAtICh0aGlzLl9sYXN0V2hlZWxFdmVudFRpbWUgfHwgMCk7XG5cbiAgICAgICAgdGhpcy5fbGFzdFdoZWVsRXZlbnRUaW1lID0gbm93O1xuXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gMCAmJiAodmFsdWUgJSB3aGVlbFpvb21EZWx0YSkgPT09IDApIHtcbiAgICAgICAgICAgIC8vIFRoaXMgb25lIGlzIGRlZmluaXRlbHkgYSBtb3VzZSB3aGVlbCBldmVudC5cbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSAnd2hlZWwnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IDAgJiYgTWF0aC5hYnModmFsdWUpIDwgNCkge1xuICAgICAgICAgICAgLy8gVGhpcyBvbmUgaXMgZGVmaW5pdGVseSBhIHRyYWNrcGFkIGV2ZW50IGJlY2F1c2UgaXQgaXMgc28gc21hbGwuXG4gICAgICAgICAgICB0aGlzLl90eXBlID0gJ3RyYWNrcGFkJztcblxuICAgICAgICB9IGVsc2UgaWYgKHRpbWVEZWx0YSA+IDQwMCkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBsaWtlbHkgYSBuZXcgc2Nyb2xsIGFjdGlvbi5cbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fbGFzdFZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgICAgIC8vIFN0YXJ0IGEgdGltZW91dCBpbiBjYXNlIHRoaXMgd2FzIGEgc2luZ3VsYXIgZXZlbnQsIGFuZCBkZWx5IGl0IGJ5IHVwIHRvIDQwbXMuXG4gICAgICAgICAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLl9vblRpbWVvdXQsIDQwLCBlKTtcblxuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl90eXBlKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgcmVwZWF0aW5nIGV2ZW50LCBidXQgd2UgZG9uJ3Qga25vdyB0aGUgdHlwZSBvZiBldmVudCBqdXN0IHlldC5cbiAgICAgICAgICAgIC8vIElmIHRoZSBkZWx0YSBwZXIgdGltZSBpcyBzbWFsbCwgd2UgYXNzdW1lIGl0J3MgYSBmYXN0IHRyYWNrcGFkOyBvdGhlcndpc2Ugd2Ugc3dpdGNoIGludG8gd2hlZWwgbW9kZS5cbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSAoTWF0aC5hYnModGltZURlbHRhICogdmFsdWUpIDwgMjAwKSA/ICd0cmFja3BhZCcgOiAnd2hlZWwnO1xuXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgb3VyIGRlbGF5ZWQgZXZlbnQgaXNuJ3QgZmlyZWQgYWdhaW4sIGJlY2F1c2Ugd2UgYWNjdW11bGF0ZVxuICAgICAgICAgICAgLy8gdGhlIHByZXZpb3VzIGV2ZW50ICh3aGljaCB3YXMgbGVzcyB0aGFuIDQwbXMgYWdvKSBpbnRvIHRoaXMgZXZlbnQuXG4gICAgICAgICAgICBpZiAodGhpcy5fdGltZW91dCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSB0aGlzLl9sYXN0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTbG93IGRvd24gem9vbSBpZiBzaGlmdCBrZXkgaXMgaGVsZCBmb3IgbW9yZSBwcmVjaXNlIHpvb21pbmdcbiAgICAgICAgaWYgKGUuc2hpZnRLZXkgJiYgdmFsdWUpIHZhbHVlID0gdmFsdWUgLyA0O1xuXG4gICAgICAgIC8vIE9ubHkgZmlyZSB0aGUgY2FsbGJhY2sgaWYgd2UgYWN0dWFsbHkga25vdyB3aGF0IHR5cGUgb2Ygc2Nyb2xsaW5nIGRldmljZSB0aGUgdXNlciB1c2VzLlxuICAgICAgICBpZiAodGhpcy5fdHlwZSkge1xuICAgICAgICAgICAgdGhpcy5fbGFzdFdoZWVsRXZlbnQgPSBlO1xuICAgICAgICAgICAgdGhpcy5fZGVsdGEgLT0gdmFsdWU7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIF9vblRpbWVvdXQoaW5pdGlhbEV2ZW50ICAgICApIHtcbiAgICAgICAgdGhpcy5fdHlwZSA9ICd3aGVlbCc7XG4gICAgICAgIHRoaXMuX2RlbHRhIC09IHRoaXMuX2xhc3RWYWx1ZTtcbiAgICAgICAgaWYgKCF0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0KGluaXRpYWxFdmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfc3RhcnQoZSAgICAgKSB7XG4gICAgICAgIGlmICghdGhpcy5fZGVsdGEpIHJldHVybjtcblxuICAgICAgICB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuICAgICAgICB0aGlzLl9tYXAubW92aW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbWFwLnpvb21pbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLl9tYXAuZmlyZSgnbW92ZXN0YXJ0Jywge29yaWdpbmFsRXZlbnQ6IGV9KTtcbiAgICAgICAgdGhpcy5fbWFwLmZpcmUoJ3pvb21zdGFydCcsIHtvcmlnaW5hbEV2ZW50OiBlfSk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9maW5pc2hUaW1lb3V0KTtcblxuICAgICAgICBjb25zdCBwb3MgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpO1xuXG4gICAgICAgIHRoaXMuX2Fyb3VuZCA9IExuZ0xhdC5jb252ZXJ0KHRoaXMuX2Fyb3VuZENlbnRlciA/IHRoaXMuX21hcC5nZXRDZW50ZXIoKSA6IHRoaXMuX21hcC51bnByb2plY3QocG9zKSk7XG4gICAgICAgIHRoaXMuX2Fyb3VuZFBvaW50ID0gdGhpcy5fbWFwLnRyYW5zZm9ybS5sb2NhdGlvblBvaW50KHRoaXMuX2Fyb3VuZCk7XG4gICAgICAgIHRoaXMuX21hcC5fc3RhcnRBbmltYXRpb24odGhpcy5fb25TY3JvbGxGcmFtZSwgdGhpcy5fb25TY3JvbGxGaW5pc2hlZCk7XG4gICAgfVxuXG4gICAgX29uU2Nyb2xsRnJhbWUodHIgICAgICAgICAgICkge1xuICAgICAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIGlmIHdlJ3ZlIGhhZCBzY3JvbGwgZXZlbnRzIHNpbmNlIHRoZSBsYXN0IHJlbmRlciBmcmFtZSwgY29uc3VtZSB0aGVcbiAgICAgICAgLy8gYWNjdW11bGF0ZWQgZGVsdGEsIGFuZCB1cGRhdGUgdGhlIHRhcmdldCB6b29tIGxldmVsIGFjY29yZGluZ2x5XG4gICAgICAgIGlmICh0aGlzLl9kZWx0YSAhPT0gMCkge1xuICAgICAgICAgICAgLy8gRm9yIHRyYWNrcGFkIGV2ZW50cyBhbmQgc2luZ2xlIG1vdXNlIHdoZWVsIHRpY2tzLCB1c2UgdGhlIGRlZmF1bHQgem9vbSByYXRlXG4gICAgICAgICAgICBjb25zdCB6b29tUmF0ZSA9ICh0aGlzLl90eXBlID09PSAnd2hlZWwnICYmIE1hdGguYWJzKHRoaXMuX2RlbHRhKSA+IHdoZWVsWm9vbURlbHRhKSA/IHdoZWVsWm9vbVJhdGUgOiBkZWZhdWx0Wm9vbVJhdGU7XG4gICAgICAgICAgICAvLyBTY2FsZSBieSBzaWdtb2lkIG9mIHNjcm9sbCB3aGVlbCBkZWx0YS5cbiAgICAgICAgICAgIGxldCBzY2FsZSA9IG1heFNjYWxlUGVyRnJhbWUgLyAoMSArIE1hdGguZXhwKC1NYXRoLmFicyh0aGlzLl9kZWx0YSAqIHpvb21SYXRlKSkpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fZGVsdGEgPCAwICYmIHNjYWxlICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgc2NhbGUgPSAxIC8gc2NhbGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZyb21TY2FsZSA9IHR5cGVvZiB0aGlzLl90YXJnZXRab29tID09PSAnbnVtYmVyJyA/IHRyLnpvb21TY2FsZSh0aGlzLl90YXJnZXRab29tKSA6IHRyLnNjYWxlO1xuICAgICAgICAgICAgdGhpcy5fdGFyZ2V0Wm9vbSA9IE1hdGgubWluKHRyLm1heFpvb20sIE1hdGgubWF4KHRyLm1pblpvb20sIHRyLnNjYWxlWm9vbShmcm9tU2NhbGUgKiBzY2FsZSkpKTtcblxuICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIG1vdXNlIHdoZWVsLCByZWZyZXNoIHRoZSBzdGFydGluZyB6b29tIGFuZCBlYXNpbmdcbiAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHdlJ3JlIHVzaW5nIHRvIHNtb290aCBvdXQgdGhlIHpvb21pbmcgYmV0d2VlbiB3aGVlbFxuICAgICAgICAgICAgLy8gZXZlbnRzXG4gICAgICAgICAgICBpZiAodGhpcy5fdHlwZSA9PT0gJ3doZWVsJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0Wm9vbSA9IHRyLnpvb207XG4gICAgICAgICAgICAgICAgdGhpcy5fZWFzaW5nID0gdGhpcy5fc21vb3RoT3V0RWFzaW5nKDIwMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2RlbHRhID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl90eXBlID09PSAnd2hlZWwnKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gTWF0aC5taW4oKGJyb3dzZXIubm93KCkgLSB0aGlzLl9sYXN0V2hlZWxFdmVudFRpbWUpIC8gMjAwLCAxKTtcbiAgICAgICAgICAgIGNvbnN0IGsgPSB0aGlzLl9lYXNpbmcodCk7XG4gICAgICAgICAgICB0ci56b29tID0gaW50ZXJwb2xhdGUodGhpcy5fc3RhcnRab29tLCB0aGlzLl90YXJnZXRab29tLCBrKTtcbiAgICAgICAgICAgIGlmICh0ID09PSAxKSB0aGlzLl9tYXAuc3RvcCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHIuem9vbSA9IHRoaXMuX3RhcmdldFpvb207XG4gICAgICAgICAgICB0aGlzLl9tYXAuc3RvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHIuc2V0TG9jYXRpb25BdFBvaW50KHRoaXMuX2Fyb3VuZCwgdGhpcy5fYXJvdW5kUG9pbnQpO1xuXG4gICAgICAgIHRoaXMuX21hcC5maXJlKCdtb3ZlJywge29yaWdpbmFsRXZlbnQ6IHRoaXMuX2xhc3RXaGVlbEV2ZW50fSk7XG4gICAgICAgIHRoaXMuX21hcC5maXJlKCd6b29tJywge29yaWdpbmFsRXZlbnQ6IHRoaXMuX2xhc3RXaGVlbEV2ZW50fSk7XG4gICAgfVxuXG4gICAgX29uU2Nyb2xsRmluaXNoZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0FjdGl2ZSgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9maW5pc2hUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9tYXAubW92aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9tYXAuem9vbWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fbWFwLmZpcmUoJ3pvb21lbmQnKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKCdtb3ZlZW5kJyk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fdGFyZ2V0Wm9vbTtcbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG5cbiAgICBfc21vb3RoT3V0RWFzaW5nKGR1cmF0aW9uICAgICAgICApIHtcbiAgICAgICAgbGV0IGVhc2luZyA9IHV0aWwuZWFzZTtcblxuICAgICAgICBpZiAodGhpcy5fcHJldkVhc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGVhc2UgPSB0aGlzLl9wcmV2RWFzZSxcbiAgICAgICAgICAgICAgICB0ID0gKGJyb3dzZXIubm93KCkgLSBlYXNlLnN0YXJ0KSAvIGVhc2UuZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgc3BlZWQgPSBlYXNlLmVhc2luZyh0ICsgMC4wMSkgLSBlYXNlLmVhc2luZyh0KSxcblxuICAgICAgICAgICAgICAgIC8vIFF1aWNrIGhhY2sgdG8gbWFrZSBuZXcgYmV6aWVyIHRoYXQgaXMgY29udGludW91cyB3aXRoIGxhc3RcbiAgICAgICAgICAgICAgICB4ID0gMC4yNyAvIE1hdGguc3FydChzcGVlZCAqIHNwZWVkICsgMC4wMDAxKSAqIDAuMDEsXG4gICAgICAgICAgICAgICAgeSA9IE1hdGguc3FydCgwLjI3ICogMC4yNyAtIHggKiB4KTtcblxuICAgICAgICAgICAgZWFzaW5nID0gdXRpbC5iZXppZXIoeCwgeSwgMC4yNSwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wcmV2RWFzZSA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBicm93c2VyLm5vdygpLFxuICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICAgICAgZWFzaW5nOiBlYXNpbmdcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gZWFzaW5nO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTY3JvbGxab29tSGFuZGxlcjtcbiIsIi8vICAgICAgXG5cbmNvbnN0IERPTSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG5jb25zdCB3aW5kb3cgPSByZXF1aXJlKCcuLi8uLi91dGlsL3dpbmRvdycpO1xuY29uc3QgYnJvd3NlciA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvYnJvd3NlcicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jb25zdCBpbmVydGlhTGluZWFyaXR5ID0gMC4xNSxcbiAgICBpbmVydGlhRWFzaW5nID0gdXRpbC5iZXppZXIoMCwgMCwgaW5lcnRpYUxpbmVhcml0eSwgMSksXG4gICAgaW5lcnRpYURlY2VsZXJhdGlvbiA9IDEyLCAvLyBzY2FsZSAvIHNeMlxuICAgIGluZXJ0aWFNYXhTcGVlZCA9IDIuNSwgLy8gc2NhbGUgLyBzXG4gICAgc2lnbmlmaWNhbnRTY2FsZVRocmVzaG9sZCA9IDAuMTUsXG4gICAgc2lnbmlmaWNhbnRSb3RhdGVUaHJlc2hvbGQgPSAxMDtcblxuLyoqXG4gKiBUaGUgYFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tIGFuZCByb3RhdGUgdGhlIG1hcCBieVxuICogcGluY2hpbmcgb24gYSB0b3VjaHNjcmVlbi5cbiAqXG4gKiBAcGFyYW0ge01hcH0gbWFwIFRoZSBNYXBib3ggR0wgSlMgbWFwIHRvIGFkZCB0aGUgaGFuZGxlciB0by5cbiAqL1xuY2xhc3MgVG91Y2hab29tUm90YXRlSGFuZGxlciB7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKG1hcCAgICAgKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG5cbiAgICAgICAgdXRpbC5iaW5kQWxsKFtcbiAgICAgICAgICAgICdfb25TdGFydCcsXG4gICAgICAgICAgICAnX29uTW92ZScsXG4gICAgICAgICAgICAnX29uRW5kJ1xuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwicGluY2ggdG8gcm90YXRlIGFuZCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwicGluY2ggdG8gcm90YXRlIGFuZCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2VuYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJwaW5jaCB0byByb3RhdGUgYW5kIHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuYXJvdW5kXSBJZiBcImNlbnRlclwiIGlzIHBhc3NlZCwgbWFwIHdpbGwgem9vbSBhcm91bmQgdGhlIGNlbnRlclxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC50b3VjaFpvb21Sb3RhdGUuZW5hYmxlKCk7XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC50b3VjaFpvb21Sb3RhdGUuZW5hYmxlKHsgYXJvdW5kOiAnY2VudGVyJyB9KTtcbiAgICAgKi9cbiAgICBlbmFibGUob3B0aW9ucyAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VsLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLXRvdWNoLXpvb20tcm90YXRlJyk7XG4gICAgICAgIHRoaXMuX2VsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9vblN0YXJ0LCBmYWxzZSk7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9hcm91bmRDZW50ZXIgPSBvcHRpb25zICYmIG9wdGlvbnMuYXJvdW5kID09PSAnY2VudGVyJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJwaW5jaCB0byByb3RhdGUgYW5kIHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICBtYXAudG91Y2hab29tUm90YXRlLmRpc2FibGUoKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZWwuY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtdG91Y2gtem9vbS1yb3RhdGUnKTtcbiAgICAgICAgdGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX29uU3RhcnQpO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgdGhlIFwicGluY2ggdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24sIGxlYXZpbmcgdGhlIFwicGluY2ggdG8gem9vbVwiXG4gICAgICogaW50ZXJhY3Rpb24gZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICBtYXAudG91Y2hab29tUm90YXRlLmRpc2FibGVSb3RhdGlvbigpO1xuICAgICAqL1xuICAgIGRpc2FibGVSb3RhdGlvbigpIHtcbiAgICAgICAgdGhpcy5fcm90YXRpb25EaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJwaW5jaCB0byByb3RhdGVcIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICBtYXAudG91Y2hab29tUm90YXRlLmVuYWJsZSgpO1xuICAgICAqICAgbWFwLnRvdWNoWm9vbVJvdGF0ZS5lbmFibGVSb3RhdGlvbigpO1xuICAgICAqL1xuICAgIGVuYWJsZVJvdGF0aW9uKCkge1xuICAgICAgICB0aGlzLl9yb3RhdGlvbkRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgX29uU3RhcnQoZSAgICAgICAgICAgICkge1xuICAgICAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCAhPT0gMikgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHAwID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlLnRvdWNoZXNbMF0pLFxuICAgICAgICAgICAgcDEgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUudG91Y2hlc1sxXSk7XG5cbiAgICAgICAgdGhpcy5fc3RhcnRWZWMgPSBwMC5zdWIocDEpO1xuICAgICAgICB0aGlzLl9zdGFydFNjYWxlID0gdGhpcy5fbWFwLnRyYW5zZm9ybS5zY2FsZTtcbiAgICAgICAgdGhpcy5fc3RhcnRCZWFyaW5nID0gdGhpcy5fbWFwLnRyYW5zZm9ybS5iZWFyaW5nO1xuICAgICAgICB0aGlzLl9nZXN0dXJlSW50ZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9pbmVydGlhID0gW107XG5cbiAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuX29uTW92ZSwgZmFsc2UpO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9vbkVuZCwgZmFsc2UpO1xuICAgIH1cblxuICAgIF9vbk1vdmUoZSAgICAgICAgICAgICkge1xuICAgICAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCAhPT0gMikgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHAwID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlLnRvdWNoZXNbMF0pLFxuICAgICAgICAgICAgcDEgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUudG91Y2hlc1sxXSksXG4gICAgICAgICAgICBwID0gcDAuYWRkKHAxKS5kaXYoMiksXG4gICAgICAgICAgICB2ZWMgPSBwMC5zdWIocDEpLFxuICAgICAgICAgICAgc2NhbGUgPSB2ZWMubWFnKCkgLyB0aGlzLl9zdGFydFZlYy5tYWcoKSxcbiAgICAgICAgICAgIGJlYXJpbmcgPSB0aGlzLl9yb3RhdGlvbkRpc2FibGVkID8gMCA6IHZlYy5hbmdsZVdpdGgodGhpcy5fc3RhcnRWZWMpICogMTgwIC8gTWF0aC5QSSxcbiAgICAgICAgICAgIG1hcCA9IHRoaXMuX21hcDtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgJ2ludGVudCcgYnkgd2hpY2hldmVyIHRocmVzaG9sZCBpcyBzdXJwYXNzZWQgZmlyc3QsXG4gICAgICAgIC8vIHRoZW4ga2VlcCB0aGF0IHN0YXRlIGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyBnZXN0dXJlLlxuICAgICAgICBpZiAoIXRoaXMuX2dlc3R1cmVJbnRlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNjYWxpbmdTaWduaWZpY2FudGx5ID0gKE1hdGguYWJzKDEgLSBzY2FsZSkgPiBzaWduaWZpY2FudFNjYWxlVGhyZXNob2xkKSxcbiAgICAgICAgICAgICAgICByb3RhdGluZ1NpZ25pZmljYW50bHkgPSAoTWF0aC5hYnMoYmVhcmluZykgPiBzaWduaWZpY2FudFJvdGF0ZVRocmVzaG9sZCk7XG5cbiAgICAgICAgICAgIGlmIChyb3RhdGluZ1NpZ25pZmljYW50bHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZXN0dXJlSW50ZW50ID0gJ3JvdGF0ZSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNjYWxpbmdTaWduaWZpY2FudGx5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VzdHVyZUludGVudCA9ICd6b29tJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX2dlc3R1cmVJbnRlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydFZlYyA9IHZlYztcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydFNjYWxlID0gbWFwLnRyYW5zZm9ybS5zY2FsZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydEJlYXJpbmcgPSBtYXAudHJhbnNmb3JtLmJlYXJpbmc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtICAgICAgICAgPSB7IGR1cmF0aW9uOiAwLCBhcm91bmQ6IG1hcC51bnByb2plY3QocCkgfTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX2dlc3R1cmVJbnRlbnQgPT09ICdyb3RhdGUnKSB7XG4gICAgICAgICAgICAgICAgcGFyYW0uYmVhcmluZyA9IHRoaXMuX3N0YXJ0QmVhcmluZyArIGJlYXJpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fZ2VzdHVyZUludGVudCA9PT0gJ3pvb20nIHx8IHRoaXMuX2dlc3R1cmVJbnRlbnQgPT09ICdyb3RhdGUnKSB7XG4gICAgICAgICAgICAgICAgcGFyYW0uem9vbSA9IG1hcC50cmFuc2Zvcm0uc2NhbGVab29tKHRoaXMuX3N0YXJ0U2NhbGUgKiBzY2FsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1hcC5zdG9wKCk7XG4gICAgICAgICAgICB0aGlzLl9kcmFpbkluZXJ0aWFCdWZmZXIoKTtcbiAgICAgICAgICAgIHRoaXMuX2luZXJ0aWEucHVzaChbYnJvd3Nlci5ub3coKSwgc2NhbGUsIHBdKTtcblxuICAgICAgICAgICAgbWFwLmVhc2VUbyhwYXJhbSwgeyBvcmlnaW5hbEV2ZW50OiBlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIF9vbkVuZChlICAgICAgICAgICAgKSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9vbk1vdmUpO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9vbkVuZCk7XG4gICAgICAgIHRoaXMuX2RyYWluSW5lcnRpYUJ1ZmZlcigpO1xuXG4gICAgICAgIGNvbnN0IGluZXJ0aWEgPSB0aGlzLl9pbmVydGlhLFxuICAgICAgICAgICAgbWFwID0gdGhpcy5fbWFwO1xuXG4gICAgICAgIGlmIChpbmVydGlhLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIG1hcC5zbmFwVG9Ob3J0aCh7fSwgeyBvcmlnaW5hbEV2ZW50OiBlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdCA9IGluZXJ0aWFbaW5lcnRpYS5sZW5ndGggLSAxXSxcbiAgICAgICAgICAgIGZpcnN0ID0gaW5lcnRpYVswXSxcbiAgICAgICAgICAgIGxhc3RTY2FsZSA9IG1hcC50cmFuc2Zvcm0uc2NhbGVab29tKHRoaXMuX3N0YXJ0U2NhbGUgKiBsYXN0WzFdKSxcbiAgICAgICAgICAgIGZpcnN0U2NhbGUgPSBtYXAudHJhbnNmb3JtLnNjYWxlWm9vbSh0aGlzLl9zdGFydFNjYWxlICogZmlyc3RbMV0pLFxuICAgICAgICAgICAgc2NhbGVPZmZzZXQgPSBsYXN0U2NhbGUgLSBmaXJzdFNjYWxlLFxuICAgICAgICAgICAgc2NhbGVEdXJhdGlvbiA9IChsYXN0WzBdIC0gZmlyc3RbMF0pIC8gMTAwMCxcbiAgICAgICAgICAgIHAgPSBsYXN0WzJdO1xuXG4gICAgICAgIGlmIChzY2FsZUR1cmF0aW9uID09PSAwIHx8IGxhc3RTY2FsZSA9PT0gZmlyc3RTY2FsZSkge1xuICAgICAgICAgICAgbWFwLnNuYXBUb05vcnRoKHt9LCB7IG9yaWdpbmFsRXZlbnQ6IGUgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjYWxjdWxhdGUgc2NhbGUvcyBzcGVlZCBhbmQgYWRqdXN0IGZvciBpbmNyZWFzZWQgaW5pdGlhbCBhbmltYXRpb24gc3BlZWQgd2hlbiBlYXNpbmdcbiAgICAgICAgbGV0IHNwZWVkID0gc2NhbGVPZmZzZXQgKiBpbmVydGlhTGluZWFyaXR5IC8gc2NhbGVEdXJhdGlvbjsgLy8gc2NhbGUvc1xuXG4gICAgICAgIGlmIChNYXRoLmFicyhzcGVlZCkgPiBpbmVydGlhTWF4U3BlZWQpIHtcbiAgICAgICAgICAgIGlmIChzcGVlZCA+IDApIHtcbiAgICAgICAgICAgICAgICBzcGVlZCA9IGluZXJ0aWFNYXhTcGVlZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3BlZWQgPSAtaW5lcnRpYU1heFNwZWVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBNYXRoLmFicyhzcGVlZCAvIChpbmVydGlhRGVjZWxlcmF0aW9uICogaW5lcnRpYUxpbmVhcml0eSkpICogMTAwMDtcbiAgICAgICAgbGV0IHRhcmdldFNjYWxlID0gbGFzdFNjYWxlICsgc3BlZWQgKiBkdXJhdGlvbiAvIDIwMDA7XG5cbiAgICAgICAgaWYgKHRhcmdldFNjYWxlIDwgMCkge1xuICAgICAgICAgICAgdGFyZ2V0U2NhbGUgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFwLmVhc2VUbyh7XG4gICAgICAgICAgICB6b29tOiB0YXJnZXRTY2FsZSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICAgIGVhc2luZzogaW5lcnRpYUVhc2luZyxcbiAgICAgICAgICAgIGFyb3VuZDogdGhpcy5fYXJvdW5kQ2VudGVyID8gbWFwLmdldENlbnRlcigpIDogbWFwLnVucHJvamVjdChwKVxuICAgICAgICB9LCB7IG9yaWdpbmFsRXZlbnQ6IGUgfSk7XG4gICAgfVxuXG4gICAgX2RyYWluSW5lcnRpYUJ1ZmZlcigpIHtcbiAgICAgICAgY29uc3QgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWEsXG4gICAgICAgICAgICBub3cgPSBicm93c2VyLm5vdygpLFxuICAgICAgICAgICAgY3V0b2ZmID0gMTYwOyAvLyBtc2VjXG5cbiAgICAgICAgd2hpbGUgKGluZXJ0aWEubGVuZ3RoID4gMiAmJiBub3cgLSBpbmVydGlhWzBdWzBdID4gY3V0b2ZmKSBpbmVydGlhLnNoaWZ0KCk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXI7XG4iLCIvLyAgICAgIFxuXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5jb25zdCB3aW5kb3cgPSByZXF1aXJlKCcuLi91dGlsL3dpbmRvdycpO1xuY29uc3QgdGhyb3R0bGUgPSByZXF1aXJlKCcuLi91dGlsL3Rocm90dGxlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbi8qXG4gKiBBZGRzIHRoZSBtYXAncyBwb3NpdGlvbiB0byBpdHMgcGFnZSdzIGxvY2F0aW9uIGhhc2guXG4gKiBQYXNzZWQgYXMgYW4gb3B0aW9uIHRvIHRoZSBtYXAgb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIHtIYXNofSBgdGhpc2BcbiAqL1xuY2xhc3MgSGFzaCB7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdXRpbC5iaW5kQWxsKFtcbiAgICAgICAgICAgICdfb25IYXNoQ2hhbmdlJyxcbiAgICAgICAgICAgICdfdXBkYXRlSGFzaCdcbiAgICAgICAgXSwgdGhpcyk7XG5cbiAgICAgICAgLy8gTW9iaWxlIFNhZmFyaSBkb2Vzbid0IGFsbG93IHVwZGF0aW5nIHRoZSBoYXNoIG1vcmUgdGhhbiAxMDAgdGltZXMgcGVyIDMwIHNlY29uZHMuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUhhc2ggPSB0aHJvdHRsZSh0aGlzLl91cGRhdGVIYXNoVW50aHJvdHRsZWQuYmluZCh0aGlzKSwgMzAgKiAxMDAwIC8gMTAwKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIE1hcCBlbGVtZW50IHRvIGxpc3RlbiBmb3IgY29vcmRpbmF0ZSBjaGFuZ2VzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbWFwXG4gICAgICogQHJldHVybnMge0hhc2h9IGB0aGlzYFxuICAgICAqL1xuICAgIGFkZFRvKG1hcCAgICAgKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCB0aGlzLl9vbkhhc2hDaGFuZ2UsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlSGFzaCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogUmVtb3ZlcyBoYXNoXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCB0aGlzLl9vbkhhc2hDaGFuZ2UsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignbW92ZWVuZCcsIHRoaXMuX3VwZGF0ZUhhc2gpO1xuICAgICAgICBkZWxldGUgdGhpcy5fbWFwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBnZXRIYXNoU3RyaW5nKG1hcEZlZWRiYWNrICAgICAgICAgICkge1xuICAgICAgICBjb25zdCBjZW50ZXIgPSB0aGlzLl9tYXAuZ2V0Q2VudGVyKCksXG4gICAgICAgICAgICB6b29tID0gTWF0aC5yb3VuZCh0aGlzLl9tYXAuZ2V0Wm9vbSgpICogMTAwKSAvIDEwMCxcbiAgICAgICAgICAgIC8vIGRlcml2ZWQgZnJvbSBlcXVhdGlvbjogNTEycHggKiAyXnogLyAzNjAgLyAxMF5kIDwgMC41cHhcbiAgICAgICAgICAgIHByZWNpc2lvbiA9IE1hdGguY2VpbCgoem9vbSAqIE1hdGguTE4yICsgTWF0aC5sb2coNTEyIC8gMzYwIC8gMC41KSkgLyBNYXRoLkxOMTApLFxuICAgICAgICAgICAgbSA9IE1hdGgucG93KDEwLCBwcmVjaXNpb24pLFxuICAgICAgICAgICAgbG5nID0gTWF0aC5yb3VuZChjZW50ZXIubG5nICogbSkgLyBtLFxuICAgICAgICAgICAgbGF0ID0gTWF0aC5yb3VuZChjZW50ZXIubGF0ICogbSkgLyBtLFxuICAgICAgICAgICAgYmVhcmluZyA9IHRoaXMuX21hcC5nZXRCZWFyaW5nKCksXG4gICAgICAgICAgICBwaXRjaCA9IHRoaXMuX21hcC5nZXRQaXRjaCgpO1xuICAgICAgICBsZXQgaGFzaCA9ICcnO1xuICAgICAgICBpZiAobWFwRmVlZGJhY2spIHtcbiAgICAgICAgICAgIC8vIG5ldyBtYXAgZmVlZGJhY2sgc2l0ZSBoYXMgc29tZSBjb25zdHJhaW50cyB0aGF0IGRvbid0IGFsbG93XG4gICAgICAgICAgICAvLyB1cyB0byB1c2UgdGhlIHNhbWUgaGFzaCBmb3JtYXQgYXMgd2UgZG8gZm9yIHRoZSBNYXAgaGFzaCBvcHRpb24uXG4gICAgICAgICAgICBoYXNoICs9IGAjLyR7bG5nfS8ke2xhdH0vJHt6b29tfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYXNoICs9IGAjJHt6b29tfS8ke2xhdH0vJHtsbmd9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiZWFyaW5nIHx8IHBpdGNoKSBoYXNoICs9IChgLyR7TWF0aC5yb3VuZChiZWFyaW5nICogMTApIC8gMTB9YCk7XG4gICAgICAgIGlmIChwaXRjaCkgaGFzaCArPSAoYC8ke01hdGgucm91bmQocGl0Y2gpfWApO1xuICAgICAgICByZXR1cm4gaGFzaDtcbiAgICB9XG5cbiAgICBfb25IYXNoQ2hhbmdlKCkge1xuICAgICAgICBjb25zdCBsb2MgPSB3aW5kb3cubG9jYXRpb24uaGFzaC5yZXBsYWNlKCcjJywgJycpLnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChsb2MubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5qdW1wVG8oe1xuICAgICAgICAgICAgICAgIGNlbnRlcjogWytsb2NbMl0sICtsb2NbMV1dLFxuICAgICAgICAgICAgICAgIHpvb206ICtsb2NbMF0sXG4gICAgICAgICAgICAgICAgYmVhcmluZzogKyhsb2NbM10gfHwgMCksXG4gICAgICAgICAgICAgICAgcGl0Y2g6ICsobG9jWzRdIHx8IDApXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBfdXBkYXRlSGFzaFVudGhyb3R0bGVkKCkge1xuICAgICAgICBjb25zdCBoYXNoID0gdGhpcy5nZXRIYXNoU3RyaW5nKCk7XG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSgnJywgJycsIGhhc2gpO1xuICAgIH1cblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2g7XG4iLCIvLyAgICAgIFxuXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5jb25zdCBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG5jb25zdCB3aW5kb3cgPSByZXF1aXJlKCcuLi91dGlsL3dpbmRvdycpO1xuY29uc3Qge0hUTUxJbWFnZUVsZW1lbnQsIEhUTUxFbGVtZW50fSA9IHJlcXVpcmUoJy4uL3V0aWwvd2luZG93Jyk7XG5jb25zdCBET00gPSByZXF1aXJlKCcuLi91dGlsL2RvbScpO1xuY29uc3QgYWpheCA9IHJlcXVpcmUoJy4uL3V0aWwvYWpheCcpO1xuXG5jb25zdCBTdHlsZSA9IHJlcXVpcmUoJy4uL3N0eWxlL3N0eWxlJyk7XG5jb25zdCBFdmFsdWF0aW9uUGFyYW1ldGVycyA9IHJlcXVpcmUoJy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycycpO1xuY29uc3QgUGFpbnRlciA9IHJlcXVpcmUoJy4uL3JlbmRlci9wYWludGVyJyk7XG5cbmNvbnN0IFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4uL2dlby90cmFuc2Zvcm0nKTtcbmNvbnN0IEhhc2ggPSByZXF1aXJlKCcuL2hhc2gnKTtcblxuY29uc3QgYmluZEhhbmRsZXJzID0gcmVxdWlyZSgnLi9iaW5kX2hhbmRsZXJzJyk7XG5cbmNvbnN0IENhbWVyYSA9IHJlcXVpcmUoJy4vY2FtZXJhJyk7XG5jb25zdCBMbmdMYXQgPSByZXF1aXJlKCcuLi9nZW8vbG5nX2xhdCcpO1xuY29uc3QgTG5nTGF0Qm91bmRzID0gcmVxdWlyZSgnLi4vZ2VvL2xuZ19sYXRfYm91bmRzJyk7XG5jb25zdCBQb2ludCA9IHJlcXVpcmUoJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknKTtcbmNvbnN0IEF0dHJpYnV0aW9uQ29udHJvbCA9IHJlcXVpcmUoJy4vY29udHJvbC9hdHRyaWJ1dGlvbl9jb250cm9sJyk7XG5jb25zdCBMb2dvQ29udHJvbCA9IHJlcXVpcmUoJy4vY29udHJvbC9sb2dvX2NvbnRyb2wnKTtcbmNvbnN0IGlzU3VwcG9ydGVkID0gcmVxdWlyZSgnQG1hcGJveC9tYXBib3gtZ2wtc3VwcG9ydGVkJyk7XG5jb25zdCB7UkdCQUltYWdlfSA9IHJlcXVpcmUoJy4uL3V0aWwvaW1hZ2UnKTtcblxucmVxdWlyZSgnLi9ldmVudHMnKTsgLy8gUHVsbCBpbiBmb3IgZG9jdW1lbnRhdGlvbi5qc1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiBcbi8qIGVzbGludC1lbmFibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBcblxuY29uc3QgZGVmYXVsdE1pblpvb20gPSAwO1xuY29uc3QgZGVmYXVsdE1heFpvb20gPSAyMjtcbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIGNlbnRlcjogWzAsIDBdLFxuICAgIHpvb206IDAsXG4gICAgYmVhcmluZzogMCxcbiAgICBwaXRjaDogMCxcblxuICAgIG1pblpvb206IGRlZmF1bHRNaW5ab29tLFxuICAgIG1heFpvb206IGRlZmF1bHRNYXhab29tLFxuXG4gICAgaW50ZXJhY3RpdmU6IHRydWUsXG5cbiAgICBzY3JvbGxab29tOiB0cnVlLFxuICAgIGJveFpvb206IHRydWUsXG4gICAgZHJhZ1JvdGF0ZTogdHJ1ZSxcbiAgICBkcmFnUGFuOiB0cnVlLFxuICAgIGtleWJvYXJkOiB0cnVlLFxuICAgIGRvdWJsZUNsaWNrWm9vbTogdHJ1ZSxcbiAgICB0b3VjaFpvb21Sb3RhdGU6IHRydWUsXG5cbiAgICBiZWFyaW5nU25hcDogNyxcblxuICAgIGhhc2g6IGZhbHNlLFxuXG4gICAgYXR0cmlidXRpb25Db250cm9sOiB0cnVlLFxuXG4gICAgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDogZmFsc2UsXG4gICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBmYWxzZSxcblxuICAgIHRyYWNrUmVzaXplOiB0cnVlLFxuXG4gICAgcmVuZGVyV29ybGRDb3BpZXM6IHRydWUsXG5cbiAgICByZWZyZXNoRXhwaXJlZFRpbGVzOiB0cnVlLFxuXG4gICAgbWF4VGlsZUNhY2hlU2l6ZTogbnVsbCxcblxuICAgIHRyYW5zZm9ybVJlcXVlc3Q6IG51bGwsXG4gICAgZmFkZUR1cmF0aW9uOiAzMDBcbn07XG5cbi8qKlxuICogVGhlIGBNYXBgIG9iamVjdCByZXByZXNlbnRzIHRoZSBtYXAgb24geW91ciBwYWdlLiBJdCBleHBvc2VzIG1ldGhvZHNcbiAqIGFuZCBwcm9wZXJ0aWVzIHRoYXQgZW5hYmxlIHlvdSB0byBwcm9ncmFtbWF0aWNhbGx5IGNoYW5nZSB0aGUgbWFwLFxuICogYW5kIGZpcmVzIGV2ZW50cyBhcyB1c2VycyBpbnRlcmFjdCB3aXRoIGl0LlxuICpcbiAqIFlvdSBjcmVhdGUgYSBgTWFwYCBieSBzcGVjaWZ5aW5nIGEgYGNvbnRhaW5lcmAgYW5kIG90aGVyIG9wdGlvbnMuXG4gKiBUaGVuIE1hcGJveCBHTCBKUyBpbml0aWFsaXplcyB0aGUgbWFwIG9uIHRoZSBwYWdlIGFuZCByZXR1cm5zIHlvdXIgYE1hcGBcbiAqIG9iamVjdC5cbiAqXG4gKiBAZXh0ZW5kcyBFdmVudGVkXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtIVE1MRWxlbWVudHxzdHJpbmd9IG9wdGlvbnMuY29udGFpbmVyIFRoZSBIVE1MIGVsZW1lbnQgaW4gd2hpY2ggTWFwYm94IEdMIEpTIHdpbGwgcmVuZGVyIHRoZSBtYXAsIG9yIHRoZSBlbGVtZW50J3Mgc3RyaW5nIGBpZGAuIFRoZSBzcGVjaWZpZWQgZWxlbWVudCBtdXN0IGhhdmUgbm8gY2hpbGRyZW4uXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWluWm9vbT0wXSBUaGUgbWluaW11bSB6b29tIGxldmVsIG9mIHRoZSBtYXAgKDAtMjQpLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFpvb209MjJdIFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgb2YgdGhlIG1hcCAoMC0yNCkuXG4gKiBAcGFyYW0ge09iamVjdHxzdHJpbmd9IFtvcHRpb25zLnN0eWxlXSBUaGUgbWFwJ3MgTWFwYm94IHN0eWxlLiBUaGlzIG11c3QgYmUgYW4gYSBKU09OIG9iamVjdCBjb25mb3JtaW5nIHRvXG4gKiB0aGUgc2NoZW1hIGRlc2NyaWJlZCBpbiB0aGUgW01hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL21hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvKSwgb3IgYSBVUkwgdG9cbiAqIHN1Y2ggSlNPTi5cbiAqXG4gKiBUbyBsb2FkIGEgc3R5bGUgZnJvbSB0aGUgTWFwYm94IEFQSSwgeW91IGNhbiB1c2UgYSBVUkwgb2YgdGhlIGZvcm0gYG1hcGJveDovL3N0eWxlcy86b3duZXIvOnN0eWxlYCxcbiAqIHdoZXJlIGA6b3duZXJgIGlzIHlvdXIgTWFwYm94IGFjY291bnQgbmFtZSBhbmQgYDpzdHlsZWAgaXMgdGhlIHN0eWxlIElELiBPciB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZ1xuICogW3RoZSBwcmVkZWZpbmVkIE1hcGJveCBzdHlsZXNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwcy8pOlxuICpcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L3N0cmVldHMtdjlgXG4gKiAgKiBgbWFwYm94Oi8vc3R5bGVzL21hcGJveC9vdXRkb29ycy12OWBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L2xpZ2h0LXY5YFxuICogICogYG1hcGJveDovL3N0eWxlcy9tYXBib3gvZGFyay12OWBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L3NhdGVsbGl0ZS12OWBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L3NhdGVsbGl0ZS1zdHJlZXRzLXY5YFxuICpcbiAqIFRpbGVzZXRzIGhvc3RlZCB3aXRoIE1hcGJveCBjYW4gYmUgc3R5bGUtb3B0aW1pemVkIGlmIHlvdSBhcHBlbmQgYD9vcHRpbWl6ZT10cnVlYCB0byB0aGUgZW5kIG9mIHlvdXIgc3R5bGUgVVJMLCBsaWtlIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L3N0cmVldHMtdjk/b3B0aW1pemU9dHJ1ZWAuXG4gKiBMZWFybiBtb3JlIGFib3V0IHN0eWxlLW9wdGltaXplZCB2ZWN0b3IgdGlsZXMgaW4gb3VyIFtBUEkgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9hcGktZG9jdW1lbnRhdGlvbi8jcmV0cmlldmUtdGlsZXMpLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaGFzaD1mYWxzZV0gSWYgYHRydWVgLCB0aGUgbWFwJ3MgcG9zaXRpb24gKHpvb20sIGNlbnRlciBsYXRpdHVkZSwgY2VudGVyIGxvbmdpdHVkZSwgYmVhcmluZywgYW5kIHBpdGNoKSB3aWxsIGJlIHN5bmNlZCB3aXRoIHRoZSBoYXNoIGZyYWdtZW50IG9mIHRoZSBwYWdlJ3MgVVJMLlxuICogICBGb3IgZXhhbXBsZSwgYGh0dHA6Ly9wYXRoL3RvL215L3BhZ2UuaHRtbCMyLjU5LzM5LjI2LzUzLjA3Ly0yNC4xLzYwYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaW50ZXJhY3RpdmU9dHJ1ZV0gSWYgYGZhbHNlYCwgbm8gbW91c2UsIHRvdWNoLCBvciBrZXlib2FyZCBsaXN0ZW5lcnMgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgbWFwLCBzbyBpdCB3aWxsIG5vdCByZXNwb25kIHRvIGludGVyYWN0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmJlYXJpbmdTbmFwPTddIFRoZSB0aHJlc2hvbGQsIG1lYXN1cmVkIGluIGRlZ3JlZXMsIHRoYXQgZGV0ZXJtaW5lcyB3aGVuIHRoZSBtYXAnc1xuICogICBiZWFyaW5nIHdpbGwgc25hcCB0byBub3J0aC4gRm9yIGV4YW1wbGUsIHdpdGggYSBgYmVhcmluZ1NuYXBgIG9mIDcsIGlmIHRoZSB1c2VyIHJvdGF0ZXNcbiAqICAgdGhlIG1hcCB3aXRoaW4gNyBkZWdyZWVzIG9mIG5vcnRoLCB0aGUgbWFwIHdpbGwgYXV0b21hdGljYWxseSBzbmFwIHRvIGV4YWN0IG5vcnRoLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5waXRjaFdpdGhSb3RhdGU9dHJ1ZV0gSWYgYGZhbHNlYCwgdGhlIG1hcCdzIHBpdGNoICh0aWx0KSBjb250cm9sIHdpdGggXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIHdpbGwgYmUgZGlzYWJsZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmF0dHJpYnV0aW9uQ29udHJvbD10cnVlXSBJZiBgdHJ1ZWAsIGFuIHtAbGluayBBdHRyaWJ1dGlvbkNvbnRyb2x9IHdpbGwgYmUgYWRkZWQgdG8gdGhlIG1hcC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sb2dvUG9zaXRpb249J2JvdHRvbS1sZWZ0J10gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgTWFwYm94IHdvcmRtYXJrIG9uIHRoZSBtYXAuIFZhbGlkIG9wdGlvbnMgYXJlIGB0b3AtbGVmdGAsYHRvcC1yaWdodGAsIGBib3R0b20tbGVmdGAsIGBib3R0b20tcmlnaHRgLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PWZhbHNlXSBJZiBgdHJ1ZWAsIG1hcCBjcmVhdGlvbiB3aWxsIGZhaWwgaWYgdGhlIHBlcmZvcm1hbmNlIG9mIE1hcGJveFxuICogICBHTCBKUyB3b3VsZCBiZSBkcmFtYXRpY2FsbHkgd29yc2UgdGhhbiBleHBlY3RlZCAoaS5lLiBhIHNvZnR3YXJlIHJlbmRlcmVyIHdvdWxkIGJlIHVzZWQpLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXI9ZmFsc2VdIElmIGB0cnVlYCwgdGhlIG1hcCdzIGNhbnZhcyBjYW4gYmUgZXhwb3J0ZWQgdG8gYSBQTkcgdXNpbmcgYG1hcC5nZXRDYW52YXMoKS50b0RhdGFVUkwoKWAuIFRoaXMgaXMgYGZhbHNlYCBieSBkZWZhdWx0IGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5yZWZyZXNoRXhwaXJlZFRpbGVzPXRydWVdIElmIGBmYWxzZWAsIHRoZSBtYXAgd29uJ3QgYXR0ZW1wdCB0byByZS1yZXF1ZXN0IHRpbGVzIG9uY2UgdGhleSBleHBpcmUgcGVyIHRoZWlyIEhUVFAgYGNhY2hlQ29udHJvbGAvYGV4cGlyZXNgIGhlYWRlcnMuXG4gKiBAcGFyYW0ge0xuZ0xhdEJvdW5kc0xpa2V9IFtvcHRpb25zLm1heEJvdW5kc10gSWYgc2V0LCB0aGUgbWFwIHdpbGwgYmUgY29uc3RyYWluZWQgdG8gdGhlIGdpdmVuIGJvdW5kcy5cbiAqIEBwYXJhbSB7Ym9vbGVhbnxPYmplY3R9IFtvcHRpb25zLnNjcm9sbFpvb209dHJ1ZV0gSWYgYHRydWVgLCB0aGUgXCJzY3JvbGwgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuIEFuIGBPYmplY3RgIHZhbHVlIGlzIHBhc3NlZCBhcyBvcHRpb25zIHRvIHtAbGluayBTY3JvbGxab29tSGFuZGxlciNlbmFibGV9LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5ib3hab29tPXRydWVdIElmIGB0cnVlYCwgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkIChzZWUge0BsaW5rIEJveFpvb21IYW5kbGVyfSkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRyYWdSb3RhdGU9dHJ1ZV0gSWYgYHRydWVgLCB0aGUgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQgKHNlZSB7QGxpbmsgRHJhZ1JvdGF0ZUhhbmRsZXJ9KS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZHJhZ1Bhbj10cnVlXSBJZiBgdHJ1ZWAsIHRoZSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZCAoc2VlIHtAbGluayBEcmFnUGFuSGFuZGxlcn0pLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5rZXlib2FyZD10cnVlXSBJZiBgdHJ1ZWAsIGtleWJvYXJkIHNob3J0Y3V0cyBhcmUgZW5hYmxlZCAoc2VlIHtAbGluayBLZXlib2FyZEhhbmRsZXJ9KS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZG91YmxlQ2xpY2tab29tPXRydWVdIElmIGB0cnVlYCwgdGhlIFwiZG91YmxlIGNsaWNrIHRvIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkIChzZWUge0BsaW5rIERvdWJsZUNsaWNrWm9vbUhhbmRsZXJ9KS5cbiAqIEBwYXJhbSB7Ym9vbGVhbnxPYmplY3R9IFtvcHRpb25zLnRvdWNoWm9vbVJvdGF0ZT10cnVlXSBJZiBgdHJ1ZWAsIHRoZSBcInBpbmNoIHRvIHJvdGF0ZSBhbmQgem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuIEFuIGBPYmplY3RgIHZhbHVlIGlzIHBhc3NlZCBhcyBvcHRpb25zIHRvIHtAbGluayBUb3VjaFpvb21Sb3RhdGVIYW5kbGVyI2VuYWJsZX0uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWNrUmVzaXplPXRydWVdICBJZiBgdHJ1ZWAsIHRoZSBtYXAgd2lsbCBhdXRvbWF0aWNhbGx5IHJlc2l6ZSB3aGVuIHRoZSBicm93c2VyIHdpbmRvdyByZXNpemVzLlxuICogQHBhcmFtIHtMbmdMYXRMaWtlfSBbb3B0aW9ucy5jZW50ZXI9WzAsIDBdXSBUaGUgaW5pdGFsIGdlb2dyYXBoaWNhbCBjZW50ZXJwb2ludCBvZiB0aGUgbWFwLiBJZiBgY2VudGVyYCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zLCBNYXBib3ggR0wgSlMgd2lsbCBsb29rIGZvciBpdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgb2JqZWN0LiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBzdHlsZSwgZWl0aGVyLCBpdCB3aWxsIGRlZmF1bHQgdG8gYFswLCAwXWAgTm90ZTogTWFwYm94IEdMIHVzZXMgbG9uZ2l0dWRlLCBsYXRpdHVkZSBjb29yZGluYXRlIG9yZGVyIChhcyBvcHBvc2VkIHRvIGxhdGl0dWRlLCBsb25naXR1ZGUpIHRvIG1hdGNoIEdlb0pTT04uXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuem9vbT0wXSBUaGUgaW5pdGlhbCB6b29tIGxldmVsIG9mIHRoZSBtYXAuIElmIGB6b29tYCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zLCBNYXBib3ggR0wgSlMgd2lsbCBsb29rIGZvciBpdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgb2JqZWN0LiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBzdHlsZSwgZWl0aGVyLCBpdCB3aWxsIGRlZmF1bHQgdG8gYDBgLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmJlYXJpbmc9MF0gVGhlIGluaXRpYWwgYmVhcmluZyAocm90YXRpb24pIG9mIHRoZSBtYXAsIG1lYXN1cmVkIGluIGRlZ3JlZXMgY291bnRlci1jbG9ja3dpc2UgZnJvbSBub3J0aC4gSWYgYGJlYXJpbmdgIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9wdGlvbnMsIE1hcGJveCBHTCBKUyB3aWxsIGxvb2sgZm9yIGl0IGluIHRoZSBtYXAncyBzdHlsZSBvYmplY3QuIElmIGl0IGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHN0eWxlLCBlaXRoZXIsIGl0IHdpbGwgZGVmYXVsdCB0byBgMGAuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucGl0Y2g9MF0gVGhlIGluaXRpYWwgcGl0Y2ggKHRpbHQpIG9mIHRoZSBtYXAsIG1lYXN1cmVkIGluIGRlZ3JlZXMgYXdheSBmcm9tIHRoZSBwbGFuZSBvZiB0aGUgc2NyZWVuICgwLTYwKS4gSWYgYHBpdGNoYCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zLCBNYXBib3ggR0wgSlMgd2lsbCBsb29rIGZvciBpdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgb2JqZWN0LiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBzdHlsZSwgZWl0aGVyLCBpdCB3aWxsIGRlZmF1bHQgdG8gYDBgLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5yZW5kZXJXb3JsZENvcGllcz10cnVlXSAgSWYgYHRydWVgLCBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHdvcmxkIHdpbGwgYmUgcmVuZGVyZWQsIHdoZW4gem9vbWVkIG91dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhUaWxlQ2FjaGVTaXplPW51bGxdICBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGlsZXMgc3RvcmVkIGluIHRoZSB0aWxlIGNhY2hlIGZvciBhIGdpdmVuIHNvdXJjZS4gSWYgb21pdHRlZCwgdGhlIGNhY2hlIHdpbGwgYmUgZHluYW1pY2FsbHkgc2l6ZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgdmlld3BvcnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5PW51bGxdIElmIHNwZWNpZmllZCwgZGVmaW5lcyBhIENTUyBmb250LWZhbWlseVxuICogICBmb3IgbG9jYWxseSBvdmVycmlkaW5nIGdlbmVyYXRpb24gb2YgZ2x5cGhzIGluIHRoZSAnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocycgYW5kICdIYW5ndWwgU3lsbGFibGVzJyByYW5nZXMuXG4gKiAgIEluIHRoZXNlIHJhbmdlcywgZm9udCBzZXR0aW5ncyBmcm9tIHRoZSBtYXAncyBzdHlsZSB3aWxsIGJlIGlnbm9yZWQsIGV4Y2VwdCBmb3IgZm9udC13ZWlnaHQga2V5d29yZHMgKGxpZ2h0L3JlZ3VsYXIvbWVkaXVtL2JvbGQpLlxuICogICBUaGUgcHVycG9zZSBvZiB0aGlzIG9wdGlvbiBpcyB0byBhdm9pZCBiYW5kd2lkdGgtaW50ZW5zaXZlIGdseXBoIHNlcnZlciByZXF1ZXN0cy4gKHNlZSBbVXNlIGxvY2FsbHkgZ2VuZXJhdGVkIGlkZW9ncmFwaHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbG9jYWwtaWRlb2dyYXBocykpXG4gKiBAcGFyYW0ge1JlcXVlc3RUcmFuc2Zvcm1GdW5jdGlvbn0gW29wdGlvbnMudHJhbnNmb3JtUmVxdWVzdD1udWxsXSBBIGNhbGxiYWNrIHJ1biBiZWZvcmUgdGhlIE1hcCBtYWtlcyBhIHJlcXVlc3QgZm9yIGFuIGV4dGVybmFsIFVSTC4gVGhlIGNhbGxiYWNrIGNhbiBiZSB1c2VkIHRvIG1vZGlmeSB0aGUgdXJsLCBzZXQgaGVhZGVycywgb3Igc2V0IHRoZSBjcmVkZW50aWFscyBwcm9wZXJ0eSBmb3IgY3Jvc3Mtb3JpZ2luIHJlcXVlc3RzLlxuICogICBFeHBlY3RlZCB0byByZXR1cm4gYW4gb2JqZWN0IHdpdGggYSBgdXJsYCBwcm9wZXJ0eSBhbmQgb3B0aW9uYWxseSBgaGVhZGVyc2AgYW5kIGBjcmVkZW50aWFsc2AgcHJvcGVydGllcy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY29sbGVjdFJlc291cmNlVGltaW5nPWZhbHNlXSBJZiBgdHJ1ZWAsIFJlc291cmNlIFRpbWluZyBBUEkgaW5mb3JtYXRpb24gd2lsbCBiZSBjb2xsZWN0ZWQgZm9yIHJlcXVlc3RzIG1hZGUgYnkgR2VvSlNPTiBhbmQgVmVjdG9yIFRpbGUgd2ViIHdvcmtlcnMgKHRoaXMgaW5mb3JtYXRpb24gaXMgbm9ybWFsbHkgaW5hY2Nlc3NpYmxlIGZyb20gdGhlIG1haW4gSmF2YXNjcmlwdCB0aHJlYWQpLiBJbmZvcm1hdGlvbiB3aWxsIGJlIHJldHVybmVkIGluIGEgYHJlc291cmNlVGltaW5nYCBwcm9wZXJ0eSBvZiByZWxldmFudCBgZGF0YWAgZXZlbnRzLlxuICogQGV4YW1wbGVcbiAqIHZhciBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHtcbiAqICAgY29udGFpbmVyOiAnbWFwJyxcbiAqICAgY2VudGVyOiBbLTEyMi40MjA2NzksIDM3Ljc3MjUzN10sXG4gKiAgIHpvb206IDEzLFxuICogICBzdHlsZTogc3R5bGVfb2JqZWN0LFxuICogICBoYXNoOiB0cnVlLFxuICogICB0cmFuc2Zvcm1SZXF1ZXN0OiAodXJsLCByZXNvdXJjZVR5cGUpPT4ge1xuICogICAgIGlmKHJlc291cmNlVHlwZSA9PSAnU291cmNlJyAmJiB1cmwuc3RhcnRzV2l0aCgnaHR0cDovL215SG9zdCcpKSB7XG4gKiAgICAgICByZXR1cm4ge1xuICogICAgICAgIHVybDogdXJsLnJlcGxhY2UoJ2h0dHAnLCAnaHR0cHMnKSxcbiAqICAgICAgICBoZWFkZXJzOiB7ICdteS1jdXN0b20taGVhZGVyJzogdHJ1ZX0sXG4gKiAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyAgLy8gSW5jbHVkZSBjb29raWVzIGZvciBjcm9zcy1vcmlnaW4gcmVxdWVzdHNcbiAqICAgICAgfVxuICogICAgIH1cbiAqICAgfVxuICogfSk7XG4gKiBAc2VlIFtEaXNwbGF5IGEgbWFwXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlcy8pXG4gKi9cbmNsYXNzIE1hcCBleHRlbmRzIENhbWVyYSB7XG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zICAgICAgICAgICAgKSB7XG4gICAgICAgIG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLm1pblpvb20gIT0gbnVsbCAmJiBvcHRpb25zLm1heFpvb20gIT0gbnVsbCAmJiBvcHRpb25zLm1pblpvb20gPiBvcHRpb25zLm1heFpvb20pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbWF4Wm9vbSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBtaW5ab29tYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKG9wdGlvbnMubWluWm9vbSwgb3B0aW9ucy5tYXhab29tLCBvcHRpb25zLnJlbmRlcldvcmxkQ29waWVzKTtcbiAgICAgICAgc3VwZXIodHJhbnNmb3JtLCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLl9pbnRlcmFjdGl2ZSA9IG9wdGlvbnMuaW50ZXJhY3RpdmU7XG4gICAgICAgIHRoaXMuX21heFRpbGVDYWNoZVNpemUgPSBvcHRpb25zLm1heFRpbGVDYWNoZVNpemU7XG4gICAgICAgIHRoaXMuX2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQgPSBvcHRpb25zLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ7XG4gICAgICAgIHRoaXMuX3ByZXNlcnZlRHJhd2luZ0J1ZmZlciA9IG9wdGlvbnMucHJlc2VydmVEcmF3aW5nQnVmZmVyO1xuICAgICAgICB0aGlzLl90cmFja1Jlc2l6ZSA9IG9wdGlvbnMudHJhY2tSZXNpemU7XG4gICAgICAgIHRoaXMuX2JlYXJpbmdTbmFwID0gb3B0aW9ucy5iZWFyaW5nU25hcDtcbiAgICAgICAgdGhpcy5fcmVmcmVzaEV4cGlyZWRUaWxlcyA9IG9wdGlvbnMucmVmcmVzaEV4cGlyZWRUaWxlcztcbiAgICAgICAgdGhpcy5fZmFkZUR1cmF0aW9uID0gb3B0aW9ucy5mYWRlRHVyYXRpb247XG4gICAgICAgIHRoaXMuX2Nyb3NzRmFkaW5nRmFjdG9yID0gMTtcbiAgICAgICAgdGhpcy5fY29sbGVjdFJlc291cmNlVGltaW5nID0gb3B0aW9ucy5jb2xsZWN0UmVzb3VyY2VUaW1pbmc7XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtUmVxdWVzdEZuID0gb3B0aW9ucy50cmFuc2Zvcm1SZXF1ZXN0O1xuICAgICAgICB0aGlzLl90cmFuc2Zvcm1SZXF1ZXN0ID0gdHJhbnNmb3JtUmVxdWVzdEZuID8gICh1cmwsIHR5cGUpID0+IHRyYW5zZm9ybVJlcXVlc3RGbih1cmwsIHR5cGUpIHx8ICh7IHVybCB9KSA6ICh1cmwpID0+ICh7IHVybCB9KTtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuY29udGFpbmVyID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gd2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG9wdGlvbnMuY29udGFpbmVyKTtcbiAgICAgICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb250YWluZXIgJyR7b3B0aW9ucy5jb250YWluZXJ9JyBub3QgZm91bmQuYCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmNvbnRhaW5lciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0eXBlOiAnY29udGFpbmVyJyBtdXN0IGJlIGEgU3RyaW5nIG9yIEhUTUxFbGVtZW50LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubWF4Qm91bmRzKSB7XG4gICAgICAgICAgICB0aGlzLnNldE1heEJvdW5kcyhvcHRpb25zLm1heEJvdW5kcyk7XG4gICAgICAgIH1cblxuICAgICAgICB1dGlsLmJpbmRBbGwoW1xuICAgICAgICAgICAgJ19vbldpbmRvd09ubGluZScsXG4gICAgICAgICAgICAnX29uV2luZG93UmVzaXplJyxcbiAgICAgICAgICAgICdfY29udGV4dExvc3QnLFxuICAgICAgICAgICAgJ19jb250ZXh0UmVzdG9yZWQnLFxuICAgICAgICAgICAgJ191cGRhdGUnLFxuICAgICAgICAgICAgJ19yZW5kZXInLFxuICAgICAgICAgICAgJ19vbkRhdGEnLFxuICAgICAgICAgICAgJ19vbkRhdGFMb2FkaW5nJ1xuICAgICAgICBdLCB0aGlzKTtcblxuICAgICAgICB0aGlzLl9zZXR1cENvbnRhaW5lcigpO1xuICAgICAgICB0aGlzLl9zZXR1cFBhaW50ZXIoKTtcblxuICAgICAgICB0aGlzLm9uKCdtb3ZlJywgdGhpcy5fdXBkYXRlLmJpbmQodGhpcywgZmFsc2UpKTtcbiAgICAgICAgdGhpcy5vbignem9vbScsIHRoaXMuX3VwZGF0ZS5iaW5kKHRoaXMsIHRydWUpKTtcblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvbmxpbmUnLCB0aGlzLl9vbldpbmRvd09ubGluZSwgZmFsc2UpO1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX29uV2luZG93UmVzaXplLCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBiaW5kSGFuZGxlcnModGhpcywgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5faGFzaCA9IG9wdGlvbnMuaGFzaCAmJiAobmV3IEhhc2goKSkuYWRkVG8odGhpcyk7XG4gICAgICAgIC8vIGRvbid0IHNldCBwb3NpdGlvbiBmcm9tIG9wdGlvbnMgaWYgc2V0IHRocm91Z2ggaGFzaFxuICAgICAgICBpZiAoIXRoaXMuX2hhc2ggfHwgIXRoaXMuX2hhc2guX29uSGFzaENoYW5nZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUbyh7XG4gICAgICAgICAgICAgICAgY2VudGVyOiBvcHRpb25zLmNlbnRlcixcbiAgICAgICAgICAgICAgICB6b29tOiBvcHRpb25zLnpvb20sXG4gICAgICAgICAgICAgICAgYmVhcmluZzogb3B0aW9ucy5iZWFyaW5nLFxuICAgICAgICAgICAgICAgIHBpdGNoOiBvcHRpb25zLnBpdGNoXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzaXplKCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc3R5bGUpIHRoaXMuc2V0U3R5bGUob3B0aW9ucy5zdHlsZSwgeyBsb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk6IG9wdGlvbnMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5IH0pO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmF0dHJpYnV0aW9uQ29udHJvbCkgdGhpcy5hZGRDb250cm9sKG5ldyBBdHRyaWJ1dGlvbkNvbnRyb2woKSk7XG4gICAgICAgIHRoaXMuYWRkQ29udHJvbChuZXcgTG9nb0NvbnRyb2woKSwgb3B0aW9ucy5sb2dvUG9zaXRpb24pO1xuXG4gICAgICAgIHRoaXMub24oJ3N0eWxlLmxvYWQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybS51bm1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5qdW1wVG8odGhpcy5zdHlsZS5zdHlsZXNoZWV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vbignZGF0YScsIHRoaXMuX29uRGF0YSk7XG4gICAgICAgIHRoaXMub24oJ2RhdGFsb2FkaW5nJywgdGhpcy5fb25EYXRhTG9hZGluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHtAbGluayBJQ29udHJvbH0gdG8gdGhlIG1hcCwgY2FsbGluZyBgY29udHJvbC5vbkFkZCh0aGlzKWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0lDb250cm9sfSBjb250cm9sIFRoZSB7QGxpbmsgSUNvbnRyb2x9IHRvIGFkZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3Bvc2l0aW9uXSBwb3NpdGlvbiBvbiB0aGUgbWFwIHRvIHdoaWNoIHRoZSBjb250cm9sIHdpbGwgYmUgYWRkZWQuXG4gICAgICogVmFsaWQgdmFsdWVzIGFyZSBgJ3RvcC1sZWZ0J2AsIGAndG9wLXJpZ2h0J2AsIGAnYm90dG9tLWxlZnQnYCwgYW5kIGAnYm90dG9tLXJpZ2h0J2AuIERlZmF1bHRzIHRvIGAndG9wLXJpZ2h0J2AuXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQHNlZSBbRGlzcGxheSBtYXAgbmF2aWdhdGlvbiBjb250cm9sc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9uYXZpZ2F0aW9uLylcbiAgICAgKi9cbiAgICBhZGRDb250cm9sKGNvbnRyb2wgICAgICAgICAgLCBwb3NpdGlvbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCAmJiBjb250cm9sLmdldERlZmF1bHRQb3NpdGlvbikge1xuICAgICAgICAgICAgcG9zaXRpb24gPSBjb250cm9sLmdldERlZmF1bHRQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9ICd0b3AtcmlnaHQnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRyb2xFbGVtZW50ID0gY29udHJvbC5vbkFkZCh0aGlzKTtcbiAgICAgICAgY29uc3QgcG9zaXRpb25Db250YWluZXIgPSB0aGlzLl9jb250cm9sUG9zaXRpb25zW3Bvc2l0aW9uXTtcbiAgICAgICAgaWYgKHBvc2l0aW9uLmluZGV4T2YoJ2JvdHRvbScpICE9PSAtMSkge1xuICAgICAgICAgICAgcG9zaXRpb25Db250YWluZXIuaW5zZXJ0QmVmb3JlKGNvbnRyb2xFbGVtZW50LCBwb3NpdGlvbkNvbnRhaW5lci5maXJzdENoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvc2l0aW9uQ29udGFpbmVyLmFwcGVuZENoaWxkKGNvbnRyb2xFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBjb250cm9sIGZyb20gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SUNvbnRyb2x9IGNvbnRyb2wgVGhlIHtAbGluayBJQ29udHJvbH0gdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlbW92ZUNvbnRyb2woY29udHJvbCAgICAgICAgICApIHtcbiAgICAgICAgY29udHJvbC5vblJlbW92ZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzaXplcyB0aGUgbWFwIGFjY29yZGluZyB0byB0aGUgZGltZW5zaW9ucyBvZiBpdHNcbiAgICAgKiBgY29udGFpbmVyYCBlbGVtZW50LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG1hcCdzIGBjb250YWluZXJgIGlzIHJlc2l6ZWQgYnkgYW5vdGhlciBzY3JpcHQsXG4gICAgICogb3Igd2hlbiB0aGUgbWFwIGlzIHNob3duIGFmdGVyIGJlaW5nIGluaXRpYWxseSBoaWRkZW4gd2l0aCBDU1MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICByZXNpemUoKSB7XG4gICAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLl9jb250YWluZXJEaW1lbnNpb25zKCk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gZGltZW5zaW9uc1swXTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gZGltZW5zaW9uc1sxXTtcblxuICAgICAgICB0aGlzLl9yZXNpemVDYW52YXMod2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtLnJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5wYWludGVyLnJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICAgICAgLmZpcmUoJ21vdmVzdGFydCcpXG4gICAgICAgICAgICAuZmlyZSgnbW92ZScpXG4gICAgICAgICAgICAuZmlyZSgncmVzaXplJylcbiAgICAgICAgICAgIC5maXJlKCdtb3ZlZW5kJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGJvdW5kcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IFRoZSBtYXAncyBnZW9ncmFwaGljYWwgYm91bmRzLlxuICAgICAqL1xuICAgIGdldEJvdW5kcygpIHtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbmV3IExuZ0xhdEJvdW5kcyhcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLnBvaW50TG9jYXRpb24obmV3IFBvaW50KDAsIHRoaXMudHJhbnNmb3JtLmhlaWdodCkpLFxuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbihuZXcgUG9pbnQodGhpcy50cmFuc2Zvcm0ud2lkdGgsIDApKSk7XG5cbiAgICAgICAgaWYgKHRoaXMudHJhbnNmb3JtLmFuZ2xlIHx8IHRoaXMudHJhbnNmb3JtLnBpdGNoKSB7XG4gICAgICAgICAgICBib3VuZHMuZXh0ZW5kKHRoaXMudHJhbnNmb3JtLnBvaW50TG9jYXRpb24obmV3IFBvaW50KHRoaXMudHJhbnNmb3JtLnNpemUueCwgMCkpKTtcbiAgICAgICAgICAgIGJvdW5kcy5leHRlbmQodGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbihuZXcgUG9pbnQoMCwgdGhpcy50cmFuc2Zvcm0uc2l6ZS55KSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJvdW5kcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtYXAncyBnZW9ncmFwaGljYWwgYm91bmRzLlxuICAgICAqXG4gICAgICogUmV0dXJucyB0aGUgTG5nTGF0Qm91bmRzIGJ5IHdoaWNoIHBhbiBhbmQgem9vbSBvcGVyYXRpb25zIG9uIHRoZSBtYXAgYXJlIGNvbnN0cmFpbmVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0xuZ0xhdEJvdW5kcyB8IG51bGx9IFRoZSBtYXhpbXVtIGJvdW5kcyB0aGUgbWFwIGlzIGNvbnN0cmFpbmVkIHRvLCBvciBgbnVsbGAgaWYgbm9uZSBzZXQuXG4gICAgICovXG4gICAgZ2V0TWF4Qm91bmRzICgpIHtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNmb3JtLmxhdFJhbmdlICYmIHRoaXMudHJhbnNmb3JtLmxhdFJhbmdlLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0ubG5nUmFuZ2UgJiYgdGhpcy50cmFuc2Zvcm0ubG5nUmFuZ2UubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExuZ0xhdEJvdW5kcyhbdGhpcy50cmFuc2Zvcm0ubG5nUmFuZ2VbMF0sIHRoaXMudHJhbnNmb3JtLmxhdFJhbmdlWzBdXSxcbiAgICAgICAgICAgICAgICBbdGhpcy50cmFuc2Zvcm0ubG5nUmFuZ2VbMV0sIHRoaXMudHJhbnNmb3JtLmxhdFJhbmdlWzFdXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgb3IgY2xlYXJzIHRoZSBtYXAncyBnZW9ncmFwaGljYWwgYm91bmRzLlxuICAgICAqXG4gICAgICogUGFuIGFuZCB6b29tIG9wZXJhdGlvbnMgYXJlIGNvbnN0cmFpbmVkIHdpdGhpbiB0aGVzZSBib3VuZHMuXG4gICAgICogSWYgYSBwYW4gb3Igem9vbSBpcyBwZXJmb3JtZWQgdGhhdCB3b3VsZFxuICAgICAqIGRpc3BsYXkgcmVnaW9ucyBvdXRzaWRlIHRoZXNlIGJvdW5kcywgdGhlIG1hcCB3aWxsXG4gICAgICogaW5zdGVhZCBkaXNwbGF5IGEgcG9zaXRpb24gYW5kIHpvb20gbGV2ZWxcbiAgICAgKiBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGUgb3BlcmF0aW9uJ3MgcmVxdWVzdCB3aGlsZSBzdGlsbFxuICAgICAqIHJlbWFpbmluZyB3aXRoaW4gdGhlIGJvdW5kcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0Qm91bmRzTGlrZSB8IG51bGwgfCB1bmRlZmluZWR9IGxuZ2xhdGJvdW5kcyBUaGUgbWF4aW11bSBib3VuZHMgdG8gc2V0LiBJZiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiByZW1vdmVzIHRoZSBtYXAncyBtYXhpbXVtIGJvdW5kcy5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRNYXhCb3VuZHMobG5nbGF0Ym91bmRzICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGlmIChsbmdsYXRib3VuZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGIgPSBMbmdMYXRCb3VuZHMuY29udmVydChsbmdsYXRib3VuZHMpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0ubG5nUmFuZ2UgPSBbYi5nZXRXZXN0KCksIGIuZ2V0RWFzdCgpXTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLmxhdFJhbmdlID0gW2IuZ2V0U291dGgoKSwgYi5nZXROb3J0aCgpXTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLl9jb25zdHJhaW4oKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGxuZ2xhdGJvdW5kcyA9PT0gbnVsbCB8fCBsbmdsYXRib3VuZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0ubG5nUmFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0ubGF0UmFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIG9yIGNsZWFycyB0aGUgbWFwJ3MgbWluaW11bSB6b29tIGxldmVsLlxuICAgICAqIElmIHRoZSBtYXAncyBjdXJyZW50IHpvb20gbGV2ZWwgaXMgbG93ZXIgdGhhbiB0aGUgbmV3IG1pbmltdW0sXG4gICAgICogdGhlIG1hcCB3aWxsIHpvb20gdG8gdGhlIG5ldyBtaW5pbXVtLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBtaW5ab29tIFRoZSBtaW5pbXVtIHpvb20gbGV2ZWwgdG8gc2V0ICgwLTI0KS5cbiAgICAgKiAgIElmIGBudWxsYCBvciBgdW5kZWZpbmVkYCBpcyBwcm92aWRlZCwgdGhlIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIGN1cnJlbnQgbWluaW11bSB6b29tIChpLmUuIHNldHMgaXQgdG8gMCkuXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0TWluWm9vbShtaW5ab29tICAgICAgICAgICkge1xuXG4gICAgICAgIG1pblpvb20gPSBtaW5ab29tID09PSBudWxsIHx8IG1pblpvb20gPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRNaW5ab29tIDogbWluWm9vbTtcblxuICAgICAgICBpZiAobWluWm9vbSA+PSBkZWZhdWx0TWluWm9vbSAmJiBtaW5ab29tIDw9IHRoaXMudHJhbnNmb3JtLm1heFpvb20pIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLm1pblpvb20gPSBtaW5ab29tO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmdldFpvb20oKSA8IG1pblpvb20pIHRoaXMuc2V0Wm9vbShtaW5ab29tKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihgbWluWm9vbSBtdXN0IGJlIGJldHdlZW4gJHtkZWZhdWx0TWluWm9vbX0gYW5kIHRoZSBjdXJyZW50IG1heFpvb20sIGluY2x1c2l2ZWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIG1pbmltdW0gYWxsb3dhYmxlIHpvb20gbGV2ZWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBtaW5ab29tXG4gICAgICovXG4gICAgZ2V0TWluWm9vbSgpIHsgcmV0dXJuIHRoaXMudHJhbnNmb3JtLm1pblpvb207IH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgb3IgY2xlYXJzIHRoZSBtYXAncyBtYXhpbXVtIHpvb20gbGV2ZWwuXG4gICAgICogSWYgdGhlIG1hcCdzIGN1cnJlbnQgem9vbSBsZXZlbCBpcyBoaWdoZXIgdGhhbiB0aGUgbmV3IG1heGltdW0sXG4gICAgICogdGhlIG1hcCB3aWxsIHpvb20gdG8gdGhlIG5ldyBtYXhpbXVtLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBtYXhab29tIFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgdG8gc2V0LlxuICAgICAqICAgSWYgYG51bGxgIG9yIGB1bmRlZmluZWRgIGlzIHByb3ZpZGVkLCB0aGUgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgY3VycmVudCBtYXhpbXVtIHpvb20gKHNldHMgaXQgdG8gMjIpLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldE1heFpvb20obWF4Wm9vbSAgICAgICAgICApIHtcblxuICAgICAgICBtYXhab29tID0gbWF4Wm9vbSA9PT0gbnVsbCB8fCBtYXhab29tID09PSB1bmRlZmluZWQgPyBkZWZhdWx0TWF4Wm9vbSA6IG1heFpvb207XG5cbiAgICAgICAgaWYgKG1heFpvb20gPj0gdGhpcy50cmFuc2Zvcm0ubWluWm9vbSkge1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0ubWF4Wm9vbSA9IG1heFpvb207XG4gICAgICAgICAgICB0aGlzLl91cGRhdGUoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0Wm9vbSgpID4gbWF4Wm9vbSkgdGhpcy5zZXRab29tKG1heFpvb20pO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKGBtYXhab29tIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IG1pblpvb21gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBtYXhpbXVtIGFsbG93YWJsZSB6b29tIGxldmVsLlxuICAgICAqXG4gICAgICogQHJldHVybnMge251bWJlcn0gbWF4Wm9vbVxuICAgICAqL1xuICAgIGdldE1heFpvb20oKSB7IHJldHVybiB0aGlzLnRyYW5zZm9ybS5tYXhab29tOyB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFBvaW50fSByZXByZXNlbnRpbmcgcGl4ZWwgY29vcmRpbmF0ZXMsIHJlbGF0aXZlIHRvIHRoZSBtYXAncyBgY29udGFpbmVyYCxcbiAgICAgKiB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHNwZWNpZmllZCBnZW9ncmFwaGljYWwgbG9jYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdExpa2V9IGxuZ2xhdCBUaGUgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uIHRvIHByb2plY3QuXG4gICAgICogQHJldHVybnMge1BvaW50fSBUaGUge0BsaW5rIFBvaW50fSBjb3JyZXNwb25kaW5nIHRvIGBsbmdsYXRgLCByZWxhdGl2ZSB0byB0aGUgbWFwJ3MgYGNvbnRhaW5lcmAuXG4gICAgICovXG4gICAgcHJvamVjdChsbmdsYXQgICAgICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLmxvY2F0aW9uUG9pbnQoTG5nTGF0LmNvbnZlcnQobG5nbGF0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHtAbGluayBMbmdMYXR9IHJlcHJlc2VudGluZyBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMgdGhhdCBjb3JyZXNwb25kXG4gICAgICogdG8gdGhlIHNwZWNpZmllZCBwaXhlbCBjb29yZGluYXRlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UG9pbnRMaWtlfSBwb2ludCBUaGUgcGl4ZWwgY29vcmRpbmF0ZXMgdG8gdW5wcm9qZWN0LlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IFRoZSB7QGxpbmsgTG5nTGF0fSBjb3JyZXNwb25kaW5nIHRvIGBwb2ludGAuXG4gICAgICogQHNlZSBbU2hvdyBwb2x5Z29uIGluZm9ybWF0aW9uIG9uIGNsaWNrXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvbHlnb24tcG9wdXAtb24tY2xpY2svKVxuICAgICAqL1xuICAgIHVucHJvamVjdChwb2ludCAgICAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKFBvaW50LmNvbnZlcnQocG9pbnQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbGlzdGVuZXIgZm9yIGV2ZW50cyBvZiBhIHNwZWNpZmllZCB0eXBlLlxuICAgICAqXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBuYW1lIG9uXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlIHRvIGFkZCBhIGxpc3RlbiBmb3IuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyBmaXJlZC5cbiAgICAgKiAgIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgZGF0YSBvYmplY3QgcGFzc2VkIHRvIGBmaXJlYCxcbiAgICAgKiAgIGV4dGVuZGVkIHdpdGggYHRhcmdldGAgYW5kIGB0eXBlYCBwcm9wZXJ0aWVzLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIGZvciBldmVudHMgb2YgYSBzcGVjaWZpZWQgdHlwZSBvY2N1cnJpbmcgb24gZmVhdHVyZXMgaW4gYSBzcGVjaWZpZWQgc3R5bGUgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZSB0byBsaXN0ZW4gZm9yOyBvbmUgb2YgYCdtb3VzZWRvd24nYCwgYCdtb3VzZXVwJ2AsIGAnY2xpY2snYCwgYCdkYmxjbGljaydgLFxuICAgICAqIGAnbW91c2Vtb3ZlJ2AsIGAnbW91c2VlbnRlcidgLCBgJ21vdXNlbGVhdmUnYCwgYCdtb3VzZW92ZXInYCwgYCdtb3VzZW91dCdgLCBgJ2NvbnRleHRtZW51J2AsIGAndG91Y2hzdGFydCdgLFxuICAgICAqIGAndG91Y2hlbmQnYCwgb3IgYCd0b3VjaGNhbmNlbCdgLiBgbW91c2VlbnRlcmAgYW5kIGBtb3VzZW92ZXJgIGV2ZW50cyBhcmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGN1cnNvciBlbnRlcnNcbiAgICAgKiBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgc3BlY2lmaWVkIGxheWVyIGZyb20gb3V0c2lkZSB0aGF0IGxheWVyIG9yIG91dHNpZGUgdGhlIG1hcCBjYW52YXMuIGBtb3VzZWxlYXZlYFxuICAgICAqIGFuZCBgbW91c2VvdXRgIGV2ZW50cyBhcmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGN1cnNvciBsZWF2ZXMgYSB2aXNpYmxlIHBvcnRpb24gb2YgdGhlIHNwZWNpZmllZCBsYXllciwgb3IgbGVhdmVzXG4gICAgICogdGhlIG1hcCBjYW52YXMuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIFRoZSBJRCBvZiBhIHN0eWxlIGxheWVyLiBPbmx5IGV2ZW50cyB3aG9zZSBsb2NhdGlvbiBpcyB3aXRoaW4gYSB2aXNpYmxlXG4gICAgICogZmVhdHVyZSBpbiB0aGlzIGxheWVyIHdpbGwgdHJpZ2dlciB0aGUgbGlzdGVuZXIuIFRoZSBldmVudCB3aWxsIGhhdmUgYSBgZmVhdHVyZXNgIHByb3BlcnR5IGNvbnRhaW5pbmdcbiAgICAgKiBhbiBhcnJheSBvZiB0aGUgbWF0Y2hpbmcgZmVhdHVyZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyBmaXJlZC5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBvbih0eXBlICAgICAgICAgICwgbGF5ZXIgICAgICwgbGlzdGVuZXIgICAgICkge1xuICAgICAgICBpZiAobGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uKHR5cGUsIGxheWVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlbGVnYXRlZExpc3RlbmVyID0gKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnbW91c2VlbnRlcicgfHwgdHlwZSA9PT0gJ21vdXNlb3ZlcicpIHtcbiAgICAgICAgICAgICAgICBsZXQgbW91c2VpbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vdXNlbW92ZSA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5nZXRMYXllcihsYXllcikgPyB0aGlzLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhlLnBvaW50LCB7bGF5ZXJzOiBbbGF5ZXJdfSkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmZWF0dXJlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlaW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbW91c2Vpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VpbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIHV0aWwuZXh0ZW5kKHtmZWF0dXJlc30sIGUsIHt0eXBlfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBtb3VzZW91dCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbW91c2VpbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtsYXllciwgbGlzdGVuZXIsIGRlbGVnYXRlczoge21vdXNlbW92ZSwgbW91c2VvdXR9fTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ21vdXNlbGVhdmUnIHx8IHR5cGUgPT09ICdtb3VzZW91dCcpIHtcbiAgICAgICAgICAgICAgICBsZXQgbW91c2VpbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vdXNlbW92ZSA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5nZXRMYXllcihsYXllcikgPyB0aGlzLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhlLnBvaW50LCB7bGF5ZXJzOiBbbGF5ZXJdfSkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VpbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobW91c2Vpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VpbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCB1dGlsLmV4dGVuZCh7fSwgZSwge3R5cGV9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vdXNlb3V0ID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdXNlaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlaW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgdXRpbC5leHRlbmQoe30sIGUsIHt0eXBlfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge2xheWVyLCBsaXN0ZW5lciwgZGVsZWdhdGVzOiB7bW91c2Vtb3ZlLCBtb3VzZW91dH19O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5nZXRMYXllcihsYXllcikgPyB0aGlzLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhlLnBvaW50LCB7bGF5ZXJzOiBbbGF5ZXJdfSkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCB1dGlsLmV4dGVuZCh7ZmVhdHVyZXN9LCBlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiB7bGF5ZXIsIGxpc3RlbmVyLCBkZWxlZ2F0ZXM6IHtbdHlwZV06IGRlbGVnYXRlfX07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzID0gdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzIHx8IHt9O1xuICAgICAgICB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnNbdHlwZV0gPSB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnNbdHlwZV0gfHwgW107XG4gICAgICAgIHRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc1t0eXBlXS5wdXNoKGRlbGVnYXRlZExpc3RlbmVyKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IGluIGRlbGVnYXRlZExpc3RlbmVyLmRlbGVnYXRlcykge1xuICAgICAgICAgICAgdGhpcy5vbigoZXZlbnQgICAgICksIGRlbGVnYXRlZExpc3RlbmVyLmRlbGVnYXRlc1tldmVudF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBwcmV2aW91c2x5IGFkZGVkIHdpdGggYE1hcCNvbmAuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQG5hbWUgb2ZmXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlIHByZXZpb3VzbHkgdXNlZCB0byBpbnN0YWxsIHRoZSBsaXN0ZW5lci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gcHJldmlvdXNseSBpbnN0YWxsZWQgYXMgYSBsaXN0ZW5lci5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIGxheWVyLXNwZWNpZmljIGV2ZW50cyBwcmV2aW91c2x5IGFkZGVkIHdpdGggYE1hcCNvbmAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZSBwcmV2aW91c2x5IHVzZWQgdG8gaW5zdGFsbCB0aGUgbGlzdGVuZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIFRoZSBsYXllciBJRCBwcmV2aW91c2x5IHVzZWQgdG8gaW5zdGFsbCB0aGUgbGlzdGVuZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGZ1bmN0aW9uIHByZXZpb3VzbHkgaW5zdGFsbGVkIGFzIGEgbGlzdGVuZXIuXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgb2ZmKHR5cGUgICAgICAgICAgLCBsYXllciAgICAgLCBsaXN0ZW5lciAgICAgKSB7XG4gICAgICAgIGlmIChsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIub2ZmKHR5cGUsIGxheWVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnMgJiYgdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzW3R5cGVdKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnNbdHlwZV07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbGVnYXRlZExpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChkZWxlZ2F0ZWRMaXN0ZW5lci5sYXllciA9PT0gbGF5ZXIgJiYgZGVsZWdhdGVkTGlzdGVuZXIubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZXZlbnQgaW4gZGVsZWdhdGVkTGlzdGVuZXIuZGVsZWdhdGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZigoZXZlbnQgICAgICksIGRlbGVnYXRlZExpc3RlbmVyLmRlbGVnYXRlc1tldmVudF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgW0dlb0pTT05dKGh0dHA6Ly9nZW9qc29uLm9yZy8pXG4gICAgICogW0ZlYXR1cmUgb2JqZWN0c10oaHR0cDovL2dlb2pzb24ub3JnL2dlb2pzb24tc3BlYy5odG1sI2ZlYXR1cmUtb2JqZWN0cylcbiAgICAgKiByZXByZXNlbnRpbmcgdmlzaWJsZSBmZWF0dXJlcyB0aGF0IHNhdGlzZnkgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BvaW50TGlrZXxBcnJheTxQb2ludExpa2U+fSBbZ2VvbWV0cnldIC0gVGhlIGdlb21ldHJ5IG9mIHRoZSBxdWVyeSByZWdpb246XG4gICAgICogZWl0aGVyIGEgc2luZ2xlIHBvaW50IG9yIHNvdXRod2VzdCBhbmQgbm9ydGhlYXN0IHBvaW50cyBkZXNjcmliaW5nIGEgYm91bmRpbmcgYm94LlxuICAgICAqIE9taXR0aW5nIHRoaXMgcGFyYW1ldGVyIChpLmUuIGNhbGxpbmcge0BsaW5rIE1hcCNxdWVyeVJlbmRlcmVkRmVhdHVyZXN9IHdpdGggemVybyBhcmd1bWVudHMsXG4gICAgICogb3Igd2l0aCBvbmx5IGEgYG9wdGlvbnNgIGFyZ3VtZW50KSBpcyBlcXVpdmFsZW50IHRvIHBhc3NpbmcgYSBib3VuZGluZyBib3ggZW5jb21wYXNzaW5nIHRoZSBlbnRpcmVcbiAgICAgKiBtYXAgdmlld3BvcnQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW29wdGlvbnMubGF5ZXJzXSBBbiBhcnJheSBvZiBzdHlsZSBsYXllciBJRHMgZm9yIHRoZSBxdWVyeSB0byBpbnNwZWN0LlxuICAgICAqICAgT25seSBmZWF0dXJlcyB3aXRoaW4gdGhlc2UgbGF5ZXJzIHdpbGwgYmUgcmV0dXJuZWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCwgYWxsIGxheWVycyB3aWxsIGJlIGNoZWNrZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29wdGlvbnMuZmlsdGVyXSBBIFtmaWx0ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvI290aGVyLWZpbHRlcilcbiAgICAgKiAgIHRvIGxpbWl0IHF1ZXJ5IHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8T2JqZWN0Pn0gQW4gYXJyYXkgb2YgW0dlb0pTT05dKGh0dHA6Ly9nZW9qc29uLm9yZy8pXG4gICAgICogW2ZlYXR1cmUgb2JqZWN0c10oaHR0cDovL2dlb2pzb24ub3JnL2dlb2pzb24tc3BlYy5odG1sI2ZlYXR1cmUtb2JqZWN0cykuXG4gICAgICpcbiAgICAgKiBUaGUgYHByb3BlcnRpZXNgIHZhbHVlIG9mIGVhY2ggcmV0dXJuZWQgZmVhdHVyZSBvYmplY3QgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgaXRzIHNvdXJjZSBmZWF0dXJlLiBGb3IgR2VvSlNPTiBzb3VyY2VzLCBvbmx5XG4gICAgICogc3RyaW5nIGFuZCBudW1lcmljIHByb3BlcnR5IHZhbHVlcyBhcmUgc3VwcG9ydGVkIChpLmUuIGBudWxsYCwgYEFycmF5YCwgYW5kIGBPYmplY3RgIHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZCkuXG4gICAgICpcbiAgICAgKiBFYWNoIGZlYXR1cmUgaW5jbHVkZXMgYSB0b3AtbGV2ZWwgYGxheWVyYCBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzdHlsZSBsYXllciB0b1xuICAgICAqIHdoaWNoIHRoZSBmZWF0dXJlIGJlbG9uZ3MuIExheW91dCBhbmQgcGFpbnQgcHJvcGVydGllcyBpbiB0aGlzIG9iamVjdCBjb250YWluIHZhbHVlcyB3aGljaCBhcmUgZnVsbHkgZXZhbHVhdGVkXG4gICAgICogZm9yIHRoZSBnaXZlbiB6b29tIGxldmVsIGFuZCBmZWF0dXJlLlxuICAgICAqXG4gICAgICogRmVhdHVyZXMgZnJvbSBsYXllcnMgd2hvc2UgYHZpc2liaWxpdHlgIHByb3BlcnR5IGlzIGBcIm5vbmVcImAsIG9yIGZyb20gbGF5ZXJzIHdob3NlIHpvb20gcmFuZ2UgZXhjbHVkZXMgdGhlXG4gICAgICogY3VycmVudCB6b29tIGxldmVsIGFyZSBub3QgaW5jbHVkZWQuIFN5bWJvbCBmZWF0dXJlcyB0aGF0IGhhdmUgYmVlbiBoaWRkZW4gZHVlIHRvIHRleHQgb3IgaWNvbiBjb2xsaXNpb24gYXJlXG4gICAgICogbm90IGluY2x1ZGVkLiBGZWF0dXJlcyBmcm9tIGFsbCBvdGhlciBsYXllcnMgYXJlIGluY2x1ZGVkLCBpbmNsdWRpbmcgZmVhdHVyZXMgdGhhdCBtYXkgaGF2ZSBubyB2aXNpYmxlXG4gICAgICogY29udHJpYnV0aW9uIHRvIHRoZSByZW5kZXJlZCByZXN1bHQ7IGZvciBleGFtcGxlLCBiZWNhdXNlIHRoZSBsYXllcidzIG9wYWNpdHkgb3IgY29sb3IgYWxwaGEgY29tcG9uZW50IGlzIHNldCB0b1xuICAgICAqIDAuXG4gICAgICpcbiAgICAgKiBUaGUgdG9wbW9zdCByZW5kZXJlZCBmZWF0dXJlIGFwcGVhcnMgZmlyc3QgaW4gdGhlIHJldHVybmVkIGFycmF5LCBhbmQgc3Vic2VxdWVudCBmZWF0dXJlcyBhcmUgc29ydGVkIGJ5XG4gICAgICogZGVzY2VuZGluZyB6LW9yZGVyLiBGZWF0dXJlcyB0aGF0IGFyZSByZW5kZXJlZCBtdWx0aXBsZSB0aW1lcyAoZHVlIHRvIHdyYXBwaW5nIGFjcm9zcyB0aGUgYW50aW1lcmlkaWFuIGF0IGxvd1xuICAgICAqIHpvb20gbGV2ZWxzKSBhcmUgcmV0dXJuZWQgb25seSBvbmNlICh0aG91Z2ggc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNhdmVhdCkuXG4gICAgICpcbiAgICAgKiBCZWNhdXNlIGZlYXR1cmVzIGNvbWUgZnJvbSB0aWxlZCB2ZWN0b3IgZGF0YSBvciBHZW9KU09OIGRhdGEgdGhhdCBpcyBjb252ZXJ0ZWQgdG8gdGlsZXMgaW50ZXJuYWxseSwgZmVhdHVyZVxuICAgICAqIGdlb21ldHJpZXMgbWF5IGJlIHNwbGl0IG9yIGR1cGxpY2F0ZWQgYWNyb3NzIHRpbGUgYm91bmRhcmllcyBhbmQsIGFzIGEgcmVzdWx0LCBmZWF0dXJlcyBtYXkgYXBwZWFyIG11bHRpcGxlXG4gICAgICogdGltZXMgaW4gcXVlcnkgcmVzdWx0cy4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgdGhlcmUgaXMgYSBoaWdod2F5IHJ1bm5pbmcgdGhyb3VnaCB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIGEgcXVlcnkuXG4gICAgICogVGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5IHdpbGwgYmUgdGhvc2UgcGFydHMgb2YgdGhlIGhpZ2h3YXkgdGhhdCBsaWUgd2l0aGluIHRoZSBtYXAgdGlsZXMgY292ZXJpbmcgdGhlIGJvdW5kaW5nXG4gICAgICogcmVjdGFuZ2xlLCBldmVuIGlmIHRoZSBoaWdod2F5IGV4dGVuZHMgaW50byBvdGhlciB0aWxlcywgYW5kIHRoZSBwb3J0aW9uIG9mIHRoZSBoaWdod2F5IHdpdGhpbiBlYWNoIG1hcCB0aWxlXG4gICAgICogd2lsbCBiZSByZXR1cm5lZCBhcyBhIHNlcGFyYXRlIGZlYXR1cmUuIFNpbWlsYXJseSwgYSBwb2ludCBmZWF0dXJlIG5lYXIgYSB0aWxlIGJvdW5kYXJ5IG1heSBhcHBlYXIgaW4gbXVsdGlwbGVcbiAgICAgKiB0aWxlcyBkdWUgdG8gdGlsZSBidWZmZXJpbmcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEZpbmQgYWxsIGZlYXR1cmVzIGF0IGEgcG9pbnRcbiAgICAgKiB2YXIgZmVhdHVyZXMgPSBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKFxuICAgICAqICAgWzIwLCAzNV0sXG4gICAgICogICB7IGxheWVyczogWydteS1sYXllci1uYW1lJ10gfVxuICAgICAqICk7XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEZpbmQgYWxsIGZlYXR1cmVzIHdpdGhpbiBhIHN0YXRpYyBib3VuZGluZyBib3hcbiAgICAgKiB2YXIgZmVhdHVyZXMgPSBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKFxuICAgICAqICAgW1sxMCwgMjBdLCBbMzAsIDUwXV0sXG4gICAgICogICB7IGxheWVyczogWydteS1sYXllci1uYW1lJ10gfVxuICAgICAqICk7XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEZpbmQgYWxsIGZlYXR1cmVzIHdpdGhpbiBhIGJvdW5kaW5nIGJveCBhcm91bmQgYSBwb2ludFxuICAgICAqIHZhciB3aWR0aCA9IDEwO1xuICAgICAqIHZhciBoZWlnaHQgPSAyMDtcbiAgICAgKiB2YXIgZmVhdHVyZXMgPSBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKFtcbiAgICAgKiAgIFtwb2ludC54IC0gd2lkdGggLyAyLCBwb2ludC55IC0gaGVpZ2h0IC8gMl0sXG4gICAgICogICBbcG9pbnQueCArIHdpZHRoIC8gMiwgcG9pbnQueSArIGhlaWdodCAvIDJdXG4gICAgICogXSwgeyBsYXllcnM6IFsnbXktbGF5ZXItbmFtZSddIH0pO1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBRdWVyeSBhbGwgcmVuZGVyZWQgZmVhdHVyZXMgZnJvbSBhIHNpbmdsZSBsYXllclxuICAgICAqIHZhciBmZWF0dXJlcyA9IG1hcC5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoeyBsYXllcnM6IFsnbXktbGF5ZXItbmFtZSddIH0pO1xuICAgICAqIEBzZWUgW0dldCBmZWF0dXJlcyB1bmRlciB0aGUgbW91c2UgcG9pbnRlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxuICAgICAqIEBzZWUgW0hpZ2hsaWdodCBmZWF0dXJlcyB3aXRoaW4gYSBib3VuZGluZyBib3hdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdXNpbmctYm94LXF1ZXJ5cmVuZGVyZWRmZWF0dXJlcy8pXG4gICAgICogQHNlZSBbQ2VudGVyIHRoZSBtYXAgb24gYSBjbGlja2VkIHN5bWJvbF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jZW50ZXItb24tc3ltYm9sLylcbiAgICAgKi9cbiAgICBxdWVyeVJlbmRlcmVkRmVhdHVyZXMoZ2VvbWV0cnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBvcHRpb25zICAgICAgICAgKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIgY2FuIGJlIG9taXR0ZWQgZW50aXJlbHksIG1ha2luZyB0aGlzIGVmZmVjdGl2ZWx5IGFuIG92ZXJsb2FkZWQgbWV0aG9kXG4gICAgICAgIC8vIHdpdGggdHdvIHNpZ25hdHVyZXM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICBxdWVyeVJlbmRlcmVkRmVhdHVyZXMoZ2VvbWV0cnk6IFBvaW50TGlrZSB8IFtQb2ludExpa2UsIFBvaW50TGlrZV0sIG9wdGlvbnM/OiBPYmplY3QpXG4gICAgICAgIC8vICAgICBxdWVyeVJlbmRlcmVkRmVhdHVyZXMob3B0aW9ucz86IE9iamVjdClcbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlcmUgbm8gd2F5IHRvIGV4cHJlc3MgdGhhdCBpbiBhIHdheSB0aGF0J3MgY29tcGF0aWJsZSB3aXRoIGJvdGggZmxvdyBhbmQgZG9jdW1lbnRhdGlvbi5qcy5cbiAgICAgICAgLy8gUmVsYXRlZDogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzE1NTZcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGdlb21ldHJ5ID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmIGlzUG9pbnRMaWtlKGFyZ3VtZW50c1swXSkpIHtcbiAgICAgICAgICAgIGdlb21ldHJ5ID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGdlb21ldHJ5ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdlb21ldHJ5ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnN0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoXG4gICAgICAgICAgICB0aGlzLl9tYWtlUXVlcnlHZW9tZXRyeShnZW9tZXRyeSksXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0uem9vbSxcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLmFuZ2xlXG4gICAgICAgICk7XG5cbiAgICAgICAgZnVuY3Rpb24gaXNQb2ludExpa2UoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIFBvaW50IHx8IEFycmF5LmlzQXJyYXkoaW5wdXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX21ha2VRdWVyeUdlb21ldHJ5KHBvaW50T3JCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGlmIChwb2ludE9yQm94ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGJvdW5kcyB3YXMgb21pdHRlZDogdXNlIGZ1bGwgdmlld3BvcnRcbiAgICAgICAgICAgIHBvaW50T3JCb3ggPSBbXG4gICAgICAgICAgICAgICAgUG9pbnQuY29udmVydChbMCwgMF0pLFxuICAgICAgICAgICAgICAgIFBvaW50LmNvbnZlcnQoW3RoaXMudHJhbnNmb3JtLndpZHRoLCB0aGlzLnRyYW5zZm9ybS5oZWlnaHRdKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBxdWVyeUdlb21ldHJ5O1xuXG4gICAgICAgIGlmIChwb2ludE9yQm94IGluc3RhbmNlb2YgUG9pbnQgfHwgdHlwZW9mIHBvaW50T3JCb3hbMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IFBvaW50LmNvbnZlcnQocG9pbnRPckJveCk7XG4gICAgICAgICAgICBxdWVyeUdlb21ldHJ5ID0gW3BvaW50XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJveCA9IFtQb2ludC5jb252ZXJ0KHBvaW50T3JCb3hbMF0pLCBQb2ludC5jb252ZXJ0KHBvaW50T3JCb3hbMV0pXTtcbiAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnkgPSBbXG4gICAgICAgICAgICAgICAgYm94WzBdLFxuICAgICAgICAgICAgICAgIG5ldyBQb2ludChib3hbMV0ueCwgYm94WzBdLnkpLFxuICAgICAgICAgICAgICAgIGJveFsxXSxcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQoYm94WzBdLngsIGJveFsxXS55KSxcbiAgICAgICAgICAgICAgICBib3hbMF1cbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICBxdWVyeUdlb21ldHJ5ID0gcXVlcnlHZW9tZXRyeS5tYXAoKHApID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5wb2ludENvb3JkaW5hdGUocCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBxdWVyeUdlb21ldHJ5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgW0dlb0pTT05dKGh0dHA6Ly9nZW9qc29uLm9yZy8pXG4gICAgICogW0ZlYXR1cmUgb2JqZWN0c10oaHR0cDovL2dlb2pzb24ub3JnL2dlb2pzb24tc3BlYy5odG1sI2ZlYXR1cmUtb2JqZWN0cylcbiAgICAgKiByZXByZXNlbnRpbmcgZmVhdHVyZXMgd2l0aGluIHRoZSBzcGVjaWZpZWQgdmVjdG9yIHRpbGUgb3IgR2VvSlNPTiBzb3VyY2UgdGhhdCBzYXRpc2Z5IHRoZSBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZUlEIFRoZSBJRCBvZiB0aGUgdmVjdG9yIHRpbGUgb3IgR2VvSlNPTiBzb3VyY2UgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1ldGVycy5zb3VyY2VMYXllcl0gVGhlIG5hbWUgb2YgdGhlIHZlY3RvciB0aWxlIGxheWVyIHRvIHF1ZXJ5LiAqRm9yIHZlY3RvciB0aWxlXG4gICAgICogICBzb3VyY2VzLCB0aGlzIHBhcmFtZXRlciBpcyByZXF1aXJlZC4qIEZvciBHZW9KU09OIHNvdXJjZXMsIGl0IGlzIGlnbm9yZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcmFtZXRlcnMuZmlsdGVyXSBBIFtmaWx0ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvI290aGVyLWZpbHRlcilcbiAgICAgKiAgIHRvIGxpbWl0IHF1ZXJ5IHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8T2JqZWN0Pn0gQW4gYXJyYXkgb2YgW0dlb0pTT05dKGh0dHA6Ly9nZW9qc29uLm9yZy8pXG4gICAgICogW0ZlYXR1cmUgb2JqZWN0c10oaHR0cDovL2dlb2pzb24ub3JnL2dlb2pzb24tc3BlYy5odG1sI2ZlYXR1cmUtb2JqZWN0cykuXG4gICAgICpcbiAgICAgKiBJbiBjb250cmFzdCB0byB7QGxpbmsgTWFwI3F1ZXJ5UmVuZGVyZWRGZWF0dXJlc30sIHRoaXMgZnVuY3Rpb25cbiAgICAgKiByZXR1cm5zIGFsbCBmZWF0dXJlcyBtYXRjaGluZyB0aGUgcXVlcnkgcGFyYW1ldGVycyxcbiAgICAgKiB3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSByZW5kZXJlZCBieSB0aGUgY3VycmVudCBzdHlsZSAoaS5lLiB2aXNpYmxlKS4gVGhlIGRvbWFpbiBvZiB0aGUgcXVlcnkgaW5jbHVkZXMgYWxsIGN1cnJlbnRseS1sb2FkZWRcbiAgICAgKiB2ZWN0b3IgdGlsZXMgYW5kIEdlb0pTT04gc291cmNlIHRpbGVzOiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIHRpbGVzIG91dHNpZGUgdGhlIGN1cnJlbnRseVxuICAgICAqIHZpc2libGUgdmlld3BvcnQuXG4gICAgICpcbiAgICAgKiBCZWNhdXNlIGZlYXR1cmVzIGNvbWUgZnJvbSB0aWxlZCB2ZWN0b3IgZGF0YSBvciBHZW9KU09OIGRhdGEgdGhhdCBpcyBjb252ZXJ0ZWQgdG8gdGlsZXMgaW50ZXJuYWxseSwgZmVhdHVyZVxuICAgICAqIGdlb21ldHJpZXMgbWF5IGJlIHNwbGl0IG9yIGR1cGxpY2F0ZWQgYWNyb3NzIHRpbGUgYm91bmRhcmllcyBhbmQsIGFzIGEgcmVzdWx0LCBmZWF0dXJlcyBtYXkgYXBwZWFyIG11bHRpcGxlXG4gICAgICogdGltZXMgaW4gcXVlcnkgcmVzdWx0cy4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgdGhlcmUgaXMgYSBoaWdod2F5IHJ1bm5pbmcgdGhyb3VnaCB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIGEgcXVlcnkuXG4gICAgICogVGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5IHdpbGwgYmUgdGhvc2UgcGFydHMgb2YgdGhlIGhpZ2h3YXkgdGhhdCBsaWUgd2l0aGluIHRoZSBtYXAgdGlsZXMgY292ZXJpbmcgdGhlIGJvdW5kaW5nXG4gICAgICogcmVjdGFuZ2xlLCBldmVuIGlmIHRoZSBoaWdod2F5IGV4dGVuZHMgaW50byBvdGhlciB0aWxlcywgYW5kIHRoZSBwb3J0aW9uIG9mIHRoZSBoaWdod2F5IHdpdGhpbiBlYWNoIG1hcCB0aWxlXG4gICAgICogd2lsbCBiZSByZXR1cm5lZCBhcyBhIHNlcGFyYXRlIGZlYXR1cmUuIFNpbWlsYXJseSwgYSBwb2ludCBmZWF0dXJlIG5lYXIgYSB0aWxlIGJvdW5kYXJ5IG1heSBhcHBlYXIgaW4gbXVsdGlwbGVcbiAgICAgKiB0aWxlcyBkdWUgdG8gdGlsZSBidWZmZXJpbmcuXG4gICAgICogQHNlZSBbRmlsdGVyIGZlYXR1cmVzIHdpdGhpbiBtYXAgdmlld10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9maWx0ZXItZmVhdHVyZXMtd2l0aGluLW1hcC12aWV3LylcbiAgICAgKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgY29udGFpbmluZyBzaW1pbGFyIGRhdGFdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcXVlcnktc2ltaWxhci1mZWF0dXJlcy8pXG4gICAgICovXG4gICAgcXVlcnlTb3VyY2VGZWF0dXJlcyhzb3VyY2VJRCAgICAgICAgLCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5xdWVyeVNvdXJjZUZlYXR1cmVzKHNvdXJjZUlELCBwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBtYXAncyBNYXBib3ggc3R5bGUgb2JqZWN0IHdpdGggYSBuZXcgdmFsdWUuICBJZiB0aGUgZ2l2ZW5cbiAgICAgKiB2YWx1ZSBpcyBzdHlsZSBKU09OIG9iamVjdCwgY29tcGFyZXMgaXQgYWdhaW5zdCB0aGUgdGhlIG1hcCdzIGN1cnJlbnRcbiAgICAgKiBzdGF0ZSBhbmQgcGVyZm9ybSBvbmx5IHRoZSBjaGFuZ2VzIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBtYXAgc3R5bGUgbWF0Y2hcbiAgICAgKiB0aGUgZGVzaXJlZCBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdHlsZSBBIEpTT04gb2JqZWN0IGNvbmZvcm1pbmcgdG8gdGhlIHNjaGVtYSBkZXNjcmliZWQgaW4gdGhlXG4gICAgICogICBbTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vbWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8pLCBvciBhIFVSTCB0byBzdWNoIEpTT04uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGlmZj10cnVlXSBJZiBmYWxzZSwgZm9yY2UgYSAnZnVsbCcgdXBkYXRlLCByZW1vdmluZyB0aGUgY3VycmVudCBzdHlsZVxuICAgICAqICAgYW5kIGFkZGluZyBidWlsZGluZyB0aGUgZ2l2ZW4gb25lIGluc3RlYWQgb2YgYXR0ZW1wdGluZyBhIGRpZmYtYmFzZWQgdXBkYXRlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk9bnVsbF0gSWYgbm9uLW51bGwsIGRlZmluZXMgYSBjc3MgZm9udC1mYW1pbHlcbiAgICAgKiAgIGZvciBsb2NhbGx5IG92ZXJyaWRpbmcgZ2VuZXJhdGlvbiBvZiBnbHlwaHMgaW4gdGhlICdDSksgVW5pZmllZCBJZGVvZ3JhcGhzJyBhbmQgJ0hhbmd1bCBTeWxsYWJsZXMnXG4gICAgICogICByYW5nZXMuIEZvcmNlcyBhIGZ1bGwgdXBkYXRlLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBzZWUgW0NoYW5nZSBhIG1hcCdzIHN0eWxlXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3NldHN0eWxlLylcbiAgICAgKi9cbiAgICBzZXRTdHlsZShzdHlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgb3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgY29uc3Qgc2hvdWxkVHJ5RGlmZiA9ICghb3B0aW9ucyB8fCAob3B0aW9ucy5kaWZmICE9PSBmYWxzZSAmJiAhb3B0aW9ucy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkpKSAmJiB0aGlzLnN0eWxlO1xuICAgICAgICBpZiAoc2hvdWxkVHJ5RGlmZiAmJiBzdHlsZSAmJiB0eXBlb2Ygc3R5bGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0eWxlLnNldFN0YXRlKHN0eWxlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHV0aWwud2Fybk9uY2UoYFVuYWJsZSB0byBwZXJmb3JtIHN0eWxlIGRpZmY6ICR7ZS5tZXNzYWdlIHx8IGUuZXJyb3IgfHwgZX0uICBSZWJ1aWxkaW5nIHRoZSBzdHlsZSBmcm9tIHNjcmF0Y2guYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zdHlsZSkge1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5zZXRFdmVudGVkUGFyZW50KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5fcmVtb3ZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5zdHlsZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdHlsZSA9IG5ldyBTdHlsZSh0aGlzLCBvcHRpb25zIHx8IHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3R5bGUuc2V0RXZlbnRlZFBhcmVudCh0aGlzLCB7c3R5bGU6IHRoaXMuc3R5bGV9KTtcblxuICAgICAgICBpZiAodHlwZW9mIHN0eWxlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5sb2FkVVJMKHN0eWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUubG9hZEpTT04oc3R5bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgTWFwYm94IHN0eWxlIG9iamVjdCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhlIG1hcCdzIHN0eWxlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH0gVGhlIG1hcCdzIHN0eWxlIG9iamVjdC5cbiAgICAgKi9cbiAgICBnZXRTdHlsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0eWxlLnNlcmlhbGl6ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAncyBzdHlsZSBpcyBmdWxseSBsb2FkZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc3R5bGUgaXMgZnVsbHkgbG9hZGVkLlxuICAgICAqL1xuICAgIGlzU3R5bGVMb2FkZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5zdHlsZSkgcmV0dXJuIHV0aWwud2Fybk9uY2UoJ1RoZXJlIGlzIG5vIHN0eWxlIGFkZGVkIHRvIHRoZSBtYXAuJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmxvYWRlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBzb3VyY2UgdG8gdGhlIG1hcCdzIHN0eWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgc291cmNlIHRvIGFkZC4gTXVzdCBub3QgY29uZmxpY3Qgd2l0aCBleGlzdGluZyBzb3VyY2VzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QsIGNvbmZvcm1pbmcgdG8gdGhlXG4gICAgICogTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb24ncyBbc291cmNlIGRlZmluaXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI3NvdXJjZXMpLlxuICAgICAqIEBmaXJlcyBzb3VyY2UuYWRkXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQHNlZSBbRHJhdyBHZW9KU09OIHBvaW50c10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nZW9qc29uLW1hcmtlcnMvKVxuICAgICAqIEBzZWUgW1N0eWxlIGNpcmNsZXMgdXNpbmcgZGF0YS1kcml2ZW4gc3R5bGluZ10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kYXRhLWRyaXZlbi1jaXJjbGUtY29sb3JzLylcbiAgICAgKiBAc2VlIFtTZXQgYSBwb2ludCBhZnRlciBHZW9jb2RlciByZXN1bHRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9pbnQtZnJvbS1nZW9jb2Rlci1yZXN1bHQvKVxuICAgICAqL1xuICAgIGFkZFNvdXJjZShpZCAgICAgICAgLCBzb3VyY2UgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5zdHlsZS5hZGRTb3VyY2UoaWQsIHNvdXJjZSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzb3VyY2UgaXMgbG9hZGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgc291cmNlIHRvIGJlIGNoZWNrZWQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IEEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNvdXJjZSBpcyBsb2FkZWQuXG4gICAgICovXG4gICAgaXNTb3VyY2VMb2FkZWQoaWQgICAgICAgICkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnN0eWxlICYmIHRoaXMuc3R5bGUuc291cmNlQ2FjaGVzW2lkXTtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoYFRoZXJlIGlzIG5vIHNvdXJjZSB3aXRoIElEICcke2lkfSdgKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZS5sb2FkZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYWxsIHRpbGVzIGluIHRoZSB2aWV3cG9ydCBmcm9tIGFsbCBzb3VyY2VzIG9uXG4gICAgICogdGhlIHN0eWxlIGFyZSBsb2FkZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhbGwgdGlsZXMgYXJlIGxvYWRlZC5cbiAgICAgKi9cblxuICAgIGFyZVRpbGVzTG9hZGVkKCkge1xuICAgICAgICBjb25zdCBzb3VyY2VzID0gdGhpcy5zdHlsZSAmJiB0aGlzLnN0eWxlLnNvdXJjZUNhY2hlcztcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBzb3VyY2VzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VzW2lkXTtcbiAgICAgICAgICAgIGNvbnN0IHRpbGVzID0gc291cmNlLl90aWxlcztcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBpbiB0aWxlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aWxlc1t0XTtcbiAgICAgICAgICAgICAgICBpZiAoISh0aWxlLnN0YXRlID09PSAnbG9hZGVkJyB8fCB0aWxlLnN0YXRlID09PSAnZXJyb3JlZCcpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIFtjdXN0b20gc291cmNlIHR5cGVdKCNDdXN0b20gU291cmNlcyksIG1ha2luZyBpdCBhdmFpbGFibGUgZm9yIHVzZSB3aXRoXG4gICAgICoge0BsaW5rIE1hcCNhZGRTb3VyY2V9LlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSB0eXBlOyBzb3VyY2UgZGVmaW5pdGlvbiBvYmplY3RzIHVzZSB0aGlzIG5hbWUgaW4gdGhlIGB7dHlwZTogLi4ufWAgZmllbGQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gU291cmNlVHlwZSBBIHtAbGluayBTb3VyY2V9IGNvbnN0cnVjdG9yLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCB3aGVuIHRoZSBzb3VyY2UgdHlwZSBpcyByZWFkeSBvciB3aXRoIGFuIGVycm9yIGFyZ3VtZW50IGlmIHRoZXJlIGlzIGFuIGVycm9yLlxuICAgICAqL1xuICAgIGFkZFNvdXJjZVR5cGUobmFtZSAgICAgICAgLCBTb3VyY2VUeXBlICAgICAsIGNhbGxiYWNrICAgICAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5hZGRTb3VyY2VUeXBlKG5hbWUsIFNvdXJjZVR5cGUsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgc291cmNlIGZyb20gdGhlIG1hcCdzIHN0eWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgc291cmNlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICByZW1vdmVTb3VyY2UoaWQgICAgICAgICkge1xuICAgICAgICB0aGlzLnN0eWxlLnJlbW92ZVNvdXJjZShpZCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc291cmNlIHdpdGggdGhlIHNwZWNpZmllZCBJRCBpbiB0aGUgbWFwJ3Mgc3R5bGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBzb3VyY2UgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHs/T2JqZWN0fSBUaGUgc3R5bGUgc291cmNlIHdpdGggdGhlIHNwZWNpZmllZCBJRCwgb3IgYHVuZGVmaW5lZGBcbiAgICAgKiAgIGlmIHRoZSBJRCBjb3JyZXNwb25kcyB0byBubyBleGlzdGluZyBzb3VyY2VzLlxuICAgICAqIEBzZWUgW0NyZWF0ZSBhIGRyYWdnYWJsZSBwb2ludF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtcG9pbnQvKVxuICAgICAqIEBzZWUgW0FuaW1hdGUgYSBwb2ludF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9hbmltYXRlLXBvaW50LWFsb25nLWxpbmUvKVxuICAgICAqIEBzZWUgW0FkZCBsaXZlIHJlYWx0aW1lIGRhdGFdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbGl2ZS1nZW9qc29uLylcbiAgICAgKi9cbiAgICBnZXRTb3VyY2UoaWQgICAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRTb3VyY2UoaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhbiBpbWFnZSB0byB0aGUgc3R5bGUuIFRoaXMgaW1hZ2UgY2FuIGJlIHVzZWQgaW4gYGljb24taW1hZ2VgLFxuICAgICAqIGBiYWNrZ3JvdW5kLXBhdHRlcm5gLCBgZmlsbC1wYXR0ZXJuYCwgYW5kIGBsaW5lLXBhdHRlcm5gLiBBblxuICAgICAqIHtAbGluayBNYXAjZXJyb3J9IGV2ZW50IHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSBpbiB0aGVcbiAgICAgKiBzcHJpdGUgdG8gYWRkIHRoaXMgaW1hZ2UuXG4gICAgICpcbiAgICAgKiBAc2VlIFtBZGQgYW4gaWNvbiB0byB0aGUgbWFwXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2FkZC1pbWFnZS8pXG4gICAgICogQHNlZSBbQWRkIGEgZ2VuZXJhdGVkIGljb24gdG8gdGhlIG1hcF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9hZGQtaW1hZ2UtZ2VuZXJhdGVkLylcbiAgICAgKiBAcGFyYW0gaWQgVGhlIElEIG9mIHRoZSBpbWFnZS5cbiAgICAgKiBAcGFyYW0gaW1hZ2UgVGhlIGltYWdlIGFzIGFuIGBIVE1MSW1hZ2VFbGVtZW50YCwgYEltYWdlRGF0YWAsIG9yIG9iamVjdCB3aXRoIGB3aWR0aGAsIGBoZWlnaHRgLCBhbmQgYGRhdGFgXG4gICAgICogcHJvcGVydGllcyB3aXRoIHRoZSBzYW1lIGZvcm1hdCBhcyBgSW1hZ2VEYXRhYC5cbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSBvcHRpb25zLnBpeGVsUmF0aW8gVGhlIHJhdGlvIG9mIHBpeGVscyBpbiB0aGUgaW1hZ2UgdG8gcGh5c2ljYWwgcGl4ZWxzIG9uIHRoZSBzY3JlZW5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5zZGYgV2hldGhlciB0aGUgaW1hZ2Ugc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGFuIFNERiBpbWFnZVxuICAgICAqL1xuICAgIGFkZEltYWdlKGlkICAgICAgICAsXG4gICAgICAgICAgICAgaW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsXG4gICAgICAgICAgICAge3BpeGVsUmF0aW8gPSAxLCBzZGYgPSBmYWxzZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHt9KSB7XG4gICAgICAgIGlmIChpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0LCBkYXRhfSA9IGJyb3dzZXIuZ2V0SW1hZ2VEYXRhKGltYWdlKTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuYWRkSW1hZ2UoaWQsIHsgZGF0YTogbmV3IFJHQkFJbWFnZSh7d2lkdGgsIGhlaWdodH0sIGRhdGEpLCBwaXhlbFJhdGlvLCBzZGYgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW1hZ2Uud2lkdGggPT09IHVuZGVmaW5lZCB8fCBpbWFnZS5oZWlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZSgnZXJyb3InLCB7ZXJyb3I6IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudHMgdG8gbWFwLmFkZEltYWdlKCkuIFRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhbiBgSFRNTEltYWdlRWxlbWVudGAsIGBJbWFnZURhdGFgLCAnICtcbiAgICAgICAgICAgICAgICAnb3Igb2JqZWN0IHdpdGggYHdpZHRoYCwgYGhlaWdodGAsIGFuZCBgZGF0YWAgcHJvcGVydGllcyB3aXRoIHRoZSBzYW1lIGZvcm1hdCBhcyBgSW1hZ2VEYXRhYCcpfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7d2lkdGgsIGhlaWdodCwgZGF0YX0gPSBpbWFnZTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuYWRkSW1hZ2UoaWQsIHsgZGF0YTogbmV3IFJHQkFJbWFnZSh7d2lkdGgsIGhlaWdodH0sIGRhdGEuc2xpY2UoMCkpLCBwaXhlbFJhdGlvLCBzZGYgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgd2V0aGVyIHRoZSBpbWFnZSBoYXMgYmVlbiBhZGRlZCBvciBub3RcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZCBUaGUgSUQgb2YgdGhlIGltYWdlLlxuICAgICAqL1xuICAgIGhhc0ltYWdlKGlkICAgICAgICApICAgICAgICAgIHtcbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIGltYWdlIGlkJylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhdGhpcy5zdHlsZS5nZXRJbWFnZShpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFuIGltYWdlIGZyb20gdGhlIHN0eWxlIChzdWNoIGFzIG9uZSB1c2VkIGJ5IGBpY29uLWltYWdlYCBvciBgYmFja2dyb3VuZC1wYXR0ZXJuYCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaWQgVGhlIElEIG9mIHRoZSBpbWFnZS5cbiAgICAgKi9cbiAgICByZW1vdmVJbWFnZShpZCAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuc3R5bGUucmVtb3ZlSW1hZ2UoaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgYW4gaW1hZ2UgZnJvbSBhbiBleHRlcm5hbCBVUkwgZm9yIHVzZSB3aXRoIGBNYXAjYWRkSW1hZ2VgLiBFeHRlcm5hbFxuICAgICAqIGRvbWFpbnMgbXVzdCBzdXBwb3J0IFtDT1JTXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0FjY2Vzc19jb250cm9sX0NPUlMpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIG9mIHRoZSBpbWFnZSBmaWxlLiBJbWFnZSBmaWxlIG11c3QgYmUgaW4gcG5nLCB3ZWJwLCBvciBqcGcgZm9ybWF0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEV4cGVjdGluZyBgY2FsbGJhY2soZXJyb3IsIGRhdGEpYC4gQ2FsbGVkIHdoZW4gdGhlIGltYWdlIGhhcyBsb2FkZWQgb3Igd2l0aCBhbiBlcnJvciBhcmd1bWVudCBpZiB0aGVyZSBpcyBhbiBlcnJvci5cbiAgICAgKiBAc2VlIFtBZGQgYW4gaWNvbiB0byB0aGUgbWFwXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2FkZC1pbWFnZS8pXG4gICAgICovXG4gICAgbG9hZEltYWdlKHVybCAgICAgICAgLCBjYWxsYmFjayAgICAgICAgICApIHtcbiAgICAgICAgYWpheC5nZXRJbWFnZSh0aGlzLl90cmFuc2Zvcm1SZXF1ZXN0KHVybCwgYWpheC5SZXNvdXJjZVR5cGUuSW1hZ2UpLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIFtNYXBib3ggc3R5bGUgbGF5ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI2xheWVycylcbiAgICAgKiB0byB0aGUgbWFwJ3Mgc3R5bGUuXG4gICAgICpcbiAgICAgKiBBIGxheWVyIGRlZmluZXMgc3R5bGluZyBmb3IgZGF0YSBmcm9tIGEgc3BlY2lmaWVkIHNvdXJjZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBsYXllciBUaGUgc3R5bGUgbGF5ZXIgdG8gYWRkLCBjb25mb3JtaW5nIHRvIHRoZSBNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbidzXG4gICAgICogICBbbGF5ZXIgZGVmaW5pdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jbGF5ZXJzKS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2JlZm9yZV0gVGhlIElEIG9mIGFuIGV4aXN0aW5nIGxheWVyIHRvIGluc2VydCB0aGUgbmV3IGxheWVyIGJlZm9yZS5cbiAgICAgKiAgIElmIHRoaXMgYXJndW1lbnQgaXMgb21pdHRlZCwgdGhlIGxheWVyIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGF5ZXJzIGFycmF5LlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBzZWUgW0NyZWF0ZSBhbmQgc3R5bGUgY2x1c3RlcnNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY2x1c3Rlci8pXG4gICAgICogQHNlZSBbQWRkIGEgdmVjdG9yIHRpbGUgc291cmNlXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3ZlY3Rvci1zb3VyY2UvKVxuICAgICAqIEBzZWUgW0FkZCBhIFdNUyBzb3VyY2VdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvd21zLylcbiAgICAgKi9cbiAgICBhZGRMYXllcihsYXllciAgICAgICAgICAgICAgICAgICAgLCBiZWZvcmUgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5zdHlsZS5hZGRMYXllcihsYXllciwgYmVmb3JlKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyBhIGxheWVyIHRvIGEgZGlmZmVyZW50IHotcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBsYXllciB0byBtb3ZlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYmVmb3JlSWRdIFRoZSBJRCBvZiBhbiBleGlzdGluZyBsYXllciB0byBpbnNlcnQgdGhlIG5ldyBsYXllciBiZWZvcmUuXG4gICAgICogICBJZiB0aGlzIGFyZ3VtZW50IGlzIG9taXR0ZWQsIHRoZSBsYXllciB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGxheWVycyBhcnJheS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBtb3ZlTGF5ZXIoaWQgICAgICAgICwgYmVmb3JlSWQgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5zdHlsZS5tb3ZlTGF5ZXIoaWQsIGJlZm9yZUlkKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBsYXllciB3aXRoIHRoZSBnaXZlbiBpZCBmcm9tIHRoZSBtYXAncyBzdHlsZS5cbiAgICAgKlxuICAgICAqIElmIG5vIHN1Y2ggbGF5ZXIgZXhpc3RzLCBhbiBgZXJyb3JgIGV2ZW50IGlzIGZpcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIGlkIG9mIHRoZSBsYXllciB0byByZW1vdmVcbiAgICAgKiBAZmlyZXMgZXJyb3JcbiAgICAgKi9cbiAgICByZW1vdmVMYXllcihpZCAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuc3R5bGUucmVtb3ZlTGF5ZXIoaWQpO1xuICAgICAgICB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxheWVyIHdpdGggdGhlIHNwZWNpZmllZCBJRCBpbiB0aGUgbWFwJ3Mgc3R5bGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBsYXllciB0byBnZXQuXG4gICAgICogQHJldHVybnMgez9PYmplY3R9IFRoZSBsYXllciB3aXRoIHRoZSBzcGVjaWZpZWQgSUQsIG9yIGB1bmRlZmluZWRgXG4gICAgICogICBpZiB0aGUgSUQgY29ycmVzcG9uZHMgdG8gbm8gZXhpc3RpbmcgbGF5ZXJzLlxuICAgICAqIEBzZWUgW0ZpbHRlciBzeW1ib2xzIGJ5IHRvZ2dsaW5nIGEgbGlzdF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9maWx0ZXItbWFya2Vycy8pXG4gICAgICogQHNlZSBbRmlsdGVyIHN5bWJvbHMgYnkgdGV4dCBpbnB1dF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9maWx0ZXItbWFya2Vycy1ieS1pbnB1dC8pXG4gICAgICovXG4gICAgZ2V0TGF5ZXIoaWQgICAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRMYXllcihpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZmlsdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gd2hpY2ggdGhlIGZpbHRlciB3aWxsIGJlIGFwcGxpZWQuXG4gICAgICogQHBhcmFtIHtBcnJheSB8IG51bGwgfCB1bmRlZmluZWR9IGZpbHRlciBUaGUgZmlsdGVyLCBjb25mb3JtaW5nIHRvIHRoZSBNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbidzXG4gICAgICogICBbZmlsdGVyIGRlZmluaXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvI290aGVyLWZpbHRlcikuICBJZiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiByZW1vdmVzIGFueSBleGlzdGluZyBmaWx0ZXIgZnJvbSB0aGUgbGF5ZXIuXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2V0RmlsdGVyKCdteS1sYXllcicsIFsnPT0nLCAnbmFtZScsICdVU0EnXSk7XG4gICAgICogQHNlZSBbRmlsdGVyIGZlYXR1cmVzIHdpdGhpbiBtYXAgdmlld10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9maWx0ZXItZmVhdHVyZXMtd2l0aGluLW1hcC12aWV3LylcbiAgICAgKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgY29udGFpbmluZyBzaW1pbGFyIGRhdGFdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcXVlcnktc2ltaWxhci1mZWF0dXJlcy8pXG4gICAgICogQHNlZSBbQ3JlYXRlIGEgdGltZWxpbmUgYW5pbWF0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3RpbWVsaW5lLWFuaW1hdGlvbi8pXG4gICAgICovXG4gICAgc2V0RmlsdGVyKGxheWVyICAgICAgICAsIGZpbHRlciAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRGaWx0ZXIobGF5ZXIsIGZpbHRlcik7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgem9vbSBleHRlbnQgZm9yIHRoZSBzcGVjaWZpZWQgc3R5bGUgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRvIHdoaWNoIHRoZSB6b29tIGV4dGVudCB3aWxsIGJlIGFwcGxpZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbnpvb20gVGhlIG1pbmltdW0gem9vbSB0byBzZXQgKDAtMjQpLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXh6b29tIFRoZSBtYXhpbXVtIHpvb20gdG8gc2V0ICgwLTI0KS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zZXRMYXllclpvb21SYW5nZSgnbXktbGF5ZXInLCAyLCA1KTtcbiAgICAgKi9cbiAgICBzZXRMYXllclpvb21SYW5nZShsYXllcklkICAgICAgICAsIG1pbnpvb20gICAgICAgICwgbWF4em9vbSAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0TGF5ZXJab29tUmFuZ2UobGF5ZXJJZCwgbWluem9vbSwgbWF4em9vbSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZmlsdGVyIGFwcGxpZWQgdG8gdGhlIHNwZWNpZmllZCBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllciBUaGUgSUQgb2YgdGhlIHN0eWxlIGxheWVyIHdob3NlIGZpbHRlciB0byBnZXQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBUaGUgbGF5ZXIncyBmaWx0ZXIuXG4gICAgICovXG4gICAgZ2V0RmlsdGVyKGxheWVyICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0RmlsdGVyKGxheWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHBhaW50IHByb3BlcnR5IGluIHRoZSBzcGVjaWZpZWQgc3R5bGUgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXIgVGhlIElEIG9mIHRoZSBsYXllciB0byBzZXQgdGhlIHBhaW50IHByb3BlcnR5IGluLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwYWludCBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHBhaW50IHByb3BlcnkgdG8gc2V0LlxuICAgICAqICAgTXVzdCBiZSBvZiBhIHR5cGUgYXBwcm9wcmlhdGUgZm9yIHRoZSBwcm9wZXJ0eSwgYXMgZGVmaW5lZCBpbiB0aGUgW01hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLykuXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2V0UGFpbnRQcm9wZXJ0eSgnbXktbGF5ZXInLCAnZmlsbC1jb2xvcicsICcjZmFhZmVlJyk7XG4gICAgICogQHNlZSBbQ2hhbmdlIGEgbGF5ZXIncyBjb2xvciB3aXRoIGJ1dHRvbnNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY29sb3Itc3dpdGNoZXIvKVxuICAgICAqIEBzZWUgW0FkanVzdCBhIGxheWVyJ3Mgb3BhY2l0eV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9hZGp1c3QtbGF5ZXItb3BhY2l0eS8pXG4gICAgICogQHNlZSBbQ3JlYXRlIGEgZHJhZ2dhYmxlIHBvaW50XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1wb2ludC8pXG4gICAgICovXG4gICAgc2V0UGFpbnRQcm9wZXJ0eShsYXllciAgICAgICAgLCBuYW1lICAgICAgICAsIHZhbHVlICAgICApIHtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRQYWludFByb3BlcnR5KGxheWVyLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSBwYWludCBwcm9wZXJ0eSBpbiB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gZ2V0IHRoZSBwYWludCBwcm9wZXJ0eSBmcm9tLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIGEgcGFpbnQgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBUaGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwYWludCBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBnZXRQYWludFByb3BlcnR5KGxheWVyICAgICAgICAsIG5hbWUgICAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRQYWludFByb3BlcnR5KGxheWVyLCBuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIGxheW91dCBwcm9wZXJ0eSBpbiB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gc2V0IHRoZSBsYXlvdXQgcHJvcGVydHkgaW4uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGxheW91dCBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGxheW91dCBwcm9wZXJ5LiBNdXN0IGJlIG9mIGEgdHlwZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHByb3BlcnR5LCBhcyBkZWZpbmVkIGluIHRoZSBbTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvKS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zZXRMYXlvdXRQcm9wZXJ0eSgnbXktbGF5ZXInLCAndmlzaWJpbGl0eScsICdub25lJyk7XG4gICAgICovXG4gICAgc2V0TGF5b3V0UHJvcGVydHkobGF5ZXIgICAgICAgICwgbmFtZSAgICAgICAgLCB2YWx1ZSAgICAgKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0TGF5b3V0UHJvcGVydHkobGF5ZXIsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIGxheW91dCBwcm9wZXJ0eSBpbiB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gZ2V0IHRoZSBsYXlvdXQgcHJvcGVydHkgZnJvbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbGF5b3V0IHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgbGF5b3V0IHByb3BlcnR5LlxuICAgICAqL1xuICAgIGdldExheW91dFByb3BlcnR5KGxheWVyICAgICAgICAsIG5hbWUgICAgICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRMYXlvdXRQcm9wZXJ0eShsYXllciwgbmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYW55IGNvbWJpbmF0aW9uIG9mIGxpZ2h0IHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsaWdodCBMaWdodCBwcm9wZXJ0aWVzIHRvIHNldC4gTXVzdCBjb25mb3JtIHRvIHRoZSBbTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvKS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRMaWdodChsaWdodCAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0TGlnaHQobGlnaHQpO1xuICAgICAgICB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBsaWdodCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBsaWdodCBMaWdodCBwcm9wZXJ0aWVzIG9mIHRoZSBzdHlsZS5cbiAgICAgKi9cbiAgICBnZXRMaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0TGlnaHQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBjb250YWluaW5nIEhUTUwgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gVGhlIG1hcCdzIGNvbnRhaW5lci5cbiAgICAgKi9cbiAgICBnZXRDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgSFRNTCBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIG1hcCdzIGA8Y2FudmFzPmAgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIHlvdSB3YW50IHRvIGFkZCBub24tR0wgb3ZlcmxheXMgdG8gdGhlIG1hcCwgeW91IHNob3VsZCBhcHBlbmQgdGhlbSB0byB0aGlzIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHRoZSBlbGVtZW50IHRvIHdoaWNoIGV2ZW50IGJpbmRpbmdzIGZvciBtYXAgaW50ZXJhY3Rpdml0eSAoc3VjaCBhcyBwYW5uaW5nIGFuZCB6b29taW5nKSBhcmVcbiAgICAgKiBhdHRhY2hlZC4gSXQgd2lsbCByZWNlaXZlIGJ1YmJsZWQgZXZlbnRzIGZyb20gY2hpbGQgZWxlbWVudHMgc3VjaCBhcyB0aGUgYDxjYW52YXM+YCwgYnV0IG5vdCBmcm9tXG4gICAgICogbWFwIGNvbnRyb2xzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSBUaGUgY29udGFpbmVyIG9mIHRoZSBtYXAncyBgPGNhbnZhcz5gLlxuICAgICAqIEBzZWUgW0NyZWF0ZSBhIGRyYWdnYWJsZSBwb2ludF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtcG9pbnQvKVxuICAgICAqIEBzZWUgW0hpZ2hsaWdodCBmZWF0dXJlcyB3aXRoaW4gYSBib3VuZGluZyBib3hdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdXNpbmctYm94LXF1ZXJ5cmVuZGVyZWRmZWF0dXJlcy8pXG4gICAgICovXG4gICAgZ2V0Q2FudmFzQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FudmFzQ29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIGA8Y2FudmFzPmAgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIVE1MQ2FudmFzRWxlbWVudH0gVGhlIG1hcCdzIGA8Y2FudmFzPmAgZWxlbWVudC5cbiAgICAgKiBAc2VlIFtNZWFzdXJlIGRpc3RhbmNlc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9tZWFzdXJlLylcbiAgICAgKiBAc2VlIFtEaXNwbGF5IGEgcG9wdXAgb24gaG92ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAtb24taG92ZXIvKVxuICAgICAqIEBzZWUgW0NlbnRlciB0aGUgbWFwIG9uIGEgY2xpY2tlZCBzeW1ib2xdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY2VudGVyLW9uLXN5bWJvbC8pXG4gICAgICovXG4gICAgZ2V0Q2FudmFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FudmFzO1xuICAgIH1cblxuICAgIF9jb250YWluZXJEaW1lbnNpb25zKCkge1xuICAgICAgICBsZXQgd2lkdGggPSAwO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gMDtcblxuICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XG4gICAgICAgICAgICB3aWR0aCA9IHRoaXMuX2NvbnRhaW5lci5vZmZzZXRXaWR0aCB8fCA0MDA7XG4gICAgICAgICAgICBoZWlnaHQgPSB0aGlzLl9jb250YWluZXIub2Zmc2V0SGVpZ2h0IHx8IDMwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbd2lkdGgsIGhlaWdodF07XG4gICAgfVxuXG4gICAgX3NldHVwQ29udGFpbmVyKCkge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXI7XG4gICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1tYXAnKTtcblxuICAgICAgICBjb25zdCBtaXNzaW5nQ1NTQ29udGFpbmVyID0gdGhpcy5fbWlzc2luZ0NTU0NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1taXNzaW5nLWNzcycsIGNvbnRhaW5lcik7XG4gICAgICAgIG1pc3NpbmdDU1NDb250YWluZXIuaW5uZXJIVE1MID0gJ01pc3NpbmcgTWFwYm94IEdMIEpTIENTUyc7XG5cbiAgICAgICAgY29uc3QgY2FudmFzQ29udGFpbmVyID0gdGhpcy5fY2FudmFzQ29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWNhbnZhcy1jb250YWluZXInLCBjb250YWluZXIpO1xuICAgICAgICBpZiAodGhpcy5faW50ZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIGNhbnZhc0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1pbnRlcmFjdGl2ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2FudmFzID0gRE9NLmNyZWF0ZSgnY2FudmFzJywgJ21hcGJveGdsLWNhbnZhcycsIGNhbnZhc0NvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuX2NhbnZhcy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd3ZWJnbGNvbnRleHRsb3N0JywgdGhpcy5fY29udGV4dExvc3QsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgdGhpcy5fY29udGV4dFJlc3RvcmVkLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuX2NhbnZhcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgICAgdGhpcy5fY2FudmFzLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdNYXAnKTtcblxuICAgICAgICBjb25zdCBkaW1lbnNpb25zID0gdGhpcy5fY29udGFpbmVyRGltZW5zaW9ucygpO1xuICAgICAgICB0aGlzLl9yZXNpemVDYW52YXMoZGltZW5zaW9uc1swXSwgZGltZW5zaW9uc1sxXSk7XG5cbiAgICAgICAgY29uc3QgY29udHJvbENvbnRhaW5lciA9IHRoaXMuX2NvbnRyb2xDb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY29udHJvbC1jb250YWluZXInLCBjb250YWluZXIpO1xuICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSB0aGlzLl9jb250cm9sUG9zaXRpb25zID0ge307XG4gICAgICAgIFsndG9wLWxlZnQnLCAndG9wLXJpZ2h0JywgJ2JvdHRvbS1sZWZ0JywgJ2JvdHRvbS1yaWdodCddLmZvckVhY2goKHBvc2l0aW9uTmFtZSkgPT4ge1xuICAgICAgICAgICAgcG9zaXRpb25zW3Bvc2l0aW9uTmFtZV0gPSBET00uY3JlYXRlKCdkaXYnLCBgbWFwYm94Z2wtY3RybC0ke3Bvc2l0aW9uTmFtZX1gLCBjb250cm9sQ29udGFpbmVyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3Jlc2l6ZUNhbnZhcyh3aWR0aCAgICAgICAgLCBoZWlnaHQgICAgICAgICkge1xuICAgICAgICBjb25zdCBwaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcblxuICAgICAgICAvLyBSZXF1ZXN0IHRoZSByZXF1aXJlZCBjYW52YXMgc2l6ZSB0YWtpbmcgdGhlIHBpeGVscmF0aW8gaW50byBhY2NvdW50LlxuICAgICAgICB0aGlzLl9jYW52YXMud2lkdGggPSBwaXhlbFJhdGlvICogd2lkdGg7XG4gICAgICAgIHRoaXMuX2NhbnZhcy5oZWlnaHQgPSBwaXhlbFJhdGlvICogaGVpZ2h0O1xuXG4gICAgICAgIC8vIE1haW50YWluIHRoZSBzYW1lIGNhbnZhcyBzaXplLCBwb3RlbnRpYWxseSBkb3duc2NhbGluZyBpdCBmb3IgSGlEUEkgZGlzcGxheXNcbiAgICAgICAgdGhpcy5fY2FudmFzLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgICAgICB0aGlzLl9jYW52YXMuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgICB9XG5cbiAgICBfc2V0dXBQYWludGVyKCkge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gdXRpbC5leHRlbmQoe1xuICAgICAgICAgICAgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDogdGhpcy5fZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCxcbiAgICAgICAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogdGhpcy5fcHJlc2VydmVEcmF3aW5nQnVmZmVyXG4gICAgICAgIH0sIGlzU3VwcG9ydGVkLndlYkdMQ29udGV4dEF0dHJpYnV0ZXMpO1xuXG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5fY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgYXR0cmlidXRlcykgfHxcbiAgICAgICAgICAgIHRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnLCBhdHRyaWJ1dGVzKTtcblxuICAgICAgICBpZiAoIWdsKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywgeyBlcnJvcjogbmV3IEVycm9yKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBXZWJHTCcpIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYWludGVyID0gbmV3IFBhaW50ZXIoZ2wsIHRoaXMudHJhbnNmb3JtKTtcbiAgICB9XG5cbiAgICBfY29udGV4dExvc3QoZXZlbnQgICAgICAgKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICh0aGlzLl9mcmFtZUlkKSB7XG4gICAgICAgICAgICBicm93c2VyLmNhbmNlbEZyYW1lKHRoaXMuX2ZyYW1lSWQpO1xuICAgICAgICAgICAgdGhpcy5fZnJhbWVJZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXJlKCd3ZWJnbGNvbnRleHRsb3N0Jywge29yaWdpbmFsRXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxuXG4gICAgX2NvbnRleHRSZXN0b3JlZChldmVudCAgICAgICApIHtcbiAgICAgICAgdGhpcy5fc2V0dXBQYWludGVyKCk7XG4gICAgICAgIHRoaXMucmVzaXplKCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICB0aGlzLmZpcmUoJ3dlYmdsY29udGV4dHJlc3RvcmVkJywge29yaWdpbmFsRXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgaXMgZnVsbHkgbG9hZGVkLlxuICAgICAqXG4gICAgICogUmV0dXJucyBgZmFsc2VgIGlmIHRoZSBzdHlsZSBpcyBub3QgeWV0IGZ1bGx5IGxvYWRlZCxcbiAgICAgKiBvciBpZiB0aGVyZSBoYXMgYmVlbiBhIGNoYW5nZSB0byB0aGUgc291cmNlcyBvciBzdHlsZSB0aGF0XG4gICAgICogaGFzIG5vdCB5ZXQgZnVsbHkgbG9hZGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IEEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hcCBpcyBmdWxseSBsb2FkZWQuXG4gICAgICovXG4gICAgbG9hZGVkKCkge1xuICAgICAgICBpZiAodGhpcy5fc3R5bGVEaXJ0eSB8fCB0aGlzLl9zb3VyY2VzRGlydHkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghdGhpcy5zdHlsZSB8fCAhdGhpcy5zdHlsZS5sb2FkZWQoKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoaXMgbWFwJ3Mgc3R5bGUgYW5kIHNvdXJjZXMsIGFuZCByZS1yZW5kZXIgdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdXBkYXRlU3R5bGUgbWFyayB0aGUgbWFwJ3Mgc3R5bGUgZm9yIHJlcHJvY2Vzc2luZyBhc1xuICAgICAqIHdlbGwgYXMgaXRzIHNvdXJjZXNcbiAgICAgKiBAcmV0dXJucyB7TWFwfSB0aGlzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdXBkYXRlKHVwZGF0ZVN0eWxlICAgICAgICAgICkge1xuICAgICAgICBpZiAoIXRoaXMuc3R5bGUpIHJldHVybjtcblxuICAgICAgICB0aGlzLl9zdHlsZURpcnR5ID0gdGhpcy5fc3R5bGVEaXJ0eSB8fCB1cGRhdGVTdHlsZTtcbiAgICAgICAgdGhpcy5fc291cmNlc0RpcnR5ID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLl9yZXJlbmRlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGwgd2hlbiBhIChyZS0pcmVuZGVyIG9mIHRoZSBtYXAgaXMgcmVxdWlyZWQ6XG4gICAgICogLSBUaGUgc3R5bGUgaGFzIGNoYW5nZWQgKGBzZXRQYWludFByb3BlcnR5KClgLCBldGMuKVxuICAgICAqIC0gU291cmNlIGRhdGEgaGFzIGNoYW5nZWQgKGUuZy4gdGlsZXMgaGF2ZSBmaW5pc2hlZCBsb2FkaW5nKVxuICAgICAqIC0gVGhlIG1hcCBoYXMgaXMgbW92aW5nIChvciBqdXN0IGZpbmlzaGVkIG1vdmluZylcbiAgICAgKiAtIEEgdHJhbnNpdGlvbiBpcyBpbiBwcm9ncmVzc1xuICAgICAqXG4gICAgICogQHJldHVybnMge01hcH0gdGhpc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3JlbmRlcigpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlQ2FtZXJhKCk7XG5cbiAgICAgICAgbGV0IGNyb3NzRmFkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgLy8gSWYgdGhlIHN0eWxlIGhhcyBjaGFuZ2VkLCB0aGUgbWFwIGlzIGJlaW5nIHpvb21lZCwgb3IgYSB0cmFuc2l0aW9uIG9yIGZhZGUgaXMgaW4gcHJvZ3Jlc3M6XG4gICAgICAgIC8vICAtIEFwcGx5IHN0eWxlIGNoYW5nZXMgKGluIGEgYmF0Y2gpXG4gICAgICAgIC8vICAtIFJlY2FsY3VsYXRlIHBhaW50IHByb3BlcnRpZXMuXG4gICAgICAgIGlmICh0aGlzLnN0eWxlICYmIHRoaXMuX3N0eWxlRGlydHkpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0eWxlRGlydHkgPSBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3Qgem9vbSA9IHRoaXMudHJhbnNmb3JtLnpvb207XG4gICAgICAgICAgICBjb25zdCBub3cgPSBicm93c2VyLm5vdygpO1xuICAgICAgICAgICAgdGhpcy5zdHlsZS56b29tSGlzdG9yeS51cGRhdGUoem9vbSwgbm93KTtcblxuICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh6b29tLCB7XG4gICAgICAgICAgICAgICAgbm93LFxuICAgICAgICAgICAgICAgIGZhZGVEdXJhdGlvbjogdGhpcy5fZmFkZUR1cmF0aW9uLFxuICAgICAgICAgICAgICAgIHpvb21IaXN0b3J5OiB0aGlzLnN0eWxlLnpvb21IaXN0b3J5LFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IHRoaXMuc3R5bGUuZ2V0VHJhbnNpdGlvbigpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgZmFjdG9yID0gcGFyYW1ldGVycy5jcm9zc0ZhZGluZ0ZhY3RvcigpO1xuICAgICAgICAgICAgaWYgKGZhY3RvciAhPT0gMSB8fCBmYWN0b3IgIT09IHRoaXMuX2Nyb3NzRmFkaW5nRmFjdG9yKSB7XG4gICAgICAgICAgICAgICAgY3Jvc3NGYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nyb3NzRmFkaW5nRmFjdG9yID0gZmFjdG9yO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnN0eWxlLnVwZGF0ZShwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHdlIGFyZSBpbiBfcmVuZGVyIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gYW4gaW4tcHJvZ3Jlc3MgcGFpbnRcbiAgICAgICAgLy8gdHJhbnNpdGlvbiwgdXBkYXRlIHNvdXJjZSBjYWNoZXMgdG8gY2hlY2sgZm9yIGFuZCBsb2FkIGFueSB0aWxlcyB3ZVxuICAgICAgICAvLyBuZWVkIGZvciB0aGUgY3VycmVudCB0cmFuc2Zvcm1cbiAgICAgICAgaWYgKHRoaXMuc3R5bGUgJiYgdGhpcy5fc291cmNlc0RpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VzRGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuX3VwZGF0ZVNvdXJjZXModGhpcy50cmFuc2Zvcm0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcGxhY2VtZW50RGlydHkgPSB0aGlzLnN0eWxlICYmIHRoaXMuc3R5bGUuX3VwZGF0ZVBsYWNlbWVudCh0aGlzLnBhaW50ZXIudHJhbnNmb3JtLCB0aGlzLnNob3dDb2xsaXNpb25Cb3hlcywgdGhpcy5fZmFkZUR1cmF0aW9uKTtcblxuICAgICAgICAvLyBBY3R1YWxseSBkcmF3XG4gICAgICAgIHRoaXMucGFpbnRlci5yZW5kZXIodGhpcy5zdHlsZSwge1xuICAgICAgICAgICAgc2hvd1RpbGVCb3VuZGFyaWVzOiB0aGlzLnNob3dUaWxlQm91bmRhcmllcyxcbiAgICAgICAgICAgIHNob3dPdmVyZHJhd0luc3BlY3RvcjogdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yLFxuICAgICAgICAgICAgcm90YXRpbmc6IHRoaXMucm90YXRpbmcsXG4gICAgICAgICAgICB6b29taW5nOiB0aGlzLnpvb21pbmcsXG4gICAgICAgICAgICBmYWRlRHVyYXRpb246IHRoaXMuX2ZhZGVEdXJhdGlvblxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZpcmUoJ3JlbmRlcicpO1xuXG4gICAgICAgIGlmICh0aGlzLmxvYWRlZCgpICYmICF0aGlzLl9sb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2xvYWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0eWxlICYmICh0aGlzLnN0eWxlLmhhc1RyYW5zaXRpb25zKCkgfHwgY3Jvc3NGYWRpbmcpKSB7XG4gICAgICAgICAgICB0aGlzLl9zdHlsZURpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNjaGVkdWxlIGFub3RoZXIgcmVuZGVyIGZyYW1lIGlmIGl0J3MgbmVlZGVkLlxuICAgICAgICAvL1xuICAgICAgICAvLyBFdmVuIHRob3VnaCBgX3N0eWxlRGlydHlgIGFuZCBgX3NvdXJjZXNEaXJ0eWAgYXJlIHJlc2V0IGluIHRoaXNcbiAgICAgICAgLy8gbWV0aG9kLCBzeW5jaHJvbm91cyBldmVudHMgZmlyZWQgZHVyaW5nIFN0eWxlI3VwZGF0ZSBvclxuICAgICAgICAvLyBTdHlsZSNfdXBkYXRlU291cmNlcyBjb3VsZCBoYXZlIGNhdXNlZCB0aGVtIHRvIGJlIHNldCBhZ2Fpbi5cbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZXNEaXJ0eSB8fCB0aGlzLl9yZXBhaW50IHx8IHRoaXMuX3N0eWxlRGlydHkgfHwgdGhpcy5fcGxhY2VtZW50RGlydHkpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcmVuZGVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhbiB1cCBhbmQgcmVsZWFzZSBhbGwgaW50ZXJuYWwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1hcC5cbiAgICAgKlxuICAgICAqIFRoaXMgaW5jbHVkZXMgRE9NIGVsZW1lbnRzLCBldmVudCBiaW5kaW5ncywgd2ViIHdvcmtlcnMsIGFuZCBXZWJHTCByZXNvdXJjZXMuXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyBtZXRob2Qgd2hlbiB5b3UgYXJlIGRvbmUgdXNpbmcgdGhlIG1hcCBhbmQgd2lzaCB0byBlbnN1cmUgdGhhdCBpdCBub1xuICAgICAqIGxvbmdlciBjb25zdW1lcyBicm93c2VyIHJlc291cmNlcy4gQWZ0ZXJ3YXJkcywgeW91IG11c3Qgbm90IGNhbGwgYW55IG90aGVyXG4gICAgICogbWV0aG9kcyBvbiB0aGUgbWFwLlxuICAgICAqL1xuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc2gpIHRoaXMuX2hhc2gucmVtb3ZlKCk7XG4gICAgICAgIGJyb3dzZXIuY2FuY2VsRnJhbWUodGhpcy5fZnJhbWVJZCk7XG4gICAgICAgIHRoaXMuX2ZyYW1lSWQgPSBudWxsO1xuICAgICAgICB0aGlzLnNldFN0eWxlKG51bGwpO1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9vbldpbmRvd1Jlc2l6ZSwgZmFsc2UpO1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29ubGluZScsIHRoaXMuX29uV2luZG93T25saW5lLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gdGhpcy5wYWludGVyLmNvbnRleHQuZ2wuZ2V0RXh0ZW5zaW9uKCdXRUJHTF9sb3NlX2NvbnRleHQnKTtcbiAgICAgICAgaWYgKGV4dGVuc2lvbikgZXh0ZW5zaW9uLmxvc2VDb250ZXh0KCk7XG4gICAgICAgIHJlbW92ZU5vZGUodGhpcy5fY2FudmFzQ29udGFpbmVyKTtcbiAgICAgICAgcmVtb3ZlTm9kZSh0aGlzLl9jb250cm9sQ29udGFpbmVyKTtcbiAgICAgICAgcmVtb3ZlTm9kZSh0aGlzLl9taXNzaW5nQ1NTQ29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLW1hcCcpO1xuICAgICAgICB0aGlzLmZpcmUoJ3JlbW92ZScpO1xuICAgIH1cblxuICAgIF9yZXJlbmRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUgJiYgIXRoaXMuX2ZyYW1lSWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lSWQgPSBicm93c2VyLmZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mcmFtZUlkID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uV2luZG93T25saW5lKCkge1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICB9XG5cbiAgICBfb25XaW5kb3dSZXNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLl90cmFja1Jlc2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5zdG9wKCkucmVzaXplKCkuX3VwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbmQgc2V0cyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgd2lsbCByZW5kZXIgYW4gb3V0bGluZVxuICAgICAqIGFyb3VuZCBlYWNoIHRpbGUuIFRoZXNlIHRpbGUgYm91bmRhcmllcyBhcmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAgICpcbiAgICAgKiBAbmFtZSBzaG93VGlsZUJvdW5kYXJpZXNcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICovXG4gICAgZ2V0IHNob3dUaWxlQm91bmRhcmllcygpICAgICAgICAgIHsgcmV0dXJuICEhdGhpcy5fc2hvd1RpbGVCb3VuZGFyaWVzOyB9XG4gICAgc2V0IHNob3dUaWxlQm91bmRhcmllcyh2YWx1ZSAgICAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5fc2hvd1RpbGVCb3VuZGFyaWVzID09PSB2YWx1ZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9zaG93VGlsZUJvdW5kYXJpZXMgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbmQgc2V0cyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgd2lsbCByZW5kZXIgYm94ZXNcbiAgICAgKiBhcm91bmQgYWxsIHN5bWJvbHMgaW4gdGhlIGRhdGEgc291cmNlLCByZXZlYWxpbmcgd2hpY2ggc3ltYm9sc1xuICAgICAqIHdlcmUgcmVuZGVyZWQgb3Igd2hpY2ggd2VyZSBoaWRkZW4gZHVlIHRvIGNvbGxpc2lvbnMuXG4gICAgICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICAgKlxuICAgICAqIEBuYW1lIHNob3dDb2xsaXNpb25Cb3hlc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKi9cbiAgICBnZXQgc2hvd0NvbGxpc2lvbkJveGVzKCkgICAgICAgICAgeyByZXR1cm4gISF0aGlzLl9zaG93Q29sbGlzaW9uQm94ZXM7IH1cbiAgICBzZXQgc2hvd0NvbGxpc2lvbkJveGVzKHZhbHVlICAgICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaG93Q29sbGlzaW9uQm94ZXMgPT09IHZhbHVlKSByZXR1cm47XG4gICAgICAgIHRoaXMuX3Nob3dDb2xsaXNpb25Cb3hlcyA9IHZhbHVlO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgdHVybiBjb2xsaXNpb24gYm94ZXMgb24gd2UgaGF2ZSB0byBnZW5lcmF0ZSB0aGVtIGZvciBleGlzdGluZyB0aWxlc1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSB0dXJuIHRoZW0gb2ZmLCB0aGVyZSdzIG5vIGNvc3QgdG8gbGVhdmluZyBleGlzdGluZyBib3hlcyBpbiBwbGFjZVxuICAgICAgICAgICAgdGhpcy5zdHlsZS5fZ2VuZXJhdGVDb2xsaXNpb25Cb3hlcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBjYWxsIGFuIHVwZGF0ZSB0byByZW1vdmUgY29sbGlzaW9uIGJveGVzXG4gICAgICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qXG4gICAgICogR2V0cyBhbmQgc2V0cyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgc2hvdWxkIGNvbG9yLWNvZGVcbiAgICAgKiBlYWNoIGZyYWdtZW50IHRvIHNob3cgaG93IG1hbnkgdGltZXMgaXQgaGFzIGJlZW4gc2hhZGVkLlxuICAgICAqIFdoaXRlIGZyYWdtZW50cyBoYXZlIGJlZW4gc2hhZGVkIDggb3IgbW9yZSB0aW1lcy5cbiAgICAgKiBCbGFjayBmcmFnbWVudHMgaGF2ZSBiZWVuIHNoYWRlZCAwIHRpbWVzLlxuICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAgICpcbiAgICAgKiBAbmFtZSBzaG93T3ZlcmRyYXdcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICovXG4gICAgZ2V0IHNob3dPdmVyZHJhd0luc3BlY3RvcigpICAgICAgICAgIHsgcmV0dXJuICEhdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yOyB9XG4gICAgc2V0IHNob3dPdmVyZHJhd0luc3BlY3Rvcih2YWx1ZSAgICAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yID09PSB2YWx1ZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbmQgc2V0cyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgd2lsbFxuICAgICAqIGNvbnRpbnVvdXNseSByZXBhaW50LiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWZ1bCBmb3IgYW5hbHl6aW5nIHBlcmZvcm1hbmNlLlxuICAgICAqXG4gICAgICogQG5hbWUgcmVwYWludFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKi9cbiAgICBnZXQgcmVwYWludCgpICAgICAgICAgIHsgcmV0dXJuICEhdGhpcy5fcmVwYWludDsgfVxuICAgIHNldCByZXBhaW50KHZhbHVlICAgICAgICAgKSB7IHRoaXMuX3JlcGFpbnQgPSB2YWx1ZTsgdGhpcy5fdXBkYXRlKCk7IH1cblxuICAgIC8vIHNob3cgdmVydGljZXNcbiAgICBnZXQgdmVydGljZXMoKSAgICAgICAgICB7IHJldHVybiAhIXRoaXMuX3ZlcnRpY2VzOyB9XG4gICAgc2V0IHZlcnRpY2VzKHZhbHVlICAgICAgICAgKSB7IHRoaXMuX3ZlcnRpY2VzID0gdmFsdWU7IHRoaXMuX3VwZGF0ZSgpOyB9XG5cbiAgICBfb25EYXRhKGV2ZW50ICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlKGV2ZW50LmRhdGFUeXBlID09PSAnc3R5bGUnKTtcbiAgICAgICAgdGhpcy5maXJlKGAke2V2ZW50LmRhdGFUeXBlfWRhdGFgLCBldmVudCk7XG4gICAgfVxuXG4gICAgX29uRGF0YUxvYWRpbmcoZXZlbnQgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLmZpcmUoYCR7ZXZlbnQuZGF0YVR5cGV9ZGF0YWxvYWRpbmdgLCBldmVudCk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcDtcblxuZnVuY3Rpb24gcmVtb3ZlTm9kZShub2RlKSB7XG4gICAgaWYgKG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgaW50ZXJhY3RpdmUgY29udHJvbHMgYWRkZWQgdG8gdGhlIG1hcC4gVGhpcyBpcyBhblxuICogc3BlY2lmaWNhdGlvbiBmb3IgaW1wbGVtZW50ZXJzIHRvIG1vZGVsOiBpdCBpcyBub3RcbiAqIGFuIGV4cG9ydGVkIG1ldGhvZCBvciBjbGFzcy5cbiAqXG4gKiBDb250cm9scyBtdXN0IGltcGxlbWVudCBgb25BZGRgIGFuZCBgb25SZW1vdmVgLCBhbmQgbXVzdCBvd24gYW5cbiAqIGVsZW1lbnQsIHdoaWNoIGlzIG9mdGVuIGEgYGRpdmAgZWxlbWVudC4gVG8gdXNlIE1hcGJveCBHTCBKUydzXG4gKiBkZWZhdWx0IGNvbnRyb2wgc3R5bGluZywgYWRkIHRoZSBgbWFwYm94Z2wtY3RybGAgY2xhc3MgdG8geW91ciBjb250cm9sJ3NcbiAqIG5vZGUuXG4gKlxuICogQGludGVyZmFjZSBJQ29udHJvbFxuICogQGV4YW1wbGVcbiAqIC8vIENvbnRyb2wgaW1wbGVtZW50ZWQgYXMgRVM2IGNsYXNzXG4gKiBjbGFzcyBIZWxsb1dvcmxkQ29udHJvbCB7XG4gKiAgICAgb25BZGQobWFwKSB7XG4gKiAgICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAqICAgICAgICAgdGhpcy5fY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gKiAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc05hbWUgPSAnbWFwYm94Z2wtY3RybCc7XG4gKiAgICAgICAgIHRoaXMuX2NvbnRhaW5lci50ZXh0Q29udGVudCA9ICdIZWxsbywgd29ybGQnO1xuICogICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xuICogICAgIH1cbiAqXG4gKiAgICAgb25SZW1vdmUoKSB7XG4gKiAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRhaW5lcik7XG4gKiAgICAgICAgIHRoaXMuX21hcCA9IHVuZGVmaW5lZDtcbiAqICAgICB9XG4gKiB9XG4gKlxuICogLy8gQ29udHJvbCBpbXBsZW1lbnRlZCBhcyBFUzUgcHJvdG90eXBpY2FsIGNsYXNzXG4gKiBmdW5jdGlvbiBIZWxsb1dvcmxkQ29udHJvbCgpIHsgfVxuICpcbiAqIEhlbGxvV29ybGRDb250cm9sLnByb3RvdHlwZS5vbkFkZCA9IGZ1bmN0aW9uKG1hcCkge1xuICogICAgIHRoaXMuX21hcCA9IG1hcDtcbiAqICAgICB0aGlzLl9jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAqICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NOYW1lID0gJ21hcGJveGdsLWN0cmwnO1xuICogICAgIHRoaXMuX2NvbnRhaW5lci50ZXh0Q29udGVudCA9ICdIZWxsbywgd29ybGQnO1xuICogICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gKiB9O1xuICpcbiAqIEhlbGxvV29ybGRDb250cm9sLnByb3RvdHlwZS5vblJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAqICAgICAgdGhpcy5fY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fY29udGFpbmVyKTtcbiAqICAgICAgdGhpcy5fbWFwID0gdW5kZWZpbmVkO1xuICogfTtcbiAqL1xuXG4vKipcbiAqIFJlZ2lzdGVyIGEgY29udHJvbCBvbiB0aGUgbWFwIGFuZCBnaXZlIGl0IGEgY2hhbmNlIHRvIHJlZ2lzdGVyIGV2ZW50IGxpc3RlbmVyc1xuICogYW5kIHJlc291cmNlcy4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHtAbGluayBNYXAjYWRkQ29udHJvbH1cbiAqIGludGVybmFsbHkuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgSUNvbnRyb2xcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgb25BZGRcbiAqIEBwYXJhbSB7TWFwfSBtYXAgdGhlIE1hcCB0aGlzIGNvbnRyb2wgd2lsbCBiZSBhZGRlZCB0b1xuICogQHJldHVybnMge0hUTUxFbGVtZW50fSBUaGUgY29udHJvbCdzIGNvbnRhaW5lciBlbGVtZW50LiBUaGlzIHNob3VsZFxuICogYmUgY3JlYXRlZCBieSB0aGUgY29udHJvbCBhbmQgcmV0dXJuZWQgYnkgb25BZGQgd2l0aG91dCBiZWluZyBhdHRhY2hlZFxuICogdG8gdGhlIERPTTogdGhlIG1hcCB3aWxsIGluc2VydCB0aGUgY29udHJvbCdzIGVsZW1lbnQgaW50byB0aGUgRE9NXG4gKiBhcyBuZWNlc3NhcnkuXG4gKi9cblxuLyoqXG4gKiBVbnJlZ2lzdGVyIGEgY29udHJvbCBvbiB0aGUgbWFwIGFuZCBnaXZlIGl0IGEgY2hhbmNlIHRvIGRldGFjaCBldmVudCBsaXN0ZW5lcnNcbiAqIGFuZCByZXNvdXJjZXMuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB7QGxpbmsgTWFwI3JlbW92ZUNvbnRyb2x9XG4gKiBpbnRlcm5hbGx5LlxuICpcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIElDb250cm9sXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIG9uUmVtb3ZlXG4gKiBAcGFyYW0ge01hcH0gbWFwIHRoZSBNYXAgdGhpcyBjb250cm9sIHdpbGwgYmUgcmVtb3ZlZCBmcm9tXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfSB0aGVyZSBpcyBubyByZXF1aXJlZCByZXR1cm4gdmFsdWUgZm9yIHRoaXMgbWV0aG9kXG4gKi9cblxuLyoqXG4gKiBPcHRpb25hbGx5IHByb3ZpZGUgYSBkZWZhdWx0IHBvc2l0aW9uIGZvciB0aGlzIGNvbnRyb2wuIElmIHRoaXMgbWV0aG9kXG4gKiBpcyBpbXBsZW1lbnRlZCBhbmQge0BsaW5rIE1hcCNhZGRDb250cm9sfSBpcyBjYWxsZWQgd2l0aG91dCB0aGUgYHBvc2l0aW9uYFxuICogcGFyYW1ldGVyLCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZ2V0RGVmYXVsdFBvc2l0aW9uIHdpbGwgYmUgdXNlZCBhcyB0aGVcbiAqIGNvbnRyb2wncyBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBJQ29udHJvbFxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBnZXREZWZhdWx0UG9zaXRpb25cbiAqIEByZXR1cm5zIHtzdHJpbmd9IGEgY29udHJvbCBwb3NpdGlvbiwgb25lIG9mIHRoZSB2YWx1ZXMgdmFsaWQgaW4gYWRkQ29udHJvbC5cbiAqL1xuXG4vKipcbiAqIEEgW2BQb2ludGAgZ2VvbWV0cnldKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvcG9pbnQtZ2VvbWV0cnkpIG9iamVjdCwgd2hpY2ggaGFzXG4gKiBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzIHJlcHJlc2VudGluZyBzY3JlZW4gY29vcmRpbmF0ZXMgaW4gcGl4ZWxzLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvaW50XG4gKi9cblxuLyoqXG4gKiBBIHtAbGluayBQb2ludH0gb3IgYW4gYXJyYXkgb2YgdHdvIG51bWJlcnMgcmVwcmVzZW50aW5nIGB4YCBhbmQgYHlgIHNjcmVlbiBjb29yZGluYXRlcyBpbiBwaXhlbHMuXG4gKlxuICogQHR5cGVkZWYgeyhQb2ludCB8IEFycmF5PG51bWJlcj4pfSBQb2ludExpa2VcbiAqL1xuIiwiLy8gICAgICBcblxuY29uc3QgRE9NID0gcmVxdWlyZSgnLi4vdXRpbC9kb20nKTtcbmNvbnN0IExuZ0xhdCA9IHJlcXVpcmUoJy4uL2dlby9sbmdfbGF0Jyk7XG5jb25zdCBQb2ludCA9IHJlcXVpcmUoJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknKTtcbmNvbnN0IHNtYXJ0V3JhcCA9IHJlcXVpcmUoJy4uL3V0aWwvc21hcnRfd3JhcCcpO1xuY29uc3Qge2JpbmRBbGx9ID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXJrZXIgY29tcG9uZW50XG4gKiBAcGFyYW0gZWxlbWVudCBET00gZWxlbWVudCB0byB1c2UgYXMgYSBtYXJrZXIuIElmIGxlZnQgdW5zcGVjaWZpZWQgYSBkZWZhdWx0IFNWRyB3aWxsIGJlIGNyZWF0ZWQgYXMgdGhlIERPTSBlbGVtZW50IHRvIHVzZS5cbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gb3B0aW9ucy5vZmZzZXQgVGhlIG9mZnNldCBpbiBwaXhlbHMgYXMgYSB7QGxpbmsgUG9pbnRMaWtlfSBvYmplY3QgdG8gYXBwbHkgcmVsYXRpdmUgdG8gdGhlIGVsZW1lbnQncyBjZW50ZXIuIE5lZ2F0aXZlcyBpbmRpY2F0ZSBsZWZ0IGFuZCB1cC5cbiAqIEBleGFtcGxlXG4gKiB2YXIgbWFya2VyID0gbmV3IG1hcGJveGdsLk1hcmtlcigpXG4gKiAgIC5zZXRMbmdMYXQoWzMwLjUsIDUwLjVdKVxuICogICAuYWRkVG8obWFwKTtcbiAqIEBzZWUgW0FkZCBjdXN0b20gaWNvbnMgd2l0aCBNYXJrZXJzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2N1c3RvbS1tYXJrZXItaWNvbnMvKVxuICovXG5jbGFzcyBNYXJrZXIge1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQgICAgICAgICAgICAgICwgb3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgYmluZEFsbChbJ191cGRhdGUnLCAnX29uTWFwQ2xpY2snXSwgdGhpcyk7XG5cbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gRE9NLmNyZWF0ZSgnZGl2Jyk7XG5cbiAgICAgICAgICAgIC8vIGNyZWF0ZSBkZWZhdWx0IG1hcCBtYXJrZXIgU1ZHXG4gICAgICAgICAgICBjb25zdCBzdmcgPSBET00uY3JlYXRlTlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3N2ZycpO1xuICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZU5TKG51bGwsICdoZWlnaHQnLCAnNDFweCcpO1xuICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZU5TKG51bGwsICd3aWR0aCcsICcyN3B4Jyk7XG4gICAgICAgICAgICBzdmcuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3ZpZXdCb3gnLCAnMCAwIDI3IDQxJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1hcmtlckxhcmdlID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBtYXJrZXJMYXJnZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnc3Ryb2tlJywgJ25vbmUnKTtcbiAgICAgICAgICAgIG1hcmtlckxhcmdlLnNldEF0dHJpYnV0ZU5TKG51bGwsICdzdHJva2Utd2lkdGgnLCAnMScpO1xuICAgICAgICAgICAgbWFya2VyTGFyZ2Uuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwnLCAnbm9uZScpO1xuICAgICAgICAgICAgbWFya2VyTGFyZ2Uuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwtcnVsZScsICdldmVub2RkJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhZ2UxID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBwYWdlMS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbC1ydWxlJywgJ25vbnplcm8nKTtcblxuICAgICAgICAgICAgY29uc3Qgc2hhZG93ID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBzaGFkb3cuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMy4wLCAyOS4wKScpO1xuICAgICAgICAgICAgc2hhZG93LnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyMwMDAwMDAnKTtcblxuICAgICAgICAgICAgY29uc3QgZWxsaXBzZXMgPSBbXG4gICAgICAgICAgICAgICAgeydyeCc6ICcxMC41JywgJ3J5JzogJzUuMjUwMDIyNzMnfSxcbiAgICAgICAgICAgICAgICB7J3J4JzogJzEwLjUnLCAncnknOiAnNS4yNTAwMjI3Myd9LFxuICAgICAgICAgICAgICAgIHsncngnOiAnOS41JywgJ3J5JzogJzQuNzcyNzUwMDcnfSxcbiAgICAgICAgICAgICAgICB7J3J4JzogJzguNScsICdyeSc6ICc0LjI5NTQ5OTM2J30sXG4gICAgICAgICAgICAgICAgeydyeCc6ICc3LjUnLCAncnknOiAnMy44MTgyMjMwOCd9LFxuICAgICAgICAgICAgICAgIHsncngnOiAnNi41JywgJ3J5JzogJzMuMzQwOTQ2NzknfSxcbiAgICAgICAgICAgICAgICB7J3J4JzogJzUuNScsICdyeSc6ICcyLjg2MzY3MDUxJ30sXG4gICAgICAgICAgICAgICAgeydyeCc6ICc0LjUnLCAncnknOiAnMi4zODYzNjg2NCd9XG4gICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRhdGEgb2YgZWxsaXBzZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGxpcHNlID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdlbGxpcHNlJyk7XG4gICAgICAgICAgICAgICAgZWxsaXBzZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnb3BhY2l0eScsICcwLjA0Jyk7XG4gICAgICAgICAgICAgICAgZWxsaXBzZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnY3gnLCAnMTAuNScpO1xuICAgICAgICAgICAgICAgIGVsbGlwc2Uuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2N5JywgJzUuODAwMjkwMDgnKTtcbiAgICAgICAgICAgICAgICBlbGxpcHNlLnNldEF0dHJpYnV0ZU5TKG51bGwsICdyeCcsIGRhdGFbJ3J4J10pO1xuICAgICAgICAgICAgICAgIGVsbGlwc2Uuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3J5JywgZGF0YVsncnknXSk7XG4gICAgICAgICAgICAgICAgc2hhZG93LmFwcGVuZENoaWxkKGVsbGlwc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyMzRkIxQ0UnKTtcblxuICAgICAgICAgICAgY29uc3QgYmdQYXRoID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICBiZ1BhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTI3LDEzLjUgQzI3LDE5LjA3NDY0NCAyMC4yNTAwMDEsMjcuMDAwMDAyIDE0Ljc1LDM0LjUwMDAwMiBDMTQuMDE2NjY1LDM1LjUwMDAwNCAxMi45ODMzMzUsMzUuNTAwMDA0IDEyLjI1LDM0LjUwMDAwMiBDNi43NDk5OTkzLDI3LjAwMDAwMiAwLDE5LjIyMjU2MiAwLDEzLjUgQzAsNi4wNDQxNTU5IDYuMDQ0MTU1OSwwIDEzLjUsMCBDMjAuOTU1ODQ0LDAgMjcsNi4wNDQxNTU5IDI3LDEzLjUgWicpO1xuXG4gICAgICAgICAgICBiYWNrZ3JvdW5kLmFwcGVuZENoaWxkKGJnUGF0aCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGJvcmRlciA9IERPTS5jcmVhdGVOUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAgICAgICAgICAgYm9yZGVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdvcGFjaXR5JywgJzAuMjUnKTtcbiAgICAgICAgICAgIGJvcmRlci5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsICcjMDAwMDAwJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGJvcmRlclBhdGggPSBET00uY3JlYXRlTlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcbiAgICAgICAgICAgIGJvcmRlclBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTEzLjUsMCBDNi4wNDQxNTU5LDAgMCw2LjA0NDE1NTkgMCwxMy41IEMwLDE5LjIyMjU2MiA2Ljc0OTk5OTMsMjcgMTIuMjUsMzQuNSBDMTMsMzUuNTIyNzI3IDE0LjAxNjY2NCwzNS41MDAwMDQgMTQuNzUsMzQuNSBDMjAuMjUwMDAxLDI3IDI3LDE5LjA3NDY0NCAyNywxMy41IEMyNyw2LjA0NDE1NTkgMjAuOTU1ODQ0LDAgMTMuNSwwIFogTTEzLjUsMSBDMjAuNDE1NDA0LDEgMjYsNi41ODQ1OTYgMjYsMTMuNSBDMjYsMTUuODk4NjU3IDI0LjQ5NTU4NCwxOS4xODE0MzEgMjIuMjIwNzAzLDIyLjczODI4MSBDMTkuOTQ1ODIzLDI2LjI5NTEzMiAxNi43MDUxMTksMzAuMTQyMTY3IDEzLjk0MzM1OSwzMy45MDgyMDMgQzEzLjc0MzQ0NSwzNC4xODA4MTQgMTMuNjEyNzE1LDM0LjMyMjczOCAxMy41LDM0LjQ0MTQwNiBDMTMuMzg3Mjg1LDM0LjMyMjczOCAxMy4yNTY1NTUsMzQuMTgwODE0IDEzLjA1NjY0MSwzMy45MDgyMDMgQzEwLjI4NDQ4MSwzMC4xMjc5ODUgNy40MTQ4Njg0LDI2LjMxNDE1OSA1LjAxNTYyNSwyMi43NzM0MzggQzIuNjE2MzgxNiwxOS4yMzI3MTUgMSwxNS45NTM1MzggMSwxMy41IEMxLDYuNTg0NTk2IDYuNTg0NTk2LDEgMTMuNSwxIFonKTtcblxuICAgICAgICAgICAgYm9yZGVyLmFwcGVuZENoaWxkKGJvcmRlclBhdGgpO1xuXG4gICAgICAgICAgICBjb25zdCBtYWtpID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBtYWtpLnNldEF0dHJpYnV0ZU5TKG51bGwsICd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDYuMCwgNy4wKScpO1xuICAgICAgICAgICAgbWFraS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsICcjRkZGRkZGJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNpcmNsZUNvbnRhaW5lciA9IERPTS5jcmVhdGVOUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAgICAgICAgICAgY2lyY2xlQ29udGFpbmVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDguMCwgOC4wKScpO1xuXG4gICAgICAgICAgICBjb25zdCBjaXJjbGUxID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdjaXJjbGUnKTtcbiAgICAgICAgICAgIGNpcmNsZTEuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwnLCAnIzAwMDAwMCcpO1xuICAgICAgICAgICAgY2lyY2xlMS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnb3BhY2l0eScsICcwLjI1Jyk7XG4gICAgICAgICAgICBjaXJjbGUxLnNldEF0dHJpYnV0ZU5TKG51bGwsICdjeCcsICc1LjUnKTtcbiAgICAgICAgICAgIGNpcmNsZTEuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2N5JywgJzUuNScpO1xuICAgICAgICAgICAgY2lyY2xlMS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAncicsICc1LjQ5OTk5NjInKTtcblxuICAgICAgICAgICAgY29uc3QgY2lyY2xlMiA9IERPTS5jcmVhdGVOUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnY2lyY2xlJyk7XG4gICAgICAgICAgICBjaXJjbGUyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyNGRkZGRkYnKTtcbiAgICAgICAgICAgIGNpcmNsZTIuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2N4JywgJzUuNScpO1xuICAgICAgICAgICAgY2lyY2xlMi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnY3knLCAnNS41Jyk7XG4gICAgICAgICAgICBjaXJjbGUyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdyJywgJzUuNDk5OTk2MicpO1xuXG4gICAgICAgICAgICBjaXJjbGVDb250YWluZXIuYXBwZW5kQ2hpbGQoY2lyY2xlMSk7XG4gICAgICAgICAgICBjaXJjbGVDb250YWluZXIuYXBwZW5kQ2hpbGQoY2lyY2xlMik7XG5cbiAgICAgICAgICAgIHBhZ2UxLmFwcGVuZENoaWxkKHNoYWRvdyk7XG4gICAgICAgICAgICBwYWdlMS5hcHBlbmRDaGlsZChiYWNrZ3JvdW5kKTtcbiAgICAgICAgICAgIHBhZ2UxLmFwcGVuZENoaWxkKGJvcmRlcik7XG4gICAgICAgICAgICBwYWdlMS5hcHBlbmRDaGlsZChtYWtpKTtcbiAgICAgICAgICAgIHBhZ2UxLmFwcGVuZENoaWxkKGNpcmNsZUNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgIHN2Zy5hcHBlbmRDaGlsZChwYWdlMSk7XG5cbiAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoc3ZnKTtcblxuICAgICAgICAgICAgLy8gaWYgbm8gZWxlbWVudCBhbmQgbm8gb2Zmc2V0IG9wdGlvbiBnaXZlbiBhcHBseSBhbiBvZmZzZXQgZm9yIHRoZSBkZWZhdWx0IG1hcmtlclxuICAgICAgICAgICAgLy8gdGhlIC0xNCBhcyB0aGUgeSB2YWx1ZSBvZiB0aGUgZGVmYXVsdCBtYXJrZXIgb2Zmc2V0IHdhcyBkZXRlcm1pbmVkIGFzIGZvbGxvd3NcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyB0aGUgbWFya2VyIHRpcCBpcyBhdCB0aGUgY2VudGVyIG9mIHRoZSBzaGFkb3cgZWxsaXBzZSBmcm9tIHRoZSBkZWZhdWx0IHN2Z1xuICAgICAgICAgICAgLy8gdGhlIHkgdmFsdWUgb2YgdGhlIGNlbnRlciBvZiB0aGUgc2hhZG93IGVsbGlwc2UgcmVsYXRpdmUgdG8gdGhlIHN2ZyB0b3AgbGVmdCBpcyBcInNoYWRvdyB0cmFuc2Zvcm0gdHJhbnNsYXRlLXkgKDI5LjApICsgZWxsaXBzZSBjeSAoNS44MDAyOTAwOClcIlxuICAgICAgICAgICAgLy8gb2Zmc2V0IHRvIHRoZSBzdmcgY2VudGVyIFwiaGVpZ2h0ICg0MSAvIDIpXCIgZ2l2ZXMgKDI5LjAgKyA1LjgwMDI5MDA4KSAtICg0MSAvIDIpIGFuZCByb3VuZGVkIGZvciBhbiBpbnRlZ2VyIHBpeGVsIG9mZnNldCBnaXZlcyAxNFxuICAgICAgICAgICAgLy8gbmVnYXRpdmUgaXMgdXNlZCB0byBtb3ZlIHRoZSBtYXJrZXIgdXAgZnJvbSB0aGUgY2VudGVyIHNvIHRoZSB0aXAgaXMgYXQgdGhlIE1hcmtlciBsbmdMYXRcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRNYXJrZXJPZmZzZXQgPSBbMCwgLTE0XTtcbiAgICAgICAgICAgIGlmICghKG9wdGlvbnMgJiYgb3B0aW9ucy5vZmZzZXQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IGRlZmF1bHRNYXJrZXJPZmZzZXRcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9mZnNldCA9IGRlZmF1bHRNYXJrZXJPZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fb2Zmc2V0ID0gUG9pbnQuY29udmVydChvcHRpb25zICYmIG9wdGlvbnMub2Zmc2V0IHx8IFswLCAwXSk7XG5cbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1tYXJrZXInKTtcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICAgICAgdGhpcy5fcG9wdXAgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIHRoZSBtYXJrZXIgdG8gYSBtYXBcbiAgICAgKiBAcGFyYW0ge01hcH0gbWFwXG4gICAgICogQHJldHVybnMge01hcmtlcn0gYHRoaXNgXG4gICAgICovXG4gICAgYWRkVG8obWFwICAgICApIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCkuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudCk7XG4gICAgICAgIG1hcC5vbignbW92ZScsIHRoaXMuX3VwZGF0ZSk7XG4gICAgICAgIG1hcC5vbignbW92ZWVuZCcsIHRoaXMuX3VwZGF0ZSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuXG4gICAgICAgIC8vIElmIHdlIGF0dGFjaGVkIHRoZSBgY2xpY2tgIGxpc3RlbmVyIHRvIHRoZSBtYXJrZXIgZWxlbWVudCwgdGhlIHBvcHVwXG4gICAgICAgIC8vIHdvdWxkIGNsb3NlIG9uY2UgdGhlIGV2ZW50IHByb3BvZ2F0ZWQgdG8gYG1hcGAgZHVlIHRvIHRoZVxuICAgICAgICAvLyBgUG9wdXAjX29uQ2xpY2tDbG9zZWAgbGlzdGVuZXIuXG4gICAgICAgIHRoaXMuX21hcC5vbignY2xpY2snLCB0aGlzLl9vbk1hcENsaWNrKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBtYXJrZXIgZnJvbSBhIG1hcFxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIG1hcmtlciA9IG5ldyBtYXBib3hnbC5NYXJrZXIoKS5hZGRUbyhtYXApO1xuICAgICAqIG1hcmtlci5yZW1vdmUoKTtcbiAgICAgKiBAcmV0dXJucyB7TWFya2VyfSBgdGhpc2BcbiAgICAgKi9cbiAgICByZW1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ2NsaWNrJywgdGhpcy5fb25NYXBDbGljayk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlJywgdGhpcy5fdXBkYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdmVlbmQnLCB0aGlzLl91cGRhdGUpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21hcDtcbiAgICAgICAgfVxuICAgICAgICBET00ucmVtb3ZlKHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICBpZiAodGhpcy5fcG9wdXApIHRoaXMuX3BvcHVwLnJlbW92ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG1hcmtlcidzIGdlb2dyYXBoaWNhbCBsb2NhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBsb25naXR1ZGUgb2YgdGhlIHJlc3VsdCBtYXkgZGlmZmVyIGJ5IGEgbXVsdGlwbGUgb2YgMzYwIGRlZ3JlZXMgZnJvbSB0aGUgbG9uZ2l0dWRlIHByZXZpb3VzbHlcbiAgICAgKiBzZXQgYnkgYHNldExuZ0xhdGAgYmVjYXVzZSBgTWFya2VyYCB3cmFwcyB0aGUgYW5jaG9yIGxvbmdpdHVkZSBhY3Jvc3MgY29waWVzIG9mIHRoZSB3b3JsZCB0byBrZWVwXG4gICAgICogdGhlIG1hcmtlciBvbiBzY3JlZW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fVxuICAgICAqL1xuICAgIGdldExuZ0xhdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xuZ0xhdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIG1hcmtlcidzIGdlb2dyYXBoaWNhbCBwb3NpdGlvbiBhbmQgbW92ZSBpdC5cbiAgICAgKiBAcmV0dXJucyB7TWFya2VyfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRMbmdMYXQobG5nbGF0ICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuX2xuZ0xhdCA9IExuZ0xhdC5jb252ZXJ0KGxuZ2xhdCk7XG4gICAgICAgIHRoaXMuX3BvcyA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLl9wb3B1cCkgdGhpcy5fcG9wdXAuc2V0TG5nTGF0KHRoaXMuX2xuZ0xhdCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgTWFya2VyYCdzIEhUTUwgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKi9cbiAgICBnZXRFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBhIFBvcHVwIHRvIHRoZSBNYXJrZXJcbiAgICAgKiBAcGFyYW0gcG9wdXAgYW4gaW5zdGFuY2Ugb2YgdGhlIGBQb3B1cGAgY2xhc3MuIElmIHVuZGVmaW5lZCBvciBudWxsLCBhbnkgcG9wdXBcbiAgICAgKiBzZXQgb24gdGhpcyBgTWFya2VyYCBpbnN0YW5jZSBpcyB1bnNldFxuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldFBvcHVwKHBvcHVwICAgICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwKSB7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3B1cCkge1xuICAgICAgICAgICAgaWYgKCEoJ29mZnNldCcgaW4gcG9wdXAub3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICBwb3B1cC5vcHRpb25zLm9mZnNldCA9IHRoaXMuX29mZnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3BvcHVwID0gcG9wdXA7XG4gICAgICAgICAgICBpZiAodGhpcy5fbG5nTGF0KSB0aGlzLl9wb3B1cC5zZXRMbmdMYXQodGhpcy5fbG5nTGF0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9vbk1hcENsaWNrKGV2ZW50ICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBldmVudC5vcmlnaW5hbEV2ZW50LnRhcmdldDtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwICYmICh0YXJnZXRFbGVtZW50ID09PSBlbGVtZW50IHx8IGVsZW1lbnQuY29udGFpbnMoKHRhcmdldEVsZW1lbnQgICAgICkpKSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVQb3B1cCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgUG9wdXAgaW5zdGFuY2UgdGhhdCBpcyBib3VuZCB0byB0aGUgTWFya2VyXG4gICAgICogQHJldHVybnMge1BvcHVwfSBwb3B1cFxuICAgICAqL1xuICAgIGdldFBvcHVwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgb3IgY2xvc2VzIHRoZSBib3VuZCBwb3B1cCwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHN0YXRlXG4gICAgICogQHJldHVybnMge01hcmtlcn0gYHRoaXNgXG4gICAgICovXG4gICAgdG9nZ2xlUG9wdXAoKSB7XG4gICAgICAgIGNvbnN0IHBvcHVwID0gdGhpcy5fcG9wdXA7XG5cbiAgICAgICAgaWYgKCFwb3B1cCkgcmV0dXJuIHRoaXM7XG4gICAgICAgIGVsc2UgaWYgKHBvcHVwLmlzT3BlbigpKSBwb3B1cC5yZW1vdmUoKTtcbiAgICAgICAgZWxzZSBwb3B1cC5hZGRUbyh0aGlzLl9tYXApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfdXBkYXRlKGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICBpZiAoIXRoaXMuX21hcCkgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0aGlzLl9tYXAudHJhbnNmb3JtLnJlbmRlcldvcmxkQ29waWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9sbmdMYXQgPSBzbWFydFdyYXAodGhpcy5fbG5nTGF0LCB0aGlzLl9wb3MsIHRoaXMuX21hcC50cmFuc2Zvcm0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcG9zID0gdGhpcy5fbWFwLnByb2plY3QodGhpcy5fbG5nTGF0KS5fYWRkKHRoaXMuX29mZnNldCk7XG5cbiAgICAgICAgLy8gYmVjYXVzZSByb3VuZGluZyB0aGUgY29vcmRpbmF0ZXMgYXQgZXZlcnkgYG1vdmVgIGV2ZW50IGNhdXNlcyBzdHV0dGVyZWQgem9vbWluZ1xuICAgICAgICAvLyB3ZSBvbmx5IHJvdW5kIHRoZW0gd2hlbiBfdXBkYXRlIGlzIGNhbGxlZCB3aXRoIGBtb3ZlZW5kYCBvciB3aGVuIGl0cyBjYWxsZWQgd2l0aFxuICAgICAgICAvLyBubyBhcmd1bWVudHMgKHdoZW4gdGhlIE1hcmtlciBpcyBpbml0aWFsaXplZCBvciBNYXJrZXIjc2V0TG5nTGF0IGlzIGludm9rZWQpLlxuICAgICAgICBpZiAoIWUgfHwgZS50eXBlID09PSBcIm1vdmVlbmRcIikge1xuICAgICAgICAgICAgdGhpcy5fcG9zID0gdGhpcy5fcG9zLnJvdW5kKCk7XG4gICAgICAgIH1cblxuICAgICAgICBET00uc2V0VHJhbnNmb3JtKHRoaXMuX2VsZW1lbnQsIGB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgdHJhbnNsYXRlKCR7dGhpcy5fcG9zLnh9cHgsICR7dGhpcy5fcG9zLnl9cHgpYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtYXJrZXIncyBvZmZzZXQuXG4gICAgICogQHJldHVybnMge1BvaW50fVxuICAgICAqL1xuICAgIGdldE9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29mZnNldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBvZmZzZXQgb2YgdGhlIG1hcmtlclxuICAgICAqIEBwYXJhbSB7UG9pbnRMaWtlfSBvZmZzZXQgVGhlIG9mZnNldCBpbiBwaXhlbHMgYXMgYSB7QGxpbmsgUG9pbnRMaWtlfSBvYmplY3QgdG8gYXBwbHkgcmVsYXRpdmUgdG8gdGhlIGVsZW1lbnQncyBjZW50ZXIuIE5lZ2F0aXZlcyBpbmRpY2F0ZSBsZWZ0IGFuZCB1cC5cbiAgICAgKiBAcmV0dXJucyB7TWFya2VyfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRPZmZzZXQob2Zmc2V0ICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5fb2Zmc2V0ID0gUG9pbnQuY29udmVydChvZmZzZXQpO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcmtlcjtcbiIsIi8vICAgICAgXG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbmNvbnN0IEV2ZW50ZWQgPSByZXF1aXJlKCcuLi91dGlsL2V2ZW50ZWQnKTtcbmNvbnN0IERPTSA9IHJlcXVpcmUoJy4uL3V0aWwvZG9tJyk7XG5jb25zdCBMbmdMYXQgPSByZXF1aXJlKCcuLi9nZW8vbG5nX2xhdCcpO1xuY29uc3QgUG9pbnQgPSByZXF1aXJlKCdAbWFwYm94L3BvaW50LWdlb21ldHJ5Jyk7XG5jb25zdCB3aW5kb3cgPSByZXF1aXJlKCcuLi91dGlsL3dpbmRvdycpO1xuY29uc3Qgc21hcnRXcmFwID0gcmVxdWlyZSgnLi4vdXRpbC9zbWFydF93cmFwJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBjbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICBjbG9zZU9uQ2xpY2s6IHRydWVcbn07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gIFxuXG4vKipcbiAqIEEgcG9wdXAgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2xvc2VCdXR0b249dHJ1ZV0gSWYgYHRydWVgLCBhIGNsb3NlIGJ1dHRvbiB3aWxsIGFwcGVhciBpbiB0aGVcbiAqICAgdG9wIHJpZ2h0IGNvcm5lciBvZiB0aGUgcG9wdXAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNsb3NlT25DbGljaz10cnVlXSBJZiBgdHJ1ZWAsIHRoZSBwb3B1cCB3aWxsIGNsb3NlZCB3aGVuIHRoZVxuICogICBtYXAgaXMgY2xpY2tlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5hbmNob3JdIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgcG9wdXAncyBsb2NhdGlvbiByZWxhdGl2ZSB0b1xuICogICB0aGUgY29vcmRpbmF0ZSBzZXQgdmlhIHtAbGluayBQb3B1cCNzZXRMbmdMYXR9LlxuICogICBPcHRpb25zIGFyZSBgJ3RvcCdgLCBgJ2JvdHRvbSdgLCBgJ2xlZnQnYCwgYCdyaWdodCdgLCBgJ3RvcC1sZWZ0J2AsXG4gKiAgIGAndG9wLXJpZ2h0J2AsIGAnYm90dG9tLWxlZnQnYCwgYW5kIGAnYm90dG9tLXJpZ2h0J2AuIElmIHVuc2V0IHRoZSBhbmNob3Igd2lsbCBiZVxuICogICBkeW5hbWljYWxseSBzZXQgdG8gZW5zdXJlIHRoZSBwb3B1cCBmYWxscyB3aXRoaW4gdGhlIG1hcCBjb250YWluZXIgd2l0aCBhIHByZWZlcmVuY2VcbiAqICAgZm9yIGAnYm90dG9tJ2AuXG4gKiBAcGFyYW0ge251bWJlcnxQb2ludExpa2V8T2JqZWN0fSBbb3B0aW9ucy5vZmZzZXRdIC1cbiAqICBBIHBpeGVsIG9mZnNldCBhcHBsaWVkIHRvIHRoZSBwb3B1cCdzIGxvY2F0aW9uIHNwZWNpZmllZCBhczpcbiAqICAgLSBhIHNpbmdsZSBudW1iZXIgc3BlY2lmeWluZyBhIGRpc3RhbmNlIGZyb20gdGhlIHBvcHVwJ3MgbG9jYXRpb25cbiAqICAgLSBhIHtAbGluayBQb2ludExpa2V9IHNwZWNpZnlpbmcgYSBjb25zdGFudCBvZmZzZXRcbiAqICAgLSBhbiBvYmplY3Qgb2Yge0BsaW5rIFBvaW50fXMgc3BlY2lmaW5nIGFuIG9mZnNldCBmb3IgZWFjaCBhbmNob3IgcG9zaXRpb25cbiAqICBOZWdhdGl2ZSBvZmZzZXRzIGluZGljYXRlIGxlZnQgYW5kIHVwLlxuICogQGV4YW1wbGVcbiAqIHZhciBtYXJrZXJIZWlnaHQgPSA1MCwgbWFya2VyUmFkaXVzID0gMTAsIGxpbmVhck9mZnNldCA9IDI1O1xuICogdmFyIHBvcHVwT2Zmc2V0cyA9IHtcbiAqICAndG9wJzogWzAsIDBdLFxuICogICd0b3AtbGVmdCc6IFswLDBdLFxuICogICd0b3AtcmlnaHQnOiBbMCwwXSxcbiAqICAnYm90dG9tJzogWzAsIC1tYXJrZXJIZWlnaHRdLFxuICogICdib3R0b20tbGVmdCc6IFtsaW5lYXJPZmZzZXQsIChtYXJrZXJIZWlnaHQgLSBtYXJrZXJSYWRpdXMgKyBsaW5lYXJPZmZzZXQpICogLTFdLFxuICogICdib3R0b20tcmlnaHQnOiBbLWxpbmVhck9mZnNldCwgKG1hcmtlckhlaWdodCAtIG1hcmtlclJhZGl1cyArIGxpbmVhck9mZnNldCkgKiAtMV0sXG4gKiAgJ2xlZnQnOiBbbWFya2VyUmFkaXVzLCAobWFya2VySGVpZ2h0IC0gbWFya2VyUmFkaXVzKSAqIC0xXSxcbiAqICAncmlnaHQnOiBbLW1hcmtlclJhZGl1cywgKG1hcmtlckhlaWdodCAtIG1hcmtlclJhZGl1cykgKiAtMV1cbiAqICB9O1xuICogdmFyIHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKHtvZmZzZXQ6cG9wdXBPZmZzZXRzfSlcbiAqICAgLnNldExuZ0xhdChlLmxuZ0xhdClcbiAqICAgLnNldEhUTUwoXCI8aDE+SGVsbG8gV29ybGQhPC9oMT5cIilcbiAqICAgLmFkZFRvKG1hcCk7XG4gKiBAc2VlIFtEaXNwbGF5IGEgcG9wdXBdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAvKVxuICogQHNlZSBbRGlzcGxheSBhIHBvcHVwIG9uIGhvdmVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWhvdmVyLylcbiAqIEBzZWUgW0Rpc3BsYXkgYSBwb3B1cCBvbiBjbGlja10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1jbGljay8pXG4gKi9cbmNsYXNzIFBvcHVwIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucyAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHV0aWwuZXh0ZW5kKE9iamVjdC5jcmVhdGUoZGVmYXVsdE9wdGlvbnMpLCBvcHRpb25zKTtcbiAgICAgICAgdXRpbC5iaW5kQWxsKFsnX3VwZGF0ZScsICdfb25DbGlja0Nsb3NlJ10sIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIHBvcHVwIHRvIGEgbWFwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwYm94IEdMIEpTIG1hcCB0byBhZGQgdGhlIHBvcHVwIHRvLlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICovXG4gICAgYWRkVG8obWFwICAgICApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9tYXAub24oJ21vdmUnLCB0aGlzLl91cGRhdGUpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNsb3NlT25DbGljaykge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdjbGljaycsIHRoaXMuX29uQ2xpY2tDbG9zZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHBvcHVwIGlzIG9wZW4sIGBmYWxzZWAgaWYgaXQgaXMgY2xvc2VkLlxuICAgICAqL1xuICAgIGlzT3BlbigpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fbWFwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHBvcHVwIGZyb20gdGhlIG1hcCBpdCBoYXMgYmVlbiBhZGRlZCB0by5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKCkuYWRkVG8obWFwKTtcbiAgICAgKiBwb3B1cC5yZW1vdmUoKTtcbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnQpIHtcbiAgICAgICAgICAgIERPTS5yZW1vdmUodGhpcy5fY29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XG4gICAgICAgICAgICBET00ucmVtb3ZlKHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fY29udGFpbmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignbW92ZScsIHRoaXMuX3VwZGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdjbGljaycsIHRoaXMuX29uQ2xpY2tDbG9zZSk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fbWFwO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gdGhlIHBvcHVwIGlzIGNsb3NlZCBtYW51YWxseSBvciBwcm9ncmFtYXRpY2FsbHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBjbG9zZVxuICAgICAgICAgKiBAbWVtYmVyb2YgUG9wdXBcbiAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7UG9wdXB9IHBvcHVwIG9iamVjdCB0aGF0IHdhcyBjbG9zZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZmlyZSgnY2xvc2UnKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBnZW9ncmFwaGljYWwgbG9jYXRpb24gb2YgdGhlIHBvcHVwJ3MgYW5jaG9yLlxuICAgICAqXG4gICAgICogVGhlIGxvbmdpdHVkZSBvZiB0aGUgcmVzdWx0IG1heSBkaWZmZXIgYnkgYSBtdWx0aXBsZSBvZiAzNjAgZGVncmVlcyBmcm9tIHRoZSBsb25naXR1ZGUgcHJldmlvdXNseVxuICAgICAqIHNldCBieSBgc2V0TG5nTGF0YCBiZWNhdXNlIGBQb3B1cGAgd3JhcHMgdGhlIGFuY2hvciBsb25naXR1ZGUgYWNyb3NzIGNvcGllcyBvZiB0aGUgd29ybGQgdG8ga2VlcFxuICAgICAqIHRoZSBwb3B1cCBvbiBzY3JlZW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uIG9mIHRoZSBwb3B1cCdzIGFuY2hvci5cbiAgICAgKi9cbiAgICBnZXRMbmdMYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sbmdMYXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uIG9mIHRoZSBwb3B1cCdzIGFuY2hvciwgYW5kIG1vdmVzIHRoZSBwb3B1cCB0byBpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsbmdsYXQgVGhlIGdlb2dyYXBoaWNhbCBsb2NhdGlvbiB0byBzZXQgYXMgdGhlIHBvcHVwJ3MgYW5jaG9yLlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0TG5nTGF0KGxuZ2xhdCAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLl9sbmdMYXQgPSBMbmdMYXQuY29udmVydChsbmdsYXQpO1xuICAgICAgICB0aGlzLl9wb3MgPSBudWxsO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcG9wdXAncyBjb250ZW50IHRvIGEgc3RyaW5nIG9mIHRleHQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBbVGV4dF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RleHQpIG5vZGUgaW4gdGhlIERPTSxcbiAgICAgKiBzbyBpdCBjYW5ub3QgaW5zZXJ0IHJhdyBIVE1MLiBVc2UgdGhpcyBtZXRob2QgZm9yIHNlY3VyaXR5IGFnYWluc3QgWFNTXG4gICAgICogaWYgdGhlIHBvcHVwIGNvbnRlbnQgaXMgdXNlci1wcm92aWRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0ZXh0IFRleHR1YWwgY29udGVudCBmb3IgdGhlIHBvcHVwLlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgcG9wdXAgPSBuZXcgbWFwYm94Z2wuUG9wdXAoKVxuICAgICAqICAgLnNldExuZ0xhdChlLmxuZ0xhdClcbiAgICAgKiAgIC5zZXRUZXh0KCdIZWxsbywgd29ybGQhJylcbiAgICAgKiAgIC5hZGRUbyhtYXApO1xuICAgICAqL1xuICAgIHNldFRleHQodGV4dCAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldERPTUNvbnRlbnQod2luZG93LmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwb3B1cCdzIGNvbnRlbnQgdG8gdGhlIEhUTUwgcHJvdmlkZWQgYXMgYSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBwZXJmb3JtIEhUTUwgZmlsdGVyaW5nIG9yIHNhbml0aXphdGlvbiwgYW5kIG11c3QgYmVcbiAgICAgKiB1c2VkIG9ubHkgd2l0aCB0cnVzdGVkIGNvbnRlbnQuIENvbnNpZGVyIHtAbGluayBQb3B1cCNzZXRUZXh0fSBpZlxuICAgICAqIHRoZSBjb250ZW50IGlzIGFuIHVudHJ1c3RlZCB0ZXh0IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBodG1sIEEgc3RyaW5nIHJlcHJlc2VudGluZyBIVE1MIGNvbnRlbnQgZm9yIHRoZSBwb3B1cC5cbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldEhUTUwoaHRtbCAgICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGZyYWcgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgICBjb25zdCB0ZW1wID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2JvZHknKTtcbiAgICAgICAgbGV0IGNoaWxkO1xuICAgICAgICB0ZW1wLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjaGlsZCA9IHRlbXAuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIGlmICghY2hpbGQpIGJyZWFrO1xuICAgICAgICAgICAgZnJhZy5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zZXRET01Db250ZW50KGZyYWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHBvcHVwJ3MgY29udGVudCB0byB0aGUgZWxlbWVudCBwcm92aWRlZCBhcyBhIERPTSBub2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGh0bWxOb2RlIEEgRE9NIG5vZGUgdG8gYmUgdXNlZCBhcyBjb250ZW50IGZvciB0aGUgcG9wdXAuXG4gICAgICogQHJldHVybnMge1BvcHVwfSBgdGhpc2BcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIGNyZWF0ZSBhbiBlbGVtZW50IHdpdGggdGhlIHBvcHVwIGNvbnRlbnRcbiAgICAgKiB2YXIgZGl2ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAqIGRpdi5pbm5lckhUTUwgPSAnSGVsbG8sIHdvcmxkISc7XG4gICAgICogdmFyIHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKClcbiAgICAgKiAgIC5zZXRMbmdMYXQoZS5sbmdMYXQpXG4gICAgICogICAuc2V0RE9NQ29udGVudChkaXYpXG4gICAgICogICAuYWRkVG8obWFwKTtcbiAgICAgKi9cbiAgICBzZXRET01Db250ZW50KGh0bWxOb2RlICAgICAgKSB7XG4gICAgICAgIHRoaXMuX2NyZWF0ZUNvbnRlbnQoKTtcbiAgICAgICAgdGhpcy5fY29udGVudC5hcHBlbmRDaGlsZChodG1sTm9kZSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfY3JlYXRlQ29udGVudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnQpIHtcbiAgICAgICAgICAgIERPTS5yZW1vdmUodGhpcy5fY29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jb250ZW50ID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLXBvcHVwLWNvbnRlbnQnLCB0aGlzLl9jb250YWluZXIpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2xvc2VCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlQnV0dG9uID0gRE9NLmNyZWF0ZSgnYnV0dG9uJywgJ21hcGJveGdsLXBvcHVwLWNsb3NlLWJ1dHRvbicsIHRoaXMuX2NvbnRlbnQpO1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24udHlwZSA9ICdidXR0b24nO1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0Nsb3NlIHBvcHVwJyk7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZUJ1dHRvbi5pbm5lckhUTUwgPSAnJiMyMTU7JztcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGlja0Nsb3NlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWFwIHx8ICF0aGlzLl9sbmdMYXQgfHwgIXRoaXMuX2NvbnRlbnQpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1wb3B1cCcsIHRoaXMuX21hcC5nZXRDb250YWluZXIoKSk7XG4gICAgICAgICAgICB0aGlzLl90aXAgICAgICAgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtcG9wdXAtdGlwJywgdGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9jb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9tYXAudHJhbnNmb3JtLnJlbmRlcldvcmxkQ29waWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9sbmdMYXQgPSBzbWFydFdyYXAodGhpcy5fbG5nTGF0LCB0aGlzLl9wb3MsIHRoaXMuX21hcC50cmFuc2Zvcm0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9zID0gdGhpcy5fcG9zID0gdGhpcy5fbWFwLnByb2plY3QodGhpcy5fbG5nTGF0KTtcblxuICAgICAgICBsZXQgYW5jaG9yID0gdGhpcy5vcHRpb25zLmFuY2hvcjtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gbm9ybWFsaXplT2Zmc2V0KHRoaXMub3B0aW9ucy5vZmZzZXQpO1xuXG4gICAgICAgIGlmICghYW5jaG9yKSB7XG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuX2NvbnRhaW5lci5vZmZzZXRXaWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLl9jb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgICAgICBpZiAocG9zLnkgKyBvZmZzZXQuYm90dG9tLnkgPCBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBhbmNob3IgPSBbJ3RvcCddO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwb3MueSA+IHRoaXMuX21hcC50cmFuc2Zvcm0uaGVpZ2h0IC0gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yID0gWydib3R0b20nXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwb3MueCA8IHdpZHRoIC8gMikge1xuICAgICAgICAgICAgICAgIGFuY2hvci5wdXNoKCdsZWZ0Jyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBvcy54ID4gdGhpcy5fbWFwLnRyYW5zZm9ybS53aWR0aCAtIHdpZHRoIC8gMikge1xuICAgICAgICAgICAgICAgIGFuY2hvci5wdXNoKCdyaWdodCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYW5jaG9yLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGFuY2hvciA9ICdib3R0b20nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhbmNob3IgPSBhbmNob3Iuam9pbignLScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb2Zmc2V0ZWRQb3MgPSBwb3MuYWRkKG9mZnNldFthbmNob3JdKS5yb3VuZCgpO1xuXG4gICAgICAgIGNvbnN0IGFuY2hvclRyYW5zbGF0ZSA9IHtcbiAgICAgICAgICAgICd0b3AnOiAndHJhbnNsYXRlKC01MCUsMCknLFxuICAgICAgICAgICAgJ3RvcC1sZWZ0JzogJ3RyYW5zbGF0ZSgwLDApJyxcbiAgICAgICAgICAgICd0b3AtcmlnaHQnOiAndHJhbnNsYXRlKC0xMDAlLDApJyxcbiAgICAgICAgICAgICdib3R0b20nOiAndHJhbnNsYXRlKC01MCUsLTEwMCUpJyxcbiAgICAgICAgICAgICdib3R0b20tbGVmdCc6ICd0cmFuc2xhdGUoMCwtMTAwJSknLFxuICAgICAgICAgICAgJ2JvdHRvbS1yaWdodCc6ICd0cmFuc2xhdGUoLTEwMCUsLTEwMCUpJyxcbiAgICAgICAgICAgICdsZWZ0JzogJ3RyYW5zbGF0ZSgwLC01MCUpJyxcbiAgICAgICAgICAgICdyaWdodCc6ICd0cmFuc2xhdGUoLTEwMCUsLTUwJSknXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdDtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYW5jaG9yVHJhbnNsYXRlKSB7XG4gICAgICAgICAgICBjbGFzc0xpc3QucmVtb3ZlKGBtYXBib3hnbC1wb3B1cC1hbmNob3ItJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY2xhc3NMaXN0LmFkZChgbWFwYm94Z2wtcG9wdXAtYW5jaG9yLSR7YW5jaG9yfWApO1xuXG4gICAgICAgIERPTS5zZXRUcmFuc2Zvcm0odGhpcy5fY29udGFpbmVyLCBgJHthbmNob3JUcmFuc2xhdGVbYW5jaG9yXX0gdHJhbnNsYXRlKCR7b2Zmc2V0ZWRQb3MueH1weCwke29mZnNldGVkUG9zLnl9cHgpYCk7XG4gICAgfVxuXG4gICAgX29uQ2xpY2tDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9mZnNldChvZmZzZXQgICAgICAgICApIHtcbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplT2Zmc2V0KG5ldyBQb2ludCgwLCAwKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIC8vIGlucHV0IHNwZWNpZmllcyBhIHJhZGl1cyBmcm9tIHdoaWNoIHRvIGNhbGN1bGF0ZSBvZmZzZXRzIGF0IGFsbCBwb3NpdGlvbnNcbiAgICAgICAgY29uc3QgY29ybmVyT2Zmc2V0ID0gTWF0aC5yb3VuZChNYXRoLnNxcnQoMC41ICogTWF0aC5wb3cob2Zmc2V0LCAyKSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ3RvcCc6IG5ldyBQb2ludCgwLCBvZmZzZXQpLFxuICAgICAgICAgICAgJ3RvcC1sZWZ0JzogbmV3IFBvaW50KGNvcm5lck9mZnNldCwgY29ybmVyT2Zmc2V0KSxcbiAgICAgICAgICAgICd0b3AtcmlnaHQnOiBuZXcgUG9pbnQoLWNvcm5lck9mZnNldCwgY29ybmVyT2Zmc2V0KSxcbiAgICAgICAgICAgICdib3R0b20nOiBuZXcgUG9pbnQoMCwgLW9mZnNldCksXG4gICAgICAgICAgICAnYm90dG9tLWxlZnQnOiBuZXcgUG9pbnQoY29ybmVyT2Zmc2V0LCAtY29ybmVyT2Zmc2V0KSxcbiAgICAgICAgICAgICdib3R0b20tcmlnaHQnOiBuZXcgUG9pbnQoLWNvcm5lck9mZnNldCwgLWNvcm5lck9mZnNldCksXG4gICAgICAgICAgICAnbGVmdCc6IG5ldyBQb2ludChvZmZzZXQsIDApLFxuICAgICAgICAgICAgJ3JpZ2h0JzogbmV3IFBvaW50KC1vZmZzZXQsIDApXG4gICAgICAgIH07XG5cbiAgICB9IGVsc2UgaWYgKG9mZnNldCBpbnN0YW5jZW9mIFBvaW50IHx8IEFycmF5LmlzQXJyYXkob2Zmc2V0KSkge1xuICAgICAgICAvLyBpbnB1dCBzcGVjaWZpZXMgYSBzaW5nbGUgb2Zmc2V0IHRvIGJlIGFwcGxpZWQgdG8gYWxsIHBvc2l0aW9uc1xuICAgICAgICBjb25zdCBjb252ZXJ0ZWRPZmZzZXQgPSBQb2ludC5jb252ZXJ0KG9mZnNldCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAndG9wJzogY29udmVydGVkT2Zmc2V0LFxuICAgICAgICAgICAgJ3RvcC1sZWZ0JzogY29udmVydGVkT2Zmc2V0LFxuICAgICAgICAgICAgJ3RvcC1yaWdodCc6IGNvbnZlcnRlZE9mZnNldCxcbiAgICAgICAgICAgICdib3R0b20nOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAnYm90dG9tLWxlZnQnOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAnYm90dG9tLXJpZ2h0JzogY29udmVydGVkT2Zmc2V0LFxuICAgICAgICAgICAgJ2xlZnQnOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAncmlnaHQnOiBjb252ZXJ0ZWRPZmZzZXRcbiAgICAgICAgfTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlucHV0IHNwZWNpZmllcyBhbiBvZmZzZXQgcGVyIHBvc2l0aW9uXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAndG9wJzogUG9pbnQuY29udmVydChvZmZzZXRbJ3RvcCddIHx8IFswLCAwXSksXG4gICAgICAgICAgICAndG9wLWxlZnQnOiBQb2ludC5jb252ZXJ0KG9mZnNldFsndG9wLWxlZnQnXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgJ3RvcC1yaWdodCc6IFBvaW50LmNvbnZlcnQob2Zmc2V0Wyd0b3AtcmlnaHQnXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgJ2JvdHRvbSc6IFBvaW50LmNvbnZlcnQob2Zmc2V0Wydib3R0b20nXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgJ2JvdHRvbS1sZWZ0JzogUG9pbnQuY29udmVydChvZmZzZXRbJ2JvdHRvbS1sZWZ0J10gfHwgWzAsIDBdKSxcbiAgICAgICAgICAgICdib3R0b20tcmlnaHQnOiBQb2ludC5jb252ZXJ0KG9mZnNldFsnYm90dG9tLXJpZ2h0J10gfHwgWzAsIDBdKSxcbiAgICAgICAgICAgICdsZWZ0JzogUG9pbnQuY29udmVydChvZmZzZXRbJ2xlZnQnXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgJ3JpZ2h0JzogUG9pbnQuY29udmVydChvZmZzZXRbJ3JpZ2h0J10gfHwgWzAsIDBdKVxuICAgICAgICB9O1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBQb3B1cDtcbiIsIi8vICAgICAgXG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbmNvbnN0IHtzZXJpYWxpemUsIGRlc2VyaWFsaXplfSA9IHJlcXVpcmUoJy4vd2ViX3dvcmtlcl90cmFuc2ZlcicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBbQWN0b3IgZGVzaWduIHBhdHRlcm5dKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQWN0b3JfbW9kZWwpXG4gKiB0aGF0IG1haW50YWlucyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYXN5bmNocm9ub3VzIHRhc2tzIGFuZCB0aGUgb2JqZWN0c1xuICogdGhhdCBzcGluIHRoZW0gb2ZmIC0gaW4gdGhpcyBjYXNlLCB0YXNrcyBsaWtlIHBhcnNpbmcgcGFydHMgb2Ygc3R5bGVzLFxuICogb3duZWQgYnkgdGhlIHN0eWxlc1xuICpcbiAqIEBwYXJhbSB7V2ViV29ya2VyfSB0YXJnZXRcbiAqIEBwYXJhbSB7V2ViV29ya2VyfSBwYXJlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbWFwSWQgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIE1hcCBpbnN0YW5jZSB1c2luZyB0aGlzIEFjdG9yLlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQWN0b3Ige1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKHRhcmdldCAgICAgLCBwYXJlbnQgICAgICwgbWFwSWQgICAgICkge1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMubWFwSWQgPSBtYXBJZDtcbiAgICAgICAgdGhpcy5jYWxsYmFja3MgPSB7fTtcbiAgICAgICAgdGhpcy5jYWxsYmFja0lEID0gMDtcbiAgICAgICAgdXRpbC5iaW5kQWxsKFsncmVjZWl2ZSddLCB0aGlzKTtcbiAgICAgICAgdGhpcy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMucmVjZWl2ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgbWVzc2FnZSBmcm9tIGEgbWFpbi10aHJlYWQgbWFwIHRvIGEgV29ya2VyIG9yIGZyb20gYSBXb3JrZXIgYmFjayB0b1xuICAgICAqIGEgbWFpbi10aHJlYWQgbWFwIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIG5hbWUgb2YgdGhlIHRhcmdldCBtZXRob2QgdG8gaW52b2tlIG9yICdbc291cmNlLXR5cGVdLm5hbWUnIGZvciBhIG1ldGhvZCBvbiBhIFdvcmtlclNvdXJjZS5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0TWFwSWQgQSBwYXJ0aWN1bGFyIG1hcElkIHRvIHdoaWNoIHRvIHNlbmQgdGhpcyBtZXNzYWdlLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc2VuZCh0eXBlICAgICAgICAsIGRhdGEgICAgICAgLCBjYWxsYmFjayAgICAgICAgICAgLCB0YXJnZXRNYXBJZCAgICAgICAgICkge1xuICAgICAgICBjb25zdCBpZCA9IGNhbGxiYWNrID8gYCR7dGhpcy5tYXBJZH06JHt0aGlzLmNhbGxiYWNrSUQrK31gIDogbnVsbDtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB0aGlzLmNhbGxiYWNrc1tpZF0gPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgYnVmZmVycyAgICAgICAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLnRhcmdldC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICB0YXJnZXRNYXBJZDogdGFyZ2V0TWFwSWQsXG4gICAgICAgICAgICBzb3VyY2VNYXBJZDogdGhpcy5tYXBJZCxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBpZDogU3RyaW5nKGlkKSxcbiAgICAgICAgICAgIGRhdGE6IHNlcmlhbGl6ZShkYXRhLCBidWZmZXJzKVxuICAgICAgICB9LCBidWZmZXJzKTtcbiAgICB9XG5cbiAgICByZWNlaXZlKG1lc3NhZ2UgICAgICAgICkge1xuICAgICAgICBjb25zdCBkYXRhID0gbWVzc2FnZS5kYXRhLFxuICAgICAgICAgICAgaWQgPSBkYXRhLmlkO1xuICAgICAgICBsZXQgY2FsbGJhY2s7XG5cbiAgICAgICAgaWYgKGRhdGEudGFyZ2V0TWFwSWQgJiYgdGhpcy5tYXBJZCAhPT0gZGF0YS50YXJnZXRNYXBJZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBkb25lID0gKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYnVmZmVycyAgICAgICAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICAgICAgdGhpcy50YXJnZXQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIHNvdXJjZU1hcElkOiB0aGlzLm1hcElkLFxuICAgICAgICAgICAgICAgIHR5cGU6ICc8cmVzcG9uc2U+JyxcbiAgICAgICAgICAgICAgICBpZDogU3RyaW5nKGlkKSxcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyID8gU3RyaW5nKGVycikgOiBudWxsLFxuICAgICAgICAgICAgICAgIGRhdGE6IHNlcmlhbGl6ZShkYXRhLCBidWZmZXJzKVxuICAgICAgICAgICAgfSwgYnVmZmVycyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJzxyZXNwb25zZT4nKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tzW2RhdGEuaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2RhdGEuaWRdO1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrICYmIGRhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoZGF0YS5lcnJvcikpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRlc2VyaWFsaXplKGRhdGEuZGF0YSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhLmlkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnBhcmVudFtkYXRhLnR5cGVdKSB7XG4gICAgICAgICAgICAvLyBkYXRhLnR5cGUgPT0gJ2xvYWRUaWxlJywgJ3JlbW92ZVRpbGUnLCBldGMuXG4gICAgICAgICAgICB0aGlzLnBhcmVudFtkYXRhLnR5cGVdKGRhdGEuc291cmNlTWFwSWQsIGRlc2VyaWFsaXplKGRhdGEuZGF0YSksIGRvbmUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhLmlkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnBhcmVudC5nZXRXb3JrZXJTb3VyY2UpIHtcbiAgICAgICAgICAgIC8vIGRhdGEudHlwZSA9PSBzb3VyY2V0eXBlLm1ldGhvZFxuICAgICAgICAgICAgY29uc3Qga2V5cyA9IGRhdGEudHlwZS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyU291cmNlID0gKHRoaXMucGFyZW50ICAgICApLmdldFdvcmtlclNvdXJjZShkYXRhLnNvdXJjZU1hcElkLCBrZXlzWzBdKTtcbiAgICAgICAgICAgIHdvcmtlclNvdXJjZVtrZXlzWzFdXShkZXNlcmlhbGl6ZShkYXRhLmRhdGEpLCBkb25lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50W2RhdGEudHlwZV0oZGVzZXJpYWxpemUoZGF0YS5kYXRhKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmUoKSB7XG4gICAgICAgIHRoaXMudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLnJlY2VpdmUsIGZhbHNlKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQWN0b3I7XG4iLCIvLyAgICAgIFxuXG5jb25zdCB3aW5kb3cgPSByZXF1aXJlKCcuL3dpbmRvdycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGEgcmVzb3VyY2UuXG4gKiBAcHJpdmF0ZVxuICogQHJlYWRvbmx5XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5jb25zdCBSZXNvdXJjZVR5cGUgPSB7XG4gICAgVW5rbm93bjogJ1Vua25vd24nLFxuICAgIFN0eWxlOiAnU3R5bGUnLFxuICAgIFNvdXJjZTogJ1NvdXJjZScsXG4gICAgVGlsZTogJ1RpbGUnLFxuICAgIEdseXBoczogJ0dseXBocycsXG4gICAgU3ByaXRlSW1hZ2U6ICdTcHJpdGVJbWFnZScsXG4gICAgU3ByaXRlSlNPTjogJ1Nwcml0ZUpTT04nLFxuICAgIEltYWdlOiAnSW1hZ2UnXG59O1xuZXhwb3J0cy5SZXNvdXJjZVR5cGUgPSBSZXNvdXJjZVR5cGU7XG5cbmlmICh0eXBlb2YgT2JqZWN0LmZyZWV6ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgT2JqZWN0LmZyZWV6ZShSZXNvdXJjZVR5cGUpO1xufVxuXG4vKipcbiAqIEEgYFJlcXVlc3RQYXJhbWV0ZXJzYCBvYmplY3QgdG8gYmUgcmV0dXJuZWQgZnJvbSBNYXAub3B0aW9ucy50cmFuc2Zvcm1SZXF1ZXN0IGNhbGxiYWNrcy5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFJlcXVlc3RQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcmVxdWVzdGVkLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGhlYWRlcnMgVGhlIGhlYWRlcnMgdG8gYmUgc2VudCB3aXRoIHRoZSByZXF1ZXN0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNyZWRlbnRpYWxzIGAnc2FtZS1vcmlnaW4nfCdpbmNsdWRlJ2AgVXNlICdpbmNsdWRlJyB0byBzZW5kIGNvb2tpZXMgd2l0aCBjcm9zcy1vcmlnaW4gcmVxdWVzdHMuXG4gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgXG5cbmNsYXNzIEFKQVhFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAgICAgICAgICAgICAgICBcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlICAgICAgICAsIHN0YXR1cyAgICAgICAgKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1ha2VSZXF1ZXN0KHJlcXVlc3RQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgIHtcbiAgICBjb25zdCB4aHIgICAgICAgICAgICAgICAgID0gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgeGhyLm9wZW4oJ0dFVCcsIHJlcXVlc3RQYXJhbWV0ZXJzLnVybCwgdHJ1ZSk7XG4gICAgZm9yIChjb25zdCBrIGluIHJlcXVlc3RQYXJhbWV0ZXJzLmhlYWRlcnMpIHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaywgcmVxdWVzdFBhcmFtZXRlcnMuaGVhZGVyc1trXSk7XG4gICAgfVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0UGFyYW1ldGVycy5jcmVkZW50aWFscyA9PT0gJ2luY2x1ZGUnO1xuICAgIHJldHVybiB4aHI7XG59XG5cbmV4cG9ydHMuZ2V0SlNPTiA9IGZ1bmN0aW9uKHJlcXVlc3RQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICwgY2FsbGJhY2sgICAgICAgICAgICAgICAgICkge1xuICAgIGNvbnN0IHhociA9IG1ha2VSZXF1ZXN0KHJlcXVlc3RQYXJhbWV0ZXJzKTtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoeGhyLnN0YXR1c1RleHQpKTtcbiAgICB9O1xuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDAgJiYgeGhyLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICBsZXQgZGF0YTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgQUpBWEVycm9yKHhoci5zdGF0dXNUZXh0LCB4aHIuc3RhdHVzKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHhoci5zZW5kKCk7XG4gICAgcmV0dXJuIHhocjtcbn07XG5cbmV4cG9ydHMuZ2V0QXJyYXlCdWZmZXIgPSBmdW5jdGlvbihyZXF1ZXN0UGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAsIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgY29uc3QgeGhyID0gbWFrZVJlcXVlc3QocmVxdWVzdFBhcmFtZXRlcnMpO1xuICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcih4aHIuc3RhdHVzVGV4dCkpO1xuICAgIH07XG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zdCByZXNwb25zZSAgICAgICAgICAgICAgPSB4aHIucmVzcG9uc2U7XG4gICAgICAgIGlmIChyZXNwb25zZS5ieXRlTGVuZ3RoID09PSAwICYmIHhoci5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcignaHR0cCBzdGF0dXMgMjAwIHJldHVybmVkIHdpdGhvdXQgY29udGVudC4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDAgJiYgeGhyLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICAgICAgICAgICAgZGF0YTogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgY2FjaGVDb250cm9sOiB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0NhY2hlLUNvbnRyb2wnKSxcbiAgICAgICAgICAgICAgICBleHBpcmVzOiB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0V4cGlyZXMnKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgQUpBWEVycm9yKHhoci5zdGF0dXNUZXh0LCB4aHIuc3RhdHVzKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHhoci5zZW5kKCk7XG4gICAgcmV0dXJuIHhocjtcbn07XG5cbmZ1bmN0aW9uIHNhbWVPcmlnaW4odXJsKSB7XG4gICAgY29uc3QgYSAgICAgICAgICAgICAgICAgICAgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGEuaHJlZiA9IHVybDtcbiAgICByZXR1cm4gYS5wcm90b2NvbCA9PT0gd2luZG93LmRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sICYmIGEuaG9zdCA9PT0gd2luZG93LmRvY3VtZW50LmxvY2F0aW9uLmhvc3Q7XG59XG5cbmNvbnN0IHRyYW5zcGFyZW50UG5nVXJsID0gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUVBQUFBQkNBWUFBQUFmRmNTSkFBQUFDMGxFUVZRWVYyTmdBQUlBQUFVQUFhclZ5RkVBQUFBQVNVVk9SSzVDWUlJPSc7XG5cbmV4cG9ydHMuZ2V0SW1hZ2UgPSBmdW5jdGlvbihyZXF1ZXN0UGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAsIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgIC8vIHJlcXVlc3QgdGhlIGltYWdlIHdpdGggWEhSIHRvIHdvcmsgYXJvdW5kIGNhY2hpbmcgaXNzdWVzXG4gICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8xNDcwXG4gICAgcmV0dXJuIGV4cG9ydHMuZ2V0QXJyYXlCdWZmZXIocmVxdWVzdFBhcmFtZXRlcnMsIChlcnIsIGltZ0RhdGEpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfSBlbHNlIGlmIChpbWdEYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBpbWcgICAgICAgICAgICAgICAgICAgPSBuZXcgd2luZG93LkltYWdlKCk7XG4gICAgICAgICAgICBjb25zdCBVUkwgPSB3aW5kb3cuVVJMIHx8IHdpbmRvdy53ZWJraXRVUkw7XG4gICAgICAgICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGltZyk7XG4gICAgICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChpbWcuc3JjKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBibG9iICAgICAgID0gbmV3IHdpbmRvdy5CbG9iKFtuZXcgVWludDhBcnJheShpbWdEYXRhLmRhdGEpXSwgeyB0eXBlOiAnaW1hZ2UvcG5nJyB9KTtcbiAgICAgICAgICAgIChpbWcgICAgICkuY2FjaGVDb250cm9sID0gaW1nRGF0YS5jYWNoZUNvbnRyb2w7XG4gICAgICAgICAgICAoaW1nICAgICApLmV4cGlyZXMgPSBpbWdEYXRhLmV4cGlyZXM7XG4gICAgICAgICAgICBpbWcuc3JjID0gaW1nRGF0YS5kYXRhLmJ5dGVMZW5ndGggPyBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpIDogdHJhbnNwYXJlbnRQbmdVcmw7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cbmV4cG9ydHMuZ2V0VmlkZW8gPSBmdW5jdGlvbih1cmxzICAgICAgICAgICAgICAgLCBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICBjb25zdCB2aWRlbyAgICAgICAgICAgICAgICAgICA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLm9ubG9hZHN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHZpZGVvKTtcbiAgICB9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzICAgICAgICAgICAgICAgICAgICA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzb3VyY2UnKTtcbiAgICAgICAgaWYgKCFzYW1lT3JpZ2luKHVybHNbaV0pKSB7XG4gICAgICAgICAgICB2aWRlby5jcm9zc09yaWdpbiA9ICdBbm9ueW1vdXMnO1xuICAgICAgICB9XG4gICAgICAgIHMuc3JjID0gdXJsc1tpXTtcbiAgICAgICAgdmlkZW8uYXBwZW5kQ2hpbGQocyk7XG4gICAgfVxuICAgIHJldHVybiB2aWRlbztcbn07XG4iLCIvLyAgICAgIFxuXG5jb25zdCB3aW5kb3cgPSByZXF1aXJlKCcuL3dpbmRvdycpO1xuXG5jb25zdCBub3cgPSB3aW5kb3cucGVyZm9ybWFuY2UgJiYgd2luZG93LnBlcmZvcm1hbmNlLm5vdyA/XG4gICAgd2luZG93LnBlcmZvcm1hbmNlLm5vdy5iaW5kKHdpbmRvdy5wZXJmb3JtYW5jZSkgOlxuICAgIERhdGUubm93LmJpbmQoRGF0ZSk7XG5cbmNvbnN0IGZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuXG5jb25zdCBjYW5jZWwgPSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cubW96Q2FuY2VsQW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cud2Via2l0Q2FuY2VsQW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cubXNDYW5jZWxBbmltYXRpb25GcmFtZTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhIGZ1bmN0aW9uIHRoYXQgb3V0cHV0cyBtaWxsaXNlY29uZHM6IGVpdGhlciBwZXJmb3JtYW5jZS5ub3coKVxuICAgICAqIG9yIGEgZmFsbGJhY2sgdG8gRGF0ZS5ub3coKVxuICAgICAqL1xuICAgIG5vdyxcblxuICAgIGZyYW1lKGZuICAgICAgICAgICkge1xuICAgICAgICByZXR1cm4gZnJhbWUoZm4pO1xuICAgIH0sXG5cbiAgICBjYW5jZWxGcmFtZShpZCAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiBjYW5jZWwoaWQpO1xuICAgIH0sXG5cbiAgICBnZXRJbWFnZURhdGEoaW1nICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICB7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGNyZWF0ZSBjYW52YXMgMmQgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IGltZy53aWR0aDtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XG4gICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIGltZy53aWR0aCwgaW1nLmhlaWdodCk7XG4gICAgfSxcblxuICAgIGhhcmR3YXJlQ29uY3VycmVuY3k6IHdpbmRvdy5uYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeSB8fCA0LFxuXG4gICAgZ2V0IGRldmljZVBpeGVsUmF0aW8oKSB7IHJldHVybiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzsgfSxcblxuICAgIHN1cHBvcnRzV2VicDogZmFsc2Vcbn07XG5cbmNvbnN0IHdlYnBJbWdUZXN0ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xud2VicEltZ1Rlc3Qub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMuc3VwcG9ydHNXZWJwID0gdHJ1ZTtcbn07XG53ZWJwSW1nVGVzdC5zcmMgPSAnZGF0YTppbWFnZS93ZWJwO2Jhc2U2NCxVa2xHUmg0QUFBQlhSVUpRVmxBNFRCRUFBQUF2QVFBQUFBZlEvLzczdi8rQmlPaC9BQUE9JztcbiIsIi8vICAgICAgXG5cbmNvbnN0IFdlYldvcmtpZnkgPSByZXF1aXJlKCd3ZWJ3b3JraWZ5Jyk7XG5jb25zdCB3aW5kb3cgPSByZXF1aXJlKCcuLi93aW5kb3cnKTtcbmNvbnN0IHdvcmtlclVSTCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBXZWJXb3JraWZ5KHJlcXVpcmUoJy4uLy4uL3NvdXJjZS93b3JrZXInKSwge2JhcmU6IHRydWV9KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpICAgICAgICAgICAgICAgICAge1xuICAgIHJldHVybiAobmV3IHdpbmRvdy5Xb3JrZXIod29ya2VyVVJMKSAgICAgKTtcbn07XG4iLCIvLyAgICAgIFxuXG4vKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cbm1vZHVsZS5leHBvcnRzID0gKHNlbGYgICAgICAgICk7XG4iLCIvLyAgICAgIFxuXG5jb25zdCBxdWlja3NlbGVjdCA9IHJlcXVpcmUoJ3F1aWNrc2VsZWN0Jyk7XG5jb25zdCBjYWxjdWxhdGVTaWduZWRBcmVhID0gcmVxdWlyZSgnLi91dGlsJykuY2FsY3VsYXRlU2lnbmVkQXJlYTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbi8vIGNsYXNzaWZpZXMgYW4gYXJyYXkgb2YgcmluZ3MgaW50byBwb2x5Z29ucyB3aXRoIG91dGVyIHJpbmdzIGFuZCBob2xlc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjbGFzc2lmeVJpbmdzKHJpbmdzICAgICAgICAgICAgICAgICAgICAgLCBtYXhSaW5ncyAgICAgICAgKSB7XG4gICAgY29uc3QgbGVuID0gcmluZ3MubGVuZ3RoO1xuXG4gICAgaWYgKGxlbiA8PSAxKSByZXR1cm4gW3JpbmdzXTtcblxuICAgIGNvbnN0IHBvbHlnb25zID0gW107XG4gICAgbGV0IHBvbHlnb24sXG4gICAgICAgIGNjdztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgY29uc3QgYXJlYSA9IGNhbGN1bGF0ZVNpZ25lZEFyZWEocmluZ3NbaV0pO1xuICAgICAgICBpZiAoYXJlYSA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgKHJpbmdzW2ldICAgICApLmFyZWEgPSBNYXRoLmFicyhhcmVhKTtcblxuICAgICAgICBpZiAoY2N3ID09PSB1bmRlZmluZWQpIGNjdyA9IGFyZWEgPCAwO1xuXG4gICAgICAgIGlmIChjY3cgPT09IGFyZWEgPCAwKSB7XG4gICAgICAgICAgICBpZiAocG9seWdvbikgcG9seWdvbnMucHVzaChwb2x5Z29uKTtcbiAgICAgICAgICAgIHBvbHlnb24gPSBbcmluZ3NbaV1dO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAocG9seWdvbiAgICAgKS5wdXNoKHJpbmdzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocG9seWdvbikgcG9seWdvbnMucHVzaChwb2x5Z29uKTtcblxuICAgIC8vIEVhcmN1dCBwZXJmb3JtYW5jZSBkZWdyYWdlcyB3aXRoIHRoZSAjIG9mIHJpbmdzIGluIGEgcG9seWdvbi4gRm9yIHRoaXNcbiAgICAvLyByZWFzb24sIHdlIGxpbWl0IHN0cmlwIG91dCBhbGwgYnV0IHRoZSBgbWF4UmluZ3NgIGxhcmdlc3QgcmluZ3MuXG4gICAgaWYgKG1heFJpbmdzID4gMSkge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHBvbHlnb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAocG9seWdvbnNbal0ubGVuZ3RoIDw9IG1heFJpbmdzKSBjb250aW51ZTtcbiAgICAgICAgICAgIHF1aWNrc2VsZWN0KHBvbHlnb25zW2pdLCBtYXhSaW5ncywgMSwgcG9seWdvbnNbal0ubGVuZ3RoIC0gMSwgY29tcGFyZUFyZWFzKTtcbiAgICAgICAgICAgIHBvbHlnb25zW2pdID0gcG9seWdvbnNbal0uc2xpY2UoMCwgbWF4UmluZ3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvbHlnb25zO1xufTtcblxuZnVuY3Rpb24gY29tcGFyZUFyZWFzKGEsIGIpIHtcbiAgICByZXR1cm4gYi5hcmVhIC0gYS5hcmVhO1xufVxuIiwiLy8gICAgICBcblxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgIFxuXG5jb25zdCBjb25maWcgICAgICAgICA9IHtcbiAgICBBUElfVVJMOiAnaHR0cHM6Ly9hcGkubWFwYm94LmNvbScsXG4gICAgUkVRVUlSRV9BQ0NFU1NfVE9LRU46IHRydWUsXG4gICAgQUNDRVNTX1RPS0VOOiBudWxsXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbmZpZztcbiIsIi8vICAgICAgXG5cbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuXG5jbGFzcyBEaWN0aW9uYXJ5Q29kZXIge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3Ioc3RyaW5ncyAgICAgICAgICAgICAgICkge1xuICAgICAgICB0aGlzLl9zdHJpbmdUb051bWJlciA9IHt9O1xuICAgICAgICB0aGlzLl9udW1iZXJUb1N0cmluZyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN0cmluZyA9IHN0cmluZ3NbaV07XG4gICAgICAgICAgICB0aGlzLl9zdHJpbmdUb051bWJlcltzdHJpbmddID0gaTtcbiAgICAgICAgICAgIHRoaXMuX251bWJlclRvU3RyaW5nW2ldID0gc3RyaW5nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW5jb2RlKHN0cmluZyAgICAgICAgKSB7XG4gICAgICAgIGFzc2VydChzdHJpbmcgaW4gdGhpcy5fc3RyaW5nVG9OdW1iZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RyaW5nVG9OdW1iZXJbc3RyaW5nXTtcbiAgICB9XG5cbiAgICBkZWNvZGUobiAgICAgICAgKSB7XG4gICAgICAgIGFzc2VydChuIDwgdGhpcy5fbnVtYmVyVG9TdHJpbmcubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlclRvU3RyaW5nW25dO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBEaWN0aW9uYXJ5Q29kZXI7XG4iLCIvLyAgICAgIFxuXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5jb25zdCBBY3RvciA9IHJlcXVpcmUoJy4vYWN0b3InKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuLyoqXG4gKiBSZXNwb25zaWJsZSBmb3Igc2VuZGluZyBtZXNzYWdlcyBmcm9tIGEge0BsaW5rIFNvdXJjZX0gdG8gYW4gYXNzb2NpYXRlZFxuICoge0BsaW5rIFdvcmtlclNvdXJjZX0uXG4gKlxuICogQGludGVyZmFjZSBEaXNwYXRjaGVyXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBEaXNwYXRjaGVyIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3Rvcih3b3JrZXJQb29sICAgICAgICAgICAgLCBwYXJlbnQgICAgICkge1xuICAgICAgICB0aGlzLndvcmtlclBvb2wgPSB3b3JrZXJQb29sO1xuICAgICAgICB0aGlzLmFjdG9ycyA9IFtdO1xuICAgICAgICB0aGlzLmN1cnJlbnRBY3RvciA9IDA7XG4gICAgICAgIHRoaXMuaWQgPSB1dGlsLnVuaXF1ZUlkKCk7XG4gICAgICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuYWNxdWlyZSh0aGlzLmlkKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3JrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXIgPSB3b3JrZXJzW2ldO1xuICAgICAgICAgICAgY29uc3QgYWN0b3IgPSBuZXcgQWN0b3Iod29ya2VyLCBwYXJlbnQsIHRoaXMuaWQpO1xuICAgICAgICAgICAgYWN0b3IubmFtZSA9IGBXb3JrZXIgJHtpfWA7XG4gICAgICAgICAgICB0aGlzLmFjdG9ycy5wdXNoKGFjdG9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJyb2FkY2FzdCBhIG1lc3NhZ2UgdG8gYWxsIFdvcmtlcnMuXG4gICAgICovXG4gICAgYnJvYWRjYXN0KHR5cGUgICAgICAgICwgZGF0YSAgICAgICAsIGNiICAgICAgICAgICApIHtcbiAgICAgICAgY2IgPSBjYiB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgICAgICAgdXRpbC5hc3luY0FsbCh0aGlzLmFjdG9ycywgKGFjdG9yLCBkb25lKSA9PiB7XG4gICAgICAgICAgICBhY3Rvci5zZW5kKHR5cGUsIGRhdGEsIGRvbmUpO1xuICAgICAgICB9LCBjYik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZCBhIG1lc3NhZ2UgdG8gYSBXb3JrZXIuXG4gICAgICogQHBhcmFtIHRhcmdldElEIFRoZSBJRCBvZiB0aGUgV29ya2VyIHRvIHdoaWNoIHRvIHNlbmQgdGhpcyBtZXNzYWdlLiBPbWl0IHRvIGFsbG93IHRoZSBkaXNwYXRjaGVyIHRvIGNob29zZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgSUQgb2YgdGhlIHdvcmtlciB0byB3aGljaCB0aGUgbWVzc2FnZSB3YXMgc2VudC5cbiAgICAgKi9cbiAgICBzZW5kKHR5cGUgICAgICAgICwgZGF0YSAgICAgICAsIGNhbGxiYWNrICAgICAgICAgICAgLCB0YXJnZXRJRCAgICAgICAgICkgICAgICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0SUQgIT09ICdudW1iZXInIHx8IGlzTmFOKHRhcmdldElEKSkge1xuICAgICAgICAgICAgLy8gVXNlIHJvdW5kIHJvYmluIHRvIHNlbmQgcmVxdWVzdHMgdG8gd2ViIHdvcmtlcnMuXG4gICAgICAgICAgICB0YXJnZXRJRCA9IHRoaXMuY3VycmVudEFjdG9yID0gKHRoaXMuY3VycmVudEFjdG9yICsgMSkgJSB0aGlzLmFjdG9ycy5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFjdG9yc1t0YXJnZXRJRF0uc2VuZCh0eXBlLCBkYXRhLCBjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiB0YXJnZXRJRDtcbiAgICB9XG5cbiAgICByZW1vdmUoKSB7XG4gICAgICAgIHRoaXMuYWN0b3JzLmZvckVhY2goKGFjdG9yKSA9PiB7IGFjdG9yLnJlbW92ZSgpOyB9KTtcbiAgICAgICAgdGhpcy5hY3RvcnMgPSBbXTtcbiAgICAgICAgdGhpcy53b3JrZXJQb29sLnJlbGVhc2UodGhpcy5pZCk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERpc3BhdGNoZXI7XG4iLCIvLyAgICAgIFxuXG5jb25zdCBQb2ludCA9IHJlcXVpcmUoJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknKTtcbmNvbnN0IHdpbmRvdyA9IHJlcXVpcmUoJy4vd2luZG93Jyk7XG5cbmV4cG9ydHMuY3JlYXRlID0gZnVuY3Rpb24gKHRhZ05hbWUgICAsIGNsYXNzTmFtZSAgICAgICAgICwgY29udGFpbmVyICAgICAgICAgICAgICApIHtcbiAgICBjb25zdCBlbCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICAgIGlmIChjbGFzc05hbWUpIGVsLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICBpZiAoY29udGFpbmVyKSBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIHJldHVybiBlbDtcbn07XG5cbmV4cG9ydHMuY3JlYXRlTlMgPSBmdW5jdGlvbiAobmFtZXNwYWNlVVJJICAgICAgICAsIHRhZ05hbWUgICAgICAgICkge1xuICAgIGNvbnN0IGVsID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIHRhZ05hbWUpO1xuICAgIHJldHVybiBlbDtcbn07XG5cbmNvbnN0IGRvY1N0eWxlID0gKHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgICAgICkuc3R5bGU7XG5cbmZ1bmN0aW9uIHRlc3RQcm9wKHByb3BzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocHJvcHNbaV0gaW4gZG9jU3R5bGUpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wc1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcHNbMF07XG59XG5cbmNvbnN0IHNlbGVjdFByb3AgPSB0ZXN0UHJvcChbJ3VzZXJTZWxlY3QnLCAnTW96VXNlclNlbGVjdCcsICdXZWJraXRVc2VyU2VsZWN0JywgJ21zVXNlclNlbGVjdCddKTtcbmxldCB1c2VyU2VsZWN0O1xuZXhwb3J0cy5kaXNhYmxlRHJhZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2VsZWN0UHJvcCkge1xuICAgICAgICB1c2VyU2VsZWN0ID0gZG9jU3R5bGVbc2VsZWN0UHJvcF07XG4gICAgICAgIGRvY1N0eWxlW3NlbGVjdFByb3BdID0gJ25vbmUnO1xuICAgIH1cbn07XG5leHBvcnRzLmVuYWJsZURyYWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNlbGVjdFByb3ApIHtcbiAgICAgICAgZG9jU3R5bGVbc2VsZWN0UHJvcF0gPSB1c2VyU2VsZWN0O1xuICAgIH1cbn07XG5cbmNvbnN0IHRyYW5zZm9ybVByb3AgPSB0ZXN0UHJvcChbJ3RyYW5zZm9ybScsICdXZWJraXRUcmFuc2Zvcm0nXSk7XG5leHBvcnRzLnNldFRyYW5zZm9ybSA9IGZ1bmN0aW9uKGVsICAgICAgICAgICAgICwgdmFsdWUgICAgICAgICkge1xuICAgIChlbC5zdHlsZSAgICAgKVt0cmFuc2Zvcm1Qcm9wXSA9IHZhbHVlO1xufTtcblxuLy8gU3VwcHJlc3MgdGhlIG5leHQgY2xpY2ssIGJ1dCBvbmx5IGlmIGl0J3MgaW1tZWRpYXRlLlxuY29uc3Qgc3VwcHJlc3NDbGljayAgICAgICAgICAgICAgICAgICAgID0gZnVuY3Rpb24gKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdXBwcmVzc0NsaWNrLCB0cnVlKTtcbn07XG5cbmV4cG9ydHMuc3VwcHJlc3NDbGljayA9IGZ1bmN0aW9uKCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHN1cHByZXNzQ2xpY2ssIHRydWUpO1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VwcHJlc3NDbGljaywgdHJ1ZSk7XG4gICAgfSwgMCk7XG59O1xuXG5leHBvcnRzLm1vdXNlUG9zID0gZnVuY3Rpb24gKGVsICAgICAgICAgICAgICwgZSAgICAgKSB7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGUgPSBlLnRvdWNoZXMgPyBlLnRvdWNoZXNbMF0gOiBlO1xuICAgIHJldHVybiBuZXcgUG9pbnQoXG4gICAgICAgIGUuY2xpZW50WCAtIHJlY3QubGVmdCAtIGVsLmNsaWVudExlZnQsXG4gICAgICAgIGUuY2xpZW50WSAtIHJlY3QudG9wIC0gZWwuY2xpZW50VG9wXG4gICAgKTtcbn07XG5cbmV4cG9ydHMudG91Y2hQb3MgPSBmdW5jdGlvbiAoZWwgICAgICAgICAgICAgLCBlICAgICApIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgIHBvaW50cyA9IFtdO1xuICAgIGNvbnN0IHRvdWNoZXMgPSAoZS50eXBlID09PSAndG91Y2hlbmQnKSA/IGUuY2hhbmdlZFRvdWNoZXMgOiBlLnRvdWNoZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHBvaW50cy5wdXNoKG5ldyBQb2ludChcbiAgICAgICAgICAgIHRvdWNoZXNbaV0uY2xpZW50WCAtIHJlY3QubGVmdCAtIGVsLmNsaWVudExlZnQsXG4gICAgICAgICAgICB0b3VjaGVzW2ldLmNsaWVudFkgLSByZWN0LnRvcCAtIGVsLmNsaWVudFRvcFxuICAgICAgICApKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvaW50cztcbn07XG5cbmV4cG9ydHMucmVtb3ZlID0gZnVuY3Rpb24obm9kZSAgICAgICAgICAgICApIHtcbiAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9XG59O1xuIiwiLy8gICAgICBcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuZnVuY3Rpb24gX2FkZEV2ZW50TGlzdGVuZXIodHlwZSAgICAgICAgLCBsaXN0ZW5lciAgICAgICAgICAsIGxpc3RlbmVyTGlzdCAgICAgICAgICAgKSB7XG4gICAgbGlzdGVuZXJMaXN0W3R5cGVdID0gbGlzdGVuZXJMaXN0W3R5cGVdIHx8IFtdO1xuICAgIGxpc3RlbmVyTGlzdFt0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbn1cblxuZnVuY3Rpb24gX3JlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSAgICAgICAgLCBsaXN0ZW5lciAgICAgICAgICAsIGxpc3RlbmVyTGlzdCAgICAgICAgICAgKSB7XG4gICAgaWYgKGxpc3RlbmVyTGlzdCAmJiBsaXN0ZW5lckxpc3RbdHlwZV0pIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBsaXN0ZW5lckxpc3RbdHlwZV0uaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGxpc3RlbmVyTGlzdFt0eXBlXS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIE1ldGhvZHMgbWl4ZWQgaW4gdG8gb3RoZXIgY2xhc3NlcyBmb3IgZXZlbnQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBtaXhpbiBFdmVudGVkXG4gKi9cbmNsYXNzIEV2ZW50ZWQge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0byBhIHNwZWNpZmllZCBldmVudCB0eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUgdG8gYWRkIGEgbGlzdGVuIGZvci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIGZpcmVkLlxuICAgICAqICAgVGhlIGxpc3RlbmVyIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBkYXRhIG9iamVjdCBwYXNzZWQgdG8gYGZpcmVgLFxuICAgICAqICAgZXh0ZW5kZWQgd2l0aCBgdGFyZ2V0YCBhbmQgYHR5cGVgIHByb3BlcnRpZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gYHRoaXNgXG4gICAgICovXG4gICAgb24odHlwZSAgICwgbGlzdGVuZXIgICAgICAgICAgKSAgICAgICB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycyB8fCB7fTtcbiAgICAgICAgX2FkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHRoaXMuX2xpc3RlbmVycyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBldmVudCBsaXN0ZW5lci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlIHRvIHJlbW92ZSBsaXN0ZW5lcnMgZm9yLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gYHRoaXNgXG4gICAgICovXG4gICAgb2ZmKHR5cGUgICAsIGxpc3RlbmVyICAgICAgICAgICkge1xuICAgICAgICBfcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdGhpcy5fbGlzdGVuZXJzKTtcbiAgICAgICAgX3JlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZSB0byBhIHNwZWNpZmllZCBldmVudCB0eXBlLlxuICAgICAqXG4gICAgICogVGhlIGxpc3RlbmVyIHdpbGwgYmUgY2FsbGVkIGZpcnN0IHRpbWUgdGhlIGV2ZW50IGZpcmVzIGFmdGVyIHRoZSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUgdG8gbGlzdGVuIGZvci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIGZpcmVkIHRoZSBmaXJzdCB0aW1lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IGB0aGlzYFxuICAgICAqL1xuICAgIG9uY2UodHlwZSAgICAgICAgLCBsaXN0ZW5lciAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5fb25lVGltZUxpc3RlbmVycyA9IHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMgfHwge307XG4gICAgICAgIF9hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaXJlcyBhbiBldmVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgdHlwZSBvZiBldmVudCB0byBmaXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YV0gRGF0YSB0byBiZSBwYXNzZWQgdG8gYW55IGxpc3RlbmVycy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBgdGhpc2BcbiAgICAgKi9cbiAgICBmaXJlKHR5cGUgICAgICAgICwgZGF0YSAgICAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5saXN0ZW5zKHR5cGUpKSB7XG4gICAgICAgICAgICBkYXRhID0gdXRpbC5leHRlbmQoe30sIGRhdGEsIHt0eXBlOiB0eXBlLCB0YXJnZXQ6IHRoaXN9KTtcblxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGFkZGluZyBvciByZW1vdmluZyBsaXN0ZW5lcnMgaW5zaWRlIG90aGVyIGxpc3RlbmVycyB3b24ndCBjYXVzZSBhbiBpbmZpbml0ZSBsb29wXG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnMgJiYgdGhpcy5fbGlzdGVuZXJzW3R5cGVdID8gdGhpcy5fbGlzdGVuZXJzW3R5cGVdLnNsaWNlKCkgOiBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBkYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgb25lVGltZUxpc3RlbmVycyA9IHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMgJiYgdGhpcy5fb25lVGltZUxpc3RlbmVyc1t0eXBlXSA/IHRoaXMuX29uZVRpbWVMaXN0ZW5lcnNbdHlwZV0uc2xpY2UoKSA6IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBvbmVUaW1lTGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgX3JlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMpO1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9ldmVudGVkUGFyZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRlZFBhcmVudC5maXJlKHR5cGUsIHV0aWwuZXh0ZW5kKHt9LCBkYXRhLCB0eXBlb2YgdGhpcy5fZXZlbnRlZFBhcmVudERhdGEgPT09ICdmdW5jdGlvbicgPyB0aGlzLl9ldmVudGVkUGFyZW50RGF0YSgpIDogdGhpcy5fZXZlbnRlZFBhcmVudERhdGEpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAvLyBUbyBlbnN1cmUgdGhhdCBubyBlcnJvciBldmVudHMgYXJlIGRyb3BwZWQsIHByaW50IHRoZW0gdG8gdGhlXG4gICAgICAgIC8vIGNvbnNvbGUgaWYgdGhleSBoYXZlIG5vIGxpc3RlbmVycy5cbiAgICAgICAgfSBlbHNlIGlmICh1dGlsLmVuZHNXaXRoKHR5cGUsICdlcnJvcicpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKChkYXRhICYmIGRhdGEuZXJyb3IpIHx8IGRhdGEgfHwgJ0VtcHR5IGVycm9yIGV2ZW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgdHJ1ZSBpZiB0aGlzIGluc3RhbmNlIG9mIEV2ZW50ZWQgb3IgYW55IGZvcndhcmRlZWQgaW5zdGFuY2VzIG9mIEV2ZW50ZWQgaGF2ZSBhIGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHJlZ2lzdGVyZWQgbGlzdGVuZXIgZm9yIHNwZWNpZmllZCBldmVudCB0eXBlLCBgZmFsc2VgIG90aGVyd2lzZVxuICAgICAqL1xuICAgIGxpc3RlbnModHlwZSAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAodGhpcy5fbGlzdGVuZXJzICYmIHRoaXMuX2xpc3RlbmVyc1t0eXBlXSAmJiB0aGlzLl9saXN0ZW5lcnNbdHlwZV0ubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICh0aGlzLl9vbmVUaW1lTGlzdGVuZXJzICYmIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnNbdHlwZV0gJiYgdGhpcy5fb25lVGltZUxpc3RlbmVyc1t0eXBlXS5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgKHRoaXMuX2V2ZW50ZWRQYXJlbnQgJiYgdGhpcy5fZXZlbnRlZFBhcmVudC5saXN0ZW5zKHR5cGUpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1YmJsZSBhbGwgZXZlbnRzIGZpcmVkIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgRXZlbnRlZCB0byB0aGlzIHBhcmVudCBpbnN0YW5jZSBvZiBFdmVudGVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRFdmVudGVkUGFyZW50KHBhcmVudCAgICAgICAgICAsIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5fZXZlbnRlZFBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5fZXZlbnRlZFBhcmVudERhdGEgPSBkYXRhO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBFdmVudGVkO1xuIiwiLy8gICAgICBcblxuY29uc3QgUXVldWUgPSByZXF1aXJlKCd0aW55cXVldWUnKTtcbmNvbnN0IFBvaW50ID0gcmVxdWlyZSgnQG1hcGJveC9wb2ludC1nZW9tZXRyeScpO1xuY29uc3QgZGlzdFRvU2VnbWVudFNxdWFyZWQgPSByZXF1aXJlKCcuL2ludGVyc2VjdGlvbl90ZXN0cycpLmRpc3RUb1NlZ21lbnRTcXVhcmVkO1xuXG4vKipcbiAqIEZpbmRzIGFuIGFwcHJveGltYXRpb24gb2YgYSBwb2x5Z29uJ3MgUG9sZSBPZiBJbmFjY2Vzc2liaWxpeSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Qb2xlX29mX2luYWNjZXNzaWJpbGl0eVxuICogVGhpcyBpcyBhIGNvcHkgb2YgaHR0cDovL2dpdGh1Yi5jb20vbWFwYm94L3BvbHlsYWJlbCBhZGFwdGVkIHRvIHVzZSBQb2ludHNcbiAqXG4gKiBAcGFyYW0gcG9seWdvblJpbmdzIGZpcnN0IGl0ZW0gaW4gYXJyYXkgaXMgdGhlIG91dGVyIHJpbmcgZm9sbG93ZWQgb3B0aW9uYWxseSBieSB0aGUgbGlzdCBvZiBob2xlcywgc2hvdWxkIGJlIGFuIGVsZW1lbnQgb2YgdGhlIHJlc3VsdCBvZiB1dGlsL2NsYXNzaWZ5X3JpbmdzXG4gKiBAcGFyYW0gcHJlY2lzaW9uIFNwZWNpZmllZCBpbiBpbnB1dCBjb29yZGluYXRlIHVuaXRzLiBJZiAwIHJldHVybnMgYWZ0ZXIgZmlyc3QgcnVuLCBpZiA+IDAgcmVwZWF0ZWRseSBuYXJyb3dzIHRoZSBzZWFyY2ggc3BhY2UgdW50aWwgdGhlIHJhZGl1cyBvZiB0aGUgYXJlYSBzZWFyY2hlZCBmb3IgdGhlIGJlc3QgcG9sZSBpcyBsZXNzIHRoYW4gcHJlY2lzaW9uXG4gKiBAcGFyYW0gZGVidWcgUHJpbnQgc29tZSBzdGF0aXN0aWNzIHRvIHRoZSBjb25zb2xlIGR1cmluZyBleGVjdXRpb25cbiAqIEByZXR1cm5zIFBvbGUgb2YgSW5hY2Nlc3NpYmlsaXkuXG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwb2x5Z29uUmluZ3MgICAgICAgICAgICAgICAgICAgICAsIHByZWNpc2lvbiAgICAgICAgICA9IDEsIGRlYnVnICAgICAgICAgICA9IGZhbHNlKSAgICAgICAge1xuICAgIC8vIGZpbmQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgb3V0ZXIgcmluZ1xuICAgIGxldCBtaW5YID0gSW5maW5pdHksIG1pblkgPSBJbmZpbml0eSwgbWF4WCA9IC1JbmZpbml0eSwgbWF4WSA9IC1JbmZpbml0eTtcbiAgICBjb25zdCBvdXRlclJpbmcgPSBwb2x5Z29uUmluZ3NbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRlclJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcCA9IG91dGVyUmluZ1tpXTtcbiAgICAgICAgaWYgKCFpIHx8IHAueCA8IG1pblgpIG1pblggPSBwLng7XG4gICAgICAgIGlmICghaSB8fCBwLnkgPCBtaW5ZKSBtaW5ZID0gcC55O1xuICAgICAgICBpZiAoIWkgfHwgcC54ID4gbWF4WCkgbWF4WCA9IHAueDtcbiAgICAgICAgaWYgKCFpIHx8IHAueSA+IG1heFkpIG1heFkgPSBwLnk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGggPSBtYXhYIC0gbWluWDtcbiAgICBjb25zdCBoZWlnaHQgPSBtYXhZIC0gbWluWTtcbiAgICBjb25zdCBjZWxsU2l6ZSA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpO1xuICAgIGxldCBoID0gY2VsbFNpemUgLyAyO1xuXG4gICAgLy8gYSBwcmlvcml0eSBxdWV1ZSBvZiBjZWxscyBpbiBvcmRlciBvZiB0aGVpciBcInBvdGVudGlhbFwiIChtYXggZGlzdGFuY2UgdG8gcG9seWdvbilcbiAgICBjb25zdCBjZWxsUXVldWUgPSBuZXcgUXVldWUobnVsbCwgY29tcGFyZU1heCk7XG5cbiAgICBpZiAoY2VsbFNpemUgPT09IDApIHJldHVybiBuZXcgUG9pbnQobWluWCwgbWluWSk7XG5cbiAgICAvLyBjb3ZlciBwb2x5Z29uIHdpdGggaW5pdGlhbCBjZWxsc1xuICAgIGZvciAobGV0IHggPSBtaW5YOyB4IDwgbWF4WDsgeCArPSBjZWxsU2l6ZSkge1xuICAgICAgICBmb3IgKGxldCB5ID0gbWluWTsgeSA8IG1heFk7IHkgKz0gY2VsbFNpemUpIHtcbiAgICAgICAgICAgIGNlbGxRdWV1ZS5wdXNoKG5ldyBDZWxsKHggKyBoLCB5ICsgaCwgaCwgcG9seWdvblJpbmdzKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0YWtlIGNlbnRyb2lkIGFzIHRoZSBmaXJzdCBiZXN0IGd1ZXNzXG4gICAgbGV0IGJlc3RDZWxsID0gZ2V0Q2VudHJvaWRDZWxsKHBvbHlnb25SaW5ncyk7XG4gICAgbGV0IG51bVByb2JlcyA9IGNlbGxRdWV1ZS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoY2VsbFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAvLyBwaWNrIHRoZSBtb3N0IHByb21pc2luZyBjZWxsIGZyb20gdGhlIHF1ZXVlXG4gICAgICAgIGNvbnN0IGNlbGwgPSBjZWxsUXVldWUucG9wKCk7XG5cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBiZXN0IGNlbGwgaWYgd2UgZm91bmQgYSBiZXR0ZXIgb25lXG4gICAgICAgIGlmIChjZWxsLmQgPiBiZXN0Q2VsbC5kIHx8ICFiZXN0Q2VsbC5kKSB7XG4gICAgICAgICAgICBiZXN0Q2VsbCA9IGNlbGw7XG4gICAgICAgICAgICBpZiAoZGVidWcpIGNvbnNvbGUubG9nKCdmb3VuZCBiZXN0ICVkIGFmdGVyICVkIHByb2JlcycsIE1hdGgucm91bmQoMWU0ICogY2VsbC5kKSAvIDFlNCwgbnVtUHJvYmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRvIG5vdCBkcmlsbCBkb3duIGZ1cnRoZXIgaWYgdGhlcmUncyBubyBjaGFuY2Ugb2YgYSBiZXR0ZXIgc29sdXRpb25cbiAgICAgICAgaWYgKGNlbGwubWF4IC0gYmVzdENlbGwuZCA8PSBwcmVjaXNpb24pIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIHNwbGl0IHRoZSBjZWxsIGludG8gZm91ciBjZWxsc1xuICAgICAgICBoID0gY2VsbC5oIC8gMjtcbiAgICAgICAgY2VsbFF1ZXVlLnB1c2gobmV3IENlbGwoY2VsbC5wLnggLSBoLCBjZWxsLnAueSAtIGgsIGgsIHBvbHlnb25SaW5ncykpO1xuICAgICAgICBjZWxsUXVldWUucHVzaChuZXcgQ2VsbChjZWxsLnAueCArIGgsIGNlbGwucC55IC0gaCwgaCwgcG9seWdvblJpbmdzKSk7XG4gICAgICAgIGNlbGxRdWV1ZS5wdXNoKG5ldyBDZWxsKGNlbGwucC54IC0gaCwgY2VsbC5wLnkgKyBoLCBoLCBwb2x5Z29uUmluZ3MpKTtcbiAgICAgICAgY2VsbFF1ZXVlLnB1c2gobmV3IENlbGwoY2VsbC5wLnggKyBoLCBjZWxsLnAueSArIGgsIGgsIHBvbHlnb25SaW5ncykpO1xuICAgICAgICBudW1Qcm9iZXMgKz0gNDtcbiAgICB9XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgY29uc29sZS5sb2coYG51bSBwcm9iZXM6ICR7bnVtUHJvYmVzfWApO1xuICAgICAgICBjb25zb2xlLmxvZyhgYmVzdCBkaXN0YW5jZTogJHtiZXN0Q2VsbC5kfWApO1xuICAgIH1cblxuICAgIHJldHVybiBiZXN0Q2VsbC5wO1xufTtcblxuZnVuY3Rpb24gY29tcGFyZU1heChhLCBiKSB7XG4gICAgcmV0dXJuIGIubWF4IC0gYS5tYXg7XG59XG5cbmZ1bmN0aW9uIENlbGwoeCwgeSwgaCwgcG9seWdvbikge1xuICAgIHRoaXMucCA9IG5ldyBQb2ludCh4LCB5KTtcbiAgICB0aGlzLmggPSBoOyAvLyBoYWxmIHRoZSBjZWxsIHNpemVcbiAgICB0aGlzLmQgPSBwb2ludFRvUG9seWdvbkRpc3QodGhpcy5wLCBwb2x5Z29uKTsgLy8gZGlzdGFuY2UgZnJvbSBjZWxsIGNlbnRlciB0byBwb2x5Z29uXG4gICAgdGhpcy5tYXggPSB0aGlzLmQgKyB0aGlzLmggKiBNYXRoLlNRUlQyOyAvLyBtYXggZGlzdGFuY2UgdG8gcG9seWdvbiB3aXRoaW4gYSBjZWxsXG59XG5cbi8vIHNpZ25lZCBkaXN0YW5jZSBmcm9tIHBvaW50IHRvIHBvbHlnb24gb3V0bGluZSAobmVnYXRpdmUgaWYgcG9pbnQgaXMgb3V0c2lkZSlcbmZ1bmN0aW9uIHBvaW50VG9Qb2x5Z29uRGlzdChwLCBwb2x5Z29uKSB7XG4gICAgbGV0IGluc2lkZSA9IGZhbHNlO1xuICAgIGxldCBtaW5EaXN0U3EgPSBJbmZpbml0eTtcblxuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcG9seWdvbi5sZW5ndGg7IGsrKykge1xuICAgICAgICBjb25zdCByaW5nID0gcG9seWdvbltrXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcmluZy5sZW5ndGgsIGogPSBsZW4gLSAxOyBpIDwgbGVuOyBqID0gaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBhID0gcmluZ1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSByaW5nW2pdO1xuXG4gICAgICAgICAgICBpZiAoKGEueSA+IHAueSAhPT0gYi55ID4gcC55KSAmJlxuICAgICAgICAgICAgICAgIChwLnggPCAoYi54IC0gYS54KSAqIChwLnkgLSBhLnkpIC8gKGIueSAtIGEueSkgKyBhLngpKSBpbnNpZGUgPSAhaW5zaWRlO1xuXG4gICAgICAgICAgICBtaW5EaXN0U3EgPSBNYXRoLm1pbihtaW5EaXN0U3EsIGRpc3RUb1NlZ21lbnRTcXVhcmVkKHAsIGEsIGIpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoaW5zaWRlID8gMSA6IC0xKSAqIE1hdGguc3FydChtaW5EaXN0U3EpO1xufVxuXG4vLyBnZXQgcG9seWdvbiBjZW50cm9pZFxuZnVuY3Rpb24gZ2V0Q2VudHJvaWRDZWxsKHBvbHlnb24pIHtcbiAgICBsZXQgYXJlYSA9IDA7XG4gICAgbGV0IHggPSAwO1xuICAgIGxldCB5ID0gMDtcbiAgICBjb25zdCBwb2ludHMgPSBwb2x5Z29uWzBdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBwb2ludHMubGVuZ3RoLCBqID0gbGVuIC0gMTsgaSA8IGxlbjsgaiA9IGkrKykge1xuICAgICAgICBjb25zdCBhID0gcG9pbnRzW2ldO1xuICAgICAgICBjb25zdCBiID0gcG9pbnRzW2pdO1xuICAgICAgICBjb25zdCBmID0gYS54ICogYi55IC0gYi54ICogYS55O1xuICAgICAgICB4ICs9IChhLnggKyBiLngpICogZjtcbiAgICAgICAgeSArPSAoYS55ICsgYi55KSAqIGY7XG4gICAgICAgIGFyZWEgKz0gZiAqIDM7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQ2VsbCh4IC8gYXJlYSwgeSAvIGFyZWEsIDAsIHBvbHlnb24pO1xufVxuIiwiLy8gICAgICBcblxuY29uc3QgV29ya2VyUG9vbCA9IHJlcXVpcmUoJy4vd29ya2VyX3Bvb2wnKTtcblxubGV0IGdsb2JhbFdvcmtlclBvb2w7XG5cbi8qKlxuICogQ3JlYXRlcyAoaWYgbmVjZXNzYXJ5KSBhbmQgcmV0dXJucyB0aGUgc2luZ2xlLCBnbG9iYWwgV29ya2VyUG9vbCBpbnN0YW5jZVxuICogdG8gYmUgc2hhcmVkIGFjcm9zcyBlYWNoIE1hcFxuICogQHByaXZhdGVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRHbG9iYWxXb3JrZXJQb29sICgpIHtcbiAgICBpZiAoIWdsb2JhbFdvcmtlclBvb2wpIHtcbiAgICAgICAgZ2xvYmFsV29ya2VyUG9vbCA9IG5ldyBXb3JrZXJQb29sKCk7XG4gICAgfVxuICAgIHJldHVybiBnbG9iYWxXb3JrZXJQb29sO1xufTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuY29uc3Qge3JlZ2lzdGVyfSA9IHJlcXVpcmUoJy4vd2ViX3dvcmtlcl90cmFuc2ZlcicpO1xuXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgXG5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgIFxuICBcblxuZnVuY3Rpb24gY3JlYXRlSW1hZ2UoaW1hZ2UgICAsIHt3aWR0aCwgaGVpZ2h0fSAgICAgICwgY2hhbm5lbHMgICAgICAgICwgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgICBkYXRhID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWlnaHQgKiBjaGFubmVscyk7XG4gICAgfSBlbHNlIGlmIChkYXRhLmxlbmd0aCAhPT0gd2lkdGggKiBoZWlnaHQgKiBjaGFubmVscykge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignbWlzbWF0Y2hlZCBpbWFnZSBzaXplJyk7XG4gICAgfVxuICAgIGltYWdlLndpZHRoID0gd2lkdGg7XG4gICAgaW1hZ2UuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGltYWdlLmRhdGEgPSBkYXRhO1xuICAgIHJldHVybiBpbWFnZTtcbn1cblxuZnVuY3Rpb24gcmVzaXplSW1hZ2UoaW1hZ2UgICAsIHt3aWR0aCwgaGVpZ2h0fSAgICAgICwgY2hhbm5lbHMgICAgICAgICkge1xuICAgIGlmICh3aWR0aCA9PT0gaW1hZ2Uud2lkdGggJiYgaGVpZ2h0ID09PSBpbWFnZS5oZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0ltYWdlID0gY3JlYXRlSW1hZ2Uoe30sIHt3aWR0aCwgaGVpZ2h0fSwgY2hhbm5lbHMpO1xuXG4gICAgY29weUltYWdlKGltYWdlLCBuZXdJbWFnZSwge3g6IDAsIHk6IDB9LCB7eDogMCwgeTogMH0sIHtcbiAgICAgICAgd2lkdGg6IE1hdGgubWluKGltYWdlLndpZHRoLCB3aWR0aCksXG4gICAgICAgIGhlaWdodDogTWF0aC5taW4oaW1hZ2UuaGVpZ2h0LCBoZWlnaHQpXG4gICAgfSwgY2hhbm5lbHMpO1xuXG4gICAgaW1hZ2Uud2lkdGggPSB3aWR0aDtcbiAgICBpbWFnZS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgaW1hZ2UuZGF0YSA9IG5ld0ltYWdlLmRhdGE7XG59XG5cbmZ1bmN0aW9uIGNvcHlJbWFnZShzcmNJbWcgICAsIGRzdEltZyAgICwgc3JjUHQgICAgICAgLCBkc3RQdCAgICAgICAsIHNpemUgICAgICAsIGNoYW5uZWxzICAgICAgICApIHtcbiAgICBpZiAoc2l6ZS53aWR0aCA9PT0gMCB8fCBzaXplLmhlaWdodCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZHN0SW1nO1xuICAgIH1cblxuICAgIGlmIChzaXplLndpZHRoID4gc3JjSW1nLndpZHRoIHx8XG4gICAgICAgIHNpemUuaGVpZ2h0ID4gc3JjSW1nLmhlaWdodCB8fFxuICAgICAgICBzcmNQdC54ID4gc3JjSW1nLndpZHRoIC0gc2l6ZS53aWR0aCB8fFxuICAgICAgICBzcmNQdC55ID4gc3JjSW1nLmhlaWdodCAtIHNpemUuaGVpZ2h0KSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2Ugc291cmNlIGNvb3JkaW5hdGVzIGZvciBpbWFnZSBjb3B5Jyk7XG4gICAgfVxuXG4gICAgaWYgKHNpemUud2lkdGggPiBkc3RJbWcud2lkdGggfHxcbiAgICAgICAgc2l6ZS5oZWlnaHQgPiBkc3RJbWcuaGVpZ2h0IHx8XG4gICAgICAgIGRzdFB0LnggPiBkc3RJbWcud2lkdGggLSBzaXplLndpZHRoIHx8XG4gICAgICAgIGRzdFB0LnkgPiBkc3RJbWcuaGVpZ2h0IC0gc2l6ZS5oZWlnaHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBkZXN0aW5hdGlvbiBjb29yZGluYXRlcyBmb3IgaW1hZ2UgY29weScpO1xuICAgIH1cblxuICAgIGNvbnN0IHNyY0RhdGEgPSBzcmNJbWcuZGF0YTtcbiAgICBjb25zdCBkc3REYXRhID0gZHN0SW1nLmRhdGE7XG5cbiAgICBhc3NlcnQoc3JjRGF0YSAhPT0gZHN0RGF0YSk7XG5cbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHNpemUuaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgY29uc3Qgc3JjT2Zmc2V0ID0gKChzcmNQdC55ICsgeSkgKiBzcmNJbWcud2lkdGggKyBzcmNQdC54KSAqIGNoYW5uZWxzO1xuICAgICAgICBjb25zdCBkc3RPZmZzZXQgPSAoKGRzdFB0LnkgKyB5KSAqIGRzdEltZy53aWR0aCArIGRzdFB0LngpICogY2hhbm5lbHM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZS53aWR0aCAqIGNoYW5uZWxzOyBpKyspIHtcbiAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0ICsgaV0gPSBzcmNEYXRhW3NyY09mZnNldCArIGldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRzdEltZztcbn1cblxuY2xhc3MgQWxwaGFJbWFnZSB7XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICBjb25zdHJ1Y3RvcihzaXplICAgICAgLCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGNyZWF0ZUltYWdlKHRoaXMsIHNpemUsIDEsIGRhdGEpO1xuICAgIH1cblxuICAgIHJlc2l6ZShzaXplICAgICAgKSB7XG4gICAgICAgIHJlc2l6ZUltYWdlKHRoaXMsIHNpemUsIDEpO1xuICAgIH1cblxuICAgIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFscGhhSW1hZ2Uoe3dpZHRoOiB0aGlzLndpZHRoLCBoZWlnaHQ6IHRoaXMuaGVpZ2h0fSwgbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhKSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNvcHkoc3JjSW1nICAgICAgICAgICAgLCBkc3RJbWcgICAgICAgICAgICAsIHNyY1B0ICAgICAgICwgZHN0UHQgICAgICAgLCBzaXplICAgICAgKSB7XG4gICAgICAgIGNvcHlJbWFnZShzcmNJbWcsIGRzdEltZywgc3JjUHQsIGRzdFB0LCBzaXplLCAxKTtcbiAgICB9XG59XG5cbi8vIE5vdCBwcmVtdWx0aXBsaWVkLCBiZWNhdXNlIEltYWdlRGF0YSBpcyBub3QgcHJlbXVsdGlwbGllZC5cbi8vIFVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCBtdXN0IGJlIHVzZWQgd2hlbiB1cGxvYWRpbmcgdG8gYSB0ZXh0dXJlLlxuY2xhc3MgUkdCQUltYWdlIHtcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKHNpemUgICAgICAsIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgY3JlYXRlSW1hZ2UodGhpcywgc2l6ZSwgNCwgZGF0YSk7XG4gICAgfVxuXG4gICAgcmVzaXplKHNpemUgICAgICApIHtcbiAgICAgICAgcmVzaXplSW1hZ2UodGhpcywgc2l6ZSwgNCk7XG4gICAgfVxuXG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUkdCQUltYWdlKHt3aWR0aDogdGhpcy53aWR0aCwgaGVpZ2h0OiB0aGlzLmhlaWdodH0sIG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YSkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBjb3B5KHNyY0ltZyAgICAgICAgICAgICAgICAgICAgICAgLCBkc3RJbWcgICAgICAgICAgICwgc3JjUHQgICAgICAgLCBkc3RQdCAgICAgICAsIHNpemUgICAgICApIHtcbiAgICAgICAgY29weUltYWdlKHNyY0ltZywgZHN0SW1nLCBzcmNQdCwgZHN0UHQsIHNpemUsIDQpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0FscGhhSW1hZ2UnLCBBbHBoYUltYWdlKTtcbnJlZ2lzdGVyKCdSR0JBSW1hZ2UnLCBSR0JBSW1hZ2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBBbHBoYUltYWdlLFxuICAgIFJHQkFJbWFnZVxufTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IHtpc0NvdW50ZXJDbG9ja3dpc2V9ID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBtdWx0aVBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRNdWx0aVBvaW50LFxuICAgIG11bHRpUG9seWdvbkludGVyc2VjdHNNdWx0aVBvbHlnb24sXG4gICAgbXVsdGlQb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkTXVsdGlMaW5lLFxuICAgIHBvbHlnb25JbnRlcnNlY3RzUG9seWdvbixcbiAgICBkaXN0VG9TZWdtZW50U3F1YXJlZFxufTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmZ1bmN0aW9uIHBvbHlnb25JbnRlcnNlY3RzUG9seWdvbihwb2x5Z29uQSAgICAgICAgICwgcG9seWdvbkIgICAgICAgICApIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbHlnb25BLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwb2x5Z29uQ29udGFpbnNQb2ludChwb2x5Z29uQiwgcG9seWdvbkFbaV0pKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbHlnb25CLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwb2x5Z29uQ29udGFpbnNQb2ludChwb2x5Z29uQSwgcG9seWdvbkJbaV0pKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobGluZUludGVyc2VjdHNMaW5lKHBvbHlnb25BLCBwb2x5Z29uQikpIHJldHVybiB0cnVlO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBtdWx0aVBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRNdWx0aVBvaW50KG11bHRpUG9seWdvbiAgICAgICAgICAgICAgLCByaW5ncyAgICAgICAgICAgICAsIHJhZGl1cyAgICAgICAgKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBtdWx0aVBvbHlnb24ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY29uc3QgcG9seWdvbiA9IG11bHRpUG9seWdvbltqXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcmluZyA9IHJpbmdzW2ldO1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCByaW5nLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9pbnQgPSByaW5nW2tdO1xuICAgICAgICAgICAgICAgIGlmIChwb2x5Z29uQ29udGFpbnNQb2ludChwb2x5Z29uLCBwb2ludCkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChwb2ludEludGVyc2VjdHNCdWZmZXJlZExpbmUocG9pbnQsIHBvbHlnb24sIHJhZGl1cykpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbXVsdGlQb2x5Z29uSW50ZXJzZWN0c011bHRpUG9seWdvbihtdWx0aVBvbHlnb25BICAgICAgICAgICAgICAsIG11bHRpUG9seWdvbkIgICAgICAgICAgICAgICkge1xuXG4gICAgaWYgKG11bHRpUG9seWdvbkEubGVuZ3RoID09PSAxICYmIG11bHRpUG9seWdvbkFbMF0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBtdWx0aVBvbHlnb25Db250YWluc1BvaW50KG11bHRpUG9seWdvbkIsIG11bHRpUG9seWdvbkFbMF1bMF0pO1xuICAgIH1cblxuICAgIGZvciAobGV0IG0gPSAwOyBtIDwgbXVsdGlQb2x5Z29uQi5sZW5ndGg7IG0rKykge1xuICAgICAgICBjb25zdCByaW5nID0gbXVsdGlQb2x5Z29uQlttXTtcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCByaW5nLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICBpZiAobXVsdGlQb2x5Z29uQ29udGFpbnNQb2ludChtdWx0aVBvbHlnb25BLCByaW5nW25dKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG11bHRpUG9seWdvbkEubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY29uc3QgcG9seWdvbiA9IG11bHRpUG9seWdvbkFbal07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9seWdvbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG11bHRpUG9seWdvbkNvbnRhaW5zUG9pbnQobXVsdGlQb2x5Z29uQiwgcG9seWdvbltpXSkpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtdWx0aVBvbHlnb25CLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBpZiAobGluZUludGVyc2VjdHNMaW5lKHBvbHlnb24sIG11bHRpUG9seWdvbkJba10pKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbXVsdGlQb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkTXVsdGlMaW5lKG11bHRpUG9seWdvbiAgICAgICAgICAgICAgLCBtdWx0aUxpbmUgICAgICAgICAgICwgcmFkaXVzICAgICAgICApIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11bHRpTGluZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBsaW5lID0gbXVsdGlMaW5lW2ldO1xuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbXVsdGlQb2x5Z29uLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBwb2x5Z29uID0gbXVsdGlQb2x5Z29uW2pdO1xuXG4gICAgICAgICAgICBpZiAocG9seWdvbi5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbGluZS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9seWdvbkNvbnRhaW5zUG9pbnQocG9seWdvbiwgbGluZVtrXSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxpbmVJbnRlcnNlY3RzQnVmZmVyZWRMaW5lKHBvbHlnb24sIGxpbmUsIHJhZGl1cykpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGluZUludGVyc2VjdHNCdWZmZXJlZExpbmUobGluZUEgICAgICAsIGxpbmVCICAgICAgLCByYWRpdXMgICAgICAgICkge1xuXG4gICAgaWYgKGxpbmVBLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgaWYgKGxpbmVJbnRlcnNlY3RzTGluZShsaW5lQSwgbGluZUIpKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGFueSBwb2ludCBpbiBlaXRoZXIgbGluZSBpcyB3aXRoaW4gcmFkaXVzIG9mIHRoZSBvdGhlciBsaW5lXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGluZUIubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwb2ludEludGVyc2VjdHNCdWZmZXJlZExpbmUobGluZUJbal0sIGxpbmVBLCByYWRpdXMpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbGluZUEubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgaWYgKHBvaW50SW50ZXJzZWN0c0J1ZmZlcmVkTGluZShsaW5lQVtrXSwgbGluZUIsIHJhZGl1cykpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGluZUludGVyc2VjdHNMaW5lKGxpbmVBICAgICAgLCBsaW5lQiAgICAgICkge1xuICAgIGlmIChsaW5lQS5sZW5ndGggPT09IDAgfHwgbGluZUIubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lQS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgYTAgPSBsaW5lQVtpXTtcbiAgICAgICAgY29uc3QgYTEgPSBsaW5lQVtpICsgMV07XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGluZUIubGVuZ3RoIC0gMTsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBiMCA9IGxpbmVCW2pdO1xuICAgICAgICAgICAgY29uc3QgYjEgPSBsaW5lQltqICsgMV07XG4gICAgICAgICAgICBpZiAobGluZVNlZ21lbnRJbnRlcnNlY3RzTGluZVNlZ21lbnQoYTAsIGExLCBiMCwgYjEpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGxpbmVTZWdtZW50SW50ZXJzZWN0c0xpbmVTZWdtZW50KGEwICAgICAgICwgYTEgICAgICAgLCBiMCAgICAgICAsIGIxICAgICAgICkge1xuICAgIHJldHVybiBpc0NvdW50ZXJDbG9ja3dpc2UoYTAsIGIwLCBiMSkgIT09IGlzQ291bnRlckNsb2Nrd2lzZShhMSwgYjAsIGIxKSAmJlxuICAgICAgICBpc0NvdW50ZXJDbG9ja3dpc2UoYTAsIGExLCBiMCkgIT09IGlzQ291bnRlckNsb2Nrd2lzZShhMCwgYTEsIGIxKTtcbn1cblxuZnVuY3Rpb24gcG9pbnRJbnRlcnNlY3RzQnVmZmVyZWRMaW5lKHAgICAgICAgLCBsaW5lICAgICAgLCByYWRpdXMgICAgICAgICkge1xuICAgIGNvbnN0IHJhZGl1c1NxdWFyZWQgPSByYWRpdXMgKiByYWRpdXM7XG5cbiAgICBpZiAobGluZS5sZW5ndGggPT09IDEpIHJldHVybiBwLmRpc3RTcXIobGluZVswXSkgPCByYWRpdXNTcXVhcmVkO1xuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIEZpbmQgbGluZSBzZWdtZW50cyB0aGF0IGhhdmUgYSBkaXN0YW5jZSA8PSByYWRpdXNeMiB0byBwXG4gICAgICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgdHJlYXQgdGhlIGxpbmUgYXMgXCJjb250YWluaW5nIHBvaW50IHBcIi5cbiAgICAgICAgY29uc3QgdiA9IGxpbmVbaSAtIDFdLCB3ID0gbGluZVtpXTtcbiAgICAgICAgaWYgKGRpc3RUb1NlZ21lbnRTcXVhcmVkKHAsIHYsIHcpIDwgcmFkaXVzU3F1YXJlZCkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gQ29kZSBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE1MDE3MjUvMzMxMzc5LlxuZnVuY3Rpb24gZGlzdFRvU2VnbWVudFNxdWFyZWQocCAgICAgICAsIHYgICAgICAgLCB3ICAgICAgICkge1xuICAgIGNvbnN0IGwyID0gdi5kaXN0U3FyKHcpO1xuICAgIGlmIChsMiA9PT0gMCkgcmV0dXJuIHAuZGlzdFNxcih2KTtcbiAgICBjb25zdCB0ID0gKChwLnggLSB2LngpICogKHcueCAtIHYueCkgKyAocC55IC0gdi55KSAqICh3LnkgLSB2LnkpKSAvIGwyO1xuICAgIGlmICh0IDwgMCkgcmV0dXJuIHAuZGlzdFNxcih2KTtcbiAgICBpZiAodCA+IDEpIHJldHVybiBwLmRpc3RTcXIodyk7XG4gICAgcmV0dXJuIHAuZGlzdFNxcih3LnN1Yih2KS5fbXVsdCh0KS5fYWRkKHYpKTtcbn1cblxuLy8gcG9pbnQgaW4gcG9seWdvbiByYXkgY2FzdGluZyBhbGdvcml0aG1cbmZ1bmN0aW9uIG11bHRpUG9seWdvbkNvbnRhaW5zUG9pbnQocmluZ3MgICAgICAgICAgICAgLCBwICAgICAgICkge1xuICAgIGxldCBjID0gZmFsc2UsXG4gICAgICAgIHJpbmcsIHAxLCBwMjtcblxuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcmluZ3MubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgcmluZyA9IHJpbmdzW2tdO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgaiA9IHJpbmcubGVuZ3RoIC0gMTsgaSA8IHJpbmcubGVuZ3RoOyBqID0gaSsrKSB7XG4gICAgICAgICAgICBwMSA9IHJpbmdbaV07XG4gICAgICAgICAgICBwMiA9IHJpbmdbal07XG4gICAgICAgICAgICBpZiAoKChwMS55ID4gcC55KSAhPT0gKHAyLnkgPiBwLnkpKSAmJiAocC54IDwgKHAyLnggLSBwMS54KSAqIChwLnkgLSBwMS55KSAvIChwMi55IC0gcDEueSkgKyBwMS54KSkge1xuICAgICAgICAgICAgICAgIGMgPSAhYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gcG9seWdvbkNvbnRhaW5zUG9pbnQocmluZyAgICAgICwgcCAgICAgICApIHtcbiAgICBsZXQgYyA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwLCBqID0gcmluZy5sZW5ndGggLSAxOyBpIDwgcmluZy5sZW5ndGg7IGogPSBpKyspIHtcbiAgICAgICAgY29uc3QgcDEgPSByaW5nW2ldO1xuICAgICAgICBjb25zdCBwMiA9IHJpbmdbal07XG4gICAgICAgIGlmICgoKHAxLnkgPiBwLnkpICE9PSAocDIueSA+IHAueSkpICYmIChwLnggPCAocDIueCAtIHAxLngpICogKHAueSAtIHAxLnkpIC8gKHAyLnkgLSBwMS55KSArIHAxLngpKSB7XG4gICAgICAgICAgICBjID0gIWM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGM7XG59XG4iLCIvLyAgICAgIFxuXG4vLyBUaGUgZm9sbG93aW5nIHRhYmxlIGNvbWVzIGZyb20gPGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljLzEwLjAuMC91Y2QvQmxvY2tzLnR4dD4uXG4vLyBLZWVwIGl0IHN5bmNocm9uaXplZCB3aXRoIDxodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy9VQ0QvbGF0ZXN0L3VjZC9CbG9ja3MudHh0Pi5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmNvbnN0IHVuaWNvZGVCbG9ja0xvb2t1cCAgICAgICAgICAgICAgICAgICAgID0ge1xuICAgIC8vICdCYXNpYyBMYXRpbic6IChjaGFyKSA9PiBjaGFyID49IDB4MDAwMCAmJiBjaGFyIDw9IDB4MDA3RixcbiAgICAnTGF0aW4tMSBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgwMDgwICYmIGNoYXIgPD0gMHgwMEZGLFxuICAgIC8vICdMYXRpbiBFeHRlbmRlZC1BJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwMTAwICYmIGNoYXIgPD0gMHgwMTdGLFxuICAgIC8vICdMYXRpbiBFeHRlbmRlZC1CJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwMTgwICYmIGNoYXIgPD0gMHgwMjRGLFxuICAgIC8vICdJUEEgRXh0ZW5zaW9ucyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDI1MCAmJiBjaGFyIDw9IDB4MDJBRixcbiAgICAvLyAnU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwMkIwICYmIGNoYXIgPD0gMHgwMkZGLFxuICAgIC8vICdDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MnOiAoY2hhcikgPT4gY2hhciA+PSAweDAzMDAgJiYgY2hhciA8PSAweDAzNkYsXG4gICAgLy8gJ0dyZWVrIGFuZCBDb3B0aWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDAzNzAgJiYgY2hhciA8PSAweDAzRkYsXG4gICAgLy8gJ0N5cmlsbGljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwNDAwICYmIGNoYXIgPD0gMHgwNEZGLFxuICAgIC8vICdDeXJpbGxpYyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgwNTAwICYmIGNoYXIgPD0gMHgwNTJGLFxuICAgIC8vICdBcm1lbmlhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MDUzMCAmJiBjaGFyIDw9IDB4MDU4RixcbiAgICAvLydIZWJyZXcnOiAoY2hhcikgPT4gY2hhciA+PSAweDA1OTAgJiYgY2hhciA8PSAweDA1RkYsXG4gICAgJ0FyYWJpYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDYwMCAmJiBjaGFyIDw9IDB4MDZGRixcbiAgICAvLydTeXJpYWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDA3MDAgJiYgY2hhciA8PSAweDA3NEYsXG4gICAgJ0FyYWJpYyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgwNzUwICYmIGNoYXIgPD0gMHgwNzdGLFxuICAgIC8vICdUaGFhbmEnOiAoY2hhcikgPT4gY2hhciA+PSAweDA3ODAgJiYgY2hhciA8PSAweDA3QkYsXG4gICAgLy8gJ05Lbyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDdDMCAmJiBjaGFyIDw9IDB4MDdGRixcbiAgICAvLyAnU2FtYXJpdGFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwODAwICYmIGNoYXIgPD0gMHgwODNGLFxuICAgIC8vICdNYW5kYWljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwODQwICYmIGNoYXIgPD0gMHgwODVGLFxuICAgIC8vICdTeXJpYWMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MDg2MCAmJiBjaGFyIDw9IDB4MDg2RixcbiAgICAnQXJhYmljIEV4dGVuZGVkLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweDA4QTAgJiYgY2hhciA8PSAweDA4RkYsXG4gICAgLy8gJ0RldmFuYWdhcmknOiAoY2hhcikgPT4gY2hhciA+PSAweDA5MDAgJiYgY2hhciA8PSAweDA5N0YsXG4gICAgLy8gJ0JlbmdhbGknOiAoY2hhcikgPT4gY2hhciA+PSAweDA5ODAgJiYgY2hhciA8PSAweDA5RkYsXG4gICAgLy8gJ0d1cm11a2hpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwQTAwICYmIGNoYXIgPD0gMHgwQTdGLFxuICAgIC8vICdHdWphcmF0aSc6IChjaGFyKSA9PiBjaGFyID49IDB4MEE4MCAmJiBjaGFyIDw9IDB4MEFGRixcbiAgICAvLyAnT3JpeWEnOiAoY2hhcikgPT4gY2hhciA+PSAweDBCMDAgJiYgY2hhciA8PSAweDBCN0YsXG4gICAgLy8gJ1RhbWlsJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwQjgwICYmIGNoYXIgPD0gMHgwQkZGLFxuICAgIC8vICdUZWx1Z3UnOiAoY2hhcikgPT4gY2hhciA+PSAweDBDMDAgJiYgY2hhciA8PSAweDBDN0YsXG4gICAgLy8gJ0thbm5hZGEnOiAoY2hhcikgPT4gY2hhciA+PSAweDBDODAgJiYgY2hhciA8PSAweDBDRkYsXG4gICAgLy8gJ01hbGF5YWxhbSc6IChjaGFyKSA9PiBjaGFyID49IDB4MEQwMCAmJiBjaGFyIDw9IDB4MEQ3RixcbiAgICAvLyAnU2luaGFsYSc6IChjaGFyKSA9PiBjaGFyID49IDB4MEQ4MCAmJiBjaGFyIDw9IDB4MERGRixcbiAgICAvLyAnVGhhaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MEUwMCAmJiBjaGFyIDw9IDB4MEU3RixcbiAgICAvLyAnTGFvJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwRTgwICYmIGNoYXIgPD0gMHgwRUZGLFxuICAgIC8vICdUaWJldGFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwRjAwICYmIGNoYXIgPD0gMHgwRkZGLFxuICAgIC8vICdNeWFubWFyJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDAwICYmIGNoYXIgPD0gMHgxMDlGLFxuICAgIC8vICdHZW9yZ2lhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTBBMCAmJiBjaGFyIDw9IDB4MTBGRixcbiAgICAnSGFuZ3VsIEphbW8nOiAoY2hhcikgPT4gY2hhciA+PSAweDExMDAgJiYgY2hhciA8PSAweDExRkYsXG4gICAgLy8gJ0V0aGlvcGljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMjAwICYmIGNoYXIgPD0gMHgxMzdGLFxuICAgIC8vICdFdGhpb3BpYyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMzgwICYmIGNoYXIgPD0gMHgxMzlGLFxuICAgIC8vICdDaGVyb2tlZSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTNBMCAmJiBjaGFyIDw9IDB4MTNGRixcbiAgICAnVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTQwMCAmJiBjaGFyIDw9IDB4MTY3RixcbiAgICAvLyAnT2doYW0nOiAoY2hhcikgPT4gY2hhciA+PSAweDE2ODAgJiYgY2hhciA8PSAweDE2OUYsXG4gICAgLy8gJ1J1bmljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNkEwICYmIGNoYXIgPD0gMHgxNkZGLFxuICAgIC8vICdUYWdhbG9nJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNzAwICYmIGNoYXIgPD0gMHgxNzFGLFxuICAgIC8vICdIYW51bm9vJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNzIwICYmIGNoYXIgPD0gMHgxNzNGLFxuICAgIC8vICdCdWhpZCc6IChjaGFyKSA9PiBjaGFyID49IDB4MTc0MCAmJiBjaGFyIDw9IDB4MTc1RixcbiAgICAvLyAnVGFnYmFud2EnOiAoY2hhcikgPT4gY2hhciA+PSAweDE3NjAgJiYgY2hhciA8PSAweDE3N0YsXG4gICAgLy8gJ0tobWVyJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNzgwICYmIGNoYXIgPD0gMHgxN0ZGLFxuICAgIC8vICdNb25nb2xpYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDE4MDAgJiYgY2hhciA8PSAweDE4QUYsXG4gICAgJ1VuaWZpZWQgQ2FuYWRpYW4gQWJvcmlnaW5hbCBTeWxsYWJpY3MgRXh0ZW5kZWQnOiAoY2hhcikgPT4gY2hhciA+PSAweDE4QjAgJiYgY2hhciA8PSAweDE4RkYsXG4gICAgLy8gJ0xpbWJ1JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxOTAwICYmIGNoYXIgPD0gMHgxOTRGLFxuICAgIC8vICdUYWkgTGUnOiAoY2hhcikgPT4gY2hhciA+PSAweDE5NTAgJiYgY2hhciA8PSAweDE5N0YsXG4gICAgLy8gJ05ldyBUYWkgTHVlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxOTgwICYmIGNoYXIgPD0gMHgxOURGLFxuICAgIC8vICdLaG1lciBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxOUUwICYmIGNoYXIgPD0gMHgxOUZGLFxuICAgIC8vICdCdWdpbmVzZSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUEwMCAmJiBjaGFyIDw9IDB4MUExRixcbiAgICAvLyAnVGFpIFRoYW0nOiAoY2hhcikgPT4gY2hhciA+PSAweDFBMjAgJiYgY2hhciA8PSAweDFBQUYsXG4gICAgLy8gJ0NvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcyBFeHRlbmRlZCc6IChjaGFyKSA9PiBjaGFyID49IDB4MUFCMCAmJiBjaGFyIDw9IDB4MUFGRixcbiAgICAvLyAnQmFsaW5lc2UnOiAoY2hhcikgPT4gY2hhciA+PSAweDFCMDAgJiYgY2hhciA8PSAweDFCN0YsXG4gICAgLy8gJ1N1bmRhbmVzZSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUI4MCAmJiBjaGFyIDw9IDB4MUJCRixcbiAgICAvLyAnQmF0YWsnOiAoY2hhcikgPT4gY2hhciA+PSAweDFCQzAgJiYgY2hhciA8PSAweDFCRkYsXG4gICAgLy8gJ0xlcGNoYSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUMwMCAmJiBjaGFyIDw9IDB4MUM0RixcbiAgICAvLyAnT2wgQ2hpa2knOiAoY2hhcikgPT4gY2hhciA+PSAweDFDNTAgJiYgY2hhciA8PSAweDFDN0YsXG4gICAgLy8gJ0N5cmlsbGljIEV4dGVuZGVkLUMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFDODAgJiYgY2hhciA8PSAweDFDOEYsXG4gICAgLy8gJ1N1bmRhbmVzZSBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQ0MwICYmIGNoYXIgPD0gMHgxQ0NGLFxuICAgIC8vICdWZWRpYyBFeHRlbnNpb25zJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQ0QwICYmIGNoYXIgPD0gMHgxQ0ZGLFxuICAgIC8vICdQaG9uZXRpYyBFeHRlbnNpb25zJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRDAwICYmIGNoYXIgPD0gMHgxRDdGLFxuICAgIC8vICdQaG9uZXRpYyBFeHRlbnNpb25zIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDFEODAgJiYgY2hhciA8PSAweDFEQkYsXG4gICAgLy8gJ0NvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxREMwICYmIGNoYXIgPD0gMHgxREZGLFxuICAgIC8vICdMYXRpbiBFeHRlbmRlZCBBZGRpdGlvbmFsJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRTAwICYmIGNoYXIgPD0gMHgxRUZGLFxuICAgIC8vICdHcmVlayBFeHRlbmRlZCc6IChjaGFyKSA9PiBjaGFyID49IDB4MUYwMCAmJiBjaGFyIDw9IDB4MUZGRixcbiAgICAnR2VuZXJhbCBQdW5jdHVhdGlvbic6IChjaGFyKSA9PiBjaGFyID49IDB4MjAwMCAmJiBjaGFyIDw9IDB4MjA2RixcbiAgICAvLyAnU3VwZXJzY3JpcHRzIGFuZCBTdWJzY3JpcHRzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyMDcwICYmIGNoYXIgPD0gMHgyMDlGLFxuICAgIC8vICdDdXJyZW5jeSBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyMEEwICYmIGNoYXIgPD0gMHgyMENGLFxuICAgIC8vICdDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MgZm9yIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDIwRDAgJiYgY2hhciA8PSAweDIwRkYsXG4gICAgJ0xldHRlcmxpa2UgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MjEwMCAmJiBjaGFyIDw9IDB4MjE0RixcbiAgICAnTnVtYmVyIEZvcm1zJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyMTUwICYmIGNoYXIgPD0gMHgyMThGLFxuICAgIC8vICdBcnJvd3MnOiAoY2hhcikgPT4gY2hhciA+PSAweDIxOTAgJiYgY2hhciA8PSAweDIxRkYsXG4gICAgLy8gJ01hdGhlbWF0aWNhbCBPcGVyYXRvcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDIyMDAgJiYgY2hhciA8PSAweDIyRkYsXG4gICAgJ01pc2NlbGxhbmVvdXMgVGVjaG5pY2FsJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyMzAwICYmIGNoYXIgPD0gMHgyM0ZGLFxuICAgICdDb250cm9sIFBpY3R1cmVzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyNDAwICYmIGNoYXIgPD0gMHgyNDNGLFxuICAgICdPcHRpY2FsIENoYXJhY3RlciBSZWNvZ25pdGlvbic6IChjaGFyKSA9PiBjaGFyID49IDB4MjQ0MCAmJiBjaGFyIDw9IDB4MjQ1RixcbiAgICAnRW5jbG9zZWQgQWxwaGFudW1lcmljcyc6IChjaGFyKSA9PiBjaGFyID49IDB4MjQ2MCAmJiBjaGFyIDw9IDB4MjRGRixcbiAgICAvLyAnQm94IERyYXdpbmcnOiAoY2hhcikgPT4gY2hhciA+PSAweDI1MDAgJiYgY2hhciA8PSAweDI1N0YsXG4gICAgLy8gJ0Jsb2NrIEVsZW1lbnRzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyNTgwICYmIGNoYXIgPD0gMHgyNTlGLFxuICAgICdHZW9tZXRyaWMgU2hhcGVzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyNUEwICYmIGNoYXIgPD0gMHgyNUZGLFxuICAgICdNaXNjZWxsYW5lb3VzIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDI2MDAgJiYgY2hhciA8PSAweDI2RkYsXG4gICAgLy8gJ0RpbmdiYXRzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyNzAwICYmIGNoYXIgPD0gMHgyN0JGLFxuICAgIC8vICdNaXNjZWxsYW5lb3VzIE1hdGhlbWF0aWNhbCBTeW1ib2xzLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweDI3QzAgJiYgY2hhciA8PSAweDI3RUYsXG4gICAgLy8gJ1N1cHBsZW1lbnRhbCBBcnJvd3MtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4MjdGMCAmJiBjaGFyIDw9IDB4MjdGRixcbiAgICAvLyAnQnJhaWxsZSBQYXR0ZXJucyc6IChjaGFyKSA9PiBjaGFyID49IDB4MjgwMCAmJiBjaGFyIDw9IDB4MjhGRixcbiAgICAvLyAnU3VwcGxlbWVudGFsIEFycm93cy1CJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyOTAwICYmIGNoYXIgPD0gMHgyOTdGLFxuICAgIC8vICdNaXNjZWxsYW5lb3VzIE1hdGhlbWF0aWNhbCBTeW1ib2xzLUInOiAoY2hhcikgPT4gY2hhciA+PSAweDI5ODAgJiYgY2hhciA8PSAweDI5RkYsXG4gICAgLy8gJ1N1cHBsZW1lbnRhbCBNYXRoZW1hdGljYWwgT3BlcmF0b3JzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyQTAwICYmIGNoYXIgPD0gMHgyQUZGLFxuICAgICdNaXNjZWxsYW5lb3VzIFN5bWJvbHMgYW5kIEFycm93cyc6IChjaGFyKSA9PiBjaGFyID49IDB4MkIwMCAmJiBjaGFyIDw9IDB4MkJGRixcbiAgICAvLyAnR2xhZ29saXRpYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MkMwMCAmJiBjaGFyIDw9IDB4MkM1RixcbiAgICAvLyAnTGF0aW4gRXh0ZW5kZWQtQyc6IChjaGFyKSA9PiBjaGFyID49IDB4MkM2MCAmJiBjaGFyIDw9IDB4MkM3RixcbiAgICAvLyAnQ29wdGljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyQzgwICYmIGNoYXIgPD0gMHgyQ0ZGLFxuICAgIC8vICdHZW9yZ2lhbiBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgyRDAwICYmIGNoYXIgPD0gMHgyRDJGLFxuICAgIC8vICdUaWZpbmFnaCc6IChjaGFyKSA9PiBjaGFyID49IDB4MkQzMCAmJiBjaGFyIDw9IDB4MkQ3RixcbiAgICAvLyAnRXRoaW9waWMgRXh0ZW5kZWQnOiAoY2hhcikgPT4gY2hhciA+PSAweDJEODAgJiYgY2hhciA8PSAweDJEREYsXG4gICAgLy8gJ0N5cmlsbGljIEV4dGVuZGVkLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweDJERTAgJiYgY2hhciA8PSAweDJERkYsXG4gICAgLy8gJ1N1cHBsZW1lbnRhbCBQdW5jdHVhdGlvbic6IChjaGFyKSA9PiBjaGFyID49IDB4MkUwMCAmJiBjaGFyIDw9IDB4MkU3RixcbiAgICAnQ0pLIFJhZGljYWxzIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDJFODAgJiYgY2hhciA8PSAweDJFRkYsXG4gICAgJ0thbmd4aSBSYWRpY2Fscyc6IChjaGFyKSA9PiBjaGFyID49IDB4MkYwMCAmJiBjaGFyIDw9IDB4MkZERixcbiAgICAnSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVycyc6IChjaGFyKSA9PiBjaGFyID49IDB4MkZGMCAmJiBjaGFyIDw9IDB4MkZGRixcbiAgICAnQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uJzogKGNoYXIpID0+IGNoYXIgPj0gMHgzMDAwICYmIGNoYXIgPD0gMHgzMDNGLFxuICAgICdIaXJhZ2FuYSc6IChjaGFyKSA9PiBjaGFyID49IDB4MzA0MCAmJiBjaGFyIDw9IDB4MzA5RixcbiAgICAnS2F0YWthbmEnOiAoY2hhcikgPT4gY2hhciA+PSAweDMwQTAgJiYgY2hhciA8PSAweDMwRkYsXG4gICAgJ0JvcG9tb2ZvJzogKGNoYXIpID0+IGNoYXIgPj0gMHgzMTAwICYmIGNoYXIgPD0gMHgzMTJGLFxuICAgICdIYW5ndWwgQ29tcGF0aWJpbGl0eSBKYW1vJzogKGNoYXIpID0+IGNoYXIgPj0gMHgzMTMwICYmIGNoYXIgPD0gMHgzMThGLFxuICAgICdLYW5idW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDMxOTAgJiYgY2hhciA8PSAweDMxOUYsXG4gICAgJ0JvcG9tb2ZvIEV4dGVuZGVkJzogKGNoYXIpID0+IGNoYXIgPj0gMHgzMUEwICYmIGNoYXIgPD0gMHgzMUJGLFxuICAgICdDSksgU3Ryb2tlcyc6IChjaGFyKSA9PiBjaGFyID49IDB4MzFDMCAmJiBjaGFyIDw9IDB4MzFFRixcbiAgICAnS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9ucyc6IChjaGFyKSA9PiBjaGFyID49IDB4MzFGMCAmJiBjaGFyIDw9IDB4MzFGRixcbiAgICAnRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRocyc6IChjaGFyKSA9PiBjaGFyID49IDB4MzIwMCAmJiBjaGFyIDw9IDB4MzJGRixcbiAgICAnQ0pLIENvbXBhdGliaWxpdHknOiAoY2hhcikgPT4gY2hhciA+PSAweDMzMDAgJiYgY2hhciA8PSAweDMzRkYsXG4gICAgJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEEnOiAoY2hhcikgPT4gY2hhciA+PSAweDM0MDAgJiYgY2hhciA8PSAweDREQkYsXG4gICAgJ1lpamluZyBIZXhhZ3JhbSBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHg0REMwICYmIGNoYXIgPD0gMHg0REZGLFxuICAgICdDSksgVW5pZmllZCBJZGVvZ3JhcGhzJzogKGNoYXIpID0+IGNoYXIgPj0gMHg0RTAwICYmIGNoYXIgPD0gMHg5RkZGLFxuICAgICdZaSBTeWxsYWJsZXMnOiAoY2hhcikgPT4gY2hhciA+PSAweEEwMDAgJiYgY2hhciA8PSAweEE0OEYsXG4gICAgJ1lpIFJhZGljYWxzJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBNDkwICYmIGNoYXIgPD0gMHhBNENGLFxuICAgIC8vICdMaXN1JzogKGNoYXIpID0+IGNoYXIgPj0gMHhBNEQwICYmIGNoYXIgPD0gMHhBNEZGLFxuICAgIC8vICdWYWknOiAoY2hhcikgPT4gY2hhciA+PSAweEE1MDAgJiYgY2hhciA8PSAweEE2M0YsXG4gICAgLy8gJ0N5cmlsbGljIEV4dGVuZGVkLUInOiAoY2hhcikgPT4gY2hhciA+PSAweEE2NDAgJiYgY2hhciA8PSAweEE2OUYsXG4gICAgLy8gJ0JhbXVtJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBNkEwICYmIGNoYXIgPD0gMHhBNkZGLFxuICAgIC8vICdNb2RpZmllciBUb25lIExldHRlcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweEE3MDAgJiYgY2hhciA8PSAweEE3MUYsXG4gICAgLy8gJ0xhdGluIEV4dGVuZGVkLUQnOiAoY2hhcikgPT4gY2hhciA+PSAweEE3MjAgJiYgY2hhciA8PSAweEE3RkYsXG4gICAgLy8gJ1N5bG90aSBOYWdyaSc6IChjaGFyKSA9PiBjaGFyID49IDB4QTgwMCAmJiBjaGFyIDw9IDB4QTgyRixcbiAgICAvLyAnQ29tbW9uIEluZGljIE51bWJlciBGb3Jtcyc6IChjaGFyKSA9PiBjaGFyID49IDB4QTgzMCAmJiBjaGFyIDw9IDB4QTgzRixcbiAgICAvLyAnUGhhZ3MtcGEnOiAoY2hhcikgPT4gY2hhciA+PSAweEE4NDAgJiYgY2hhciA8PSAweEE4N0YsXG4gICAgLy8gJ1NhdXJhc2h0cmEnOiAoY2hhcikgPT4gY2hhciA+PSAweEE4ODAgJiYgY2hhciA8PSAweEE4REYsXG4gICAgLy8gJ0RldmFuYWdhcmkgRXh0ZW5kZWQnOiAoY2hhcikgPT4gY2hhciA+PSAweEE4RTAgJiYgY2hhciA8PSAweEE4RkYsXG4gICAgLy8gJ0theWFoIExpJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBOTAwICYmIGNoYXIgPD0gMHhBOTJGLFxuICAgIC8vICdSZWphbmcnOiAoY2hhcikgPT4gY2hhciA+PSAweEE5MzAgJiYgY2hhciA8PSAweEE5NUYsXG4gICAgJ0hhbmd1bCBKYW1vIEV4dGVuZGVkLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweEE5NjAgJiYgY2hhciA8PSAweEE5N0YsXG4gICAgLy8gJ0phdmFuZXNlJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBOTgwICYmIGNoYXIgPD0gMHhBOURGLFxuICAgIC8vICdNeWFubWFyIEV4dGVuZGVkLUInOiAoY2hhcikgPT4gY2hhciA+PSAweEE5RTAgJiYgY2hhciA8PSAweEE5RkYsXG4gICAgLy8gJ0NoYW0nOiAoY2hhcikgPT4gY2hhciA+PSAweEFBMDAgJiYgY2hhciA8PSAweEFBNUYsXG4gICAgLy8gJ015YW5tYXIgRXh0ZW5kZWQtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4QUE2MCAmJiBjaGFyIDw9IDB4QUE3RixcbiAgICAvLyAnVGFpIFZpZXQnOiAoY2hhcikgPT4gY2hhciA+PSAweEFBODAgJiYgY2hhciA8PSAweEFBREYsXG4gICAgLy8gJ01lZXRlaSBNYXllayBFeHRlbnNpb25zJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBQUUwICYmIGNoYXIgPD0gMHhBQUZGLFxuICAgIC8vICdFdGhpb3BpYyBFeHRlbmRlZC1BJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBQjAwICYmIGNoYXIgPD0gMHhBQjJGLFxuICAgIC8vICdMYXRpbiBFeHRlbmRlZC1FJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBQjMwICYmIGNoYXIgPD0gMHhBQjZGLFxuICAgIC8vICdDaGVyb2tlZSBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHhBQjcwICYmIGNoYXIgPD0gMHhBQkJGLFxuICAgIC8vICdNZWV0ZWkgTWF5ZWsnOiAoY2hhcikgPT4gY2hhciA+PSAweEFCQzAgJiYgY2hhciA8PSAweEFCRkYsXG4gICAgJ0hhbmd1bCBTeWxsYWJsZXMnOiAoY2hhcikgPT4gY2hhciA+PSAweEFDMDAgJiYgY2hhciA8PSAweEQ3QUYsXG4gICAgJ0hhbmd1bCBKYW1vIEV4dGVuZGVkLUInOiAoY2hhcikgPT4gY2hhciA+PSAweEQ3QjAgJiYgY2hhciA8PSAweEQ3RkYsXG4gICAgLy8gJ0hpZ2ggU3Vycm9nYXRlcyc6IChjaGFyKSA9PiBjaGFyID49IDB4RDgwMCAmJiBjaGFyIDw9IDB4REI3RixcbiAgICAvLyAnSGlnaCBQcml2YXRlIFVzZSBTdXJyb2dhdGVzJzogKGNoYXIpID0+IGNoYXIgPj0gMHhEQjgwICYmIGNoYXIgPD0gMHhEQkZGLFxuICAgIC8vICdMb3cgU3Vycm9nYXRlcyc6IChjaGFyKSA9PiBjaGFyID49IDB4REMwMCAmJiBjaGFyIDw9IDB4REZGRixcbiAgICAnUHJpdmF0ZSBVc2UgQXJlYSc6IChjaGFyKSA9PiBjaGFyID49IDB4RTAwMCAmJiBjaGFyIDw9IDB4RjhGRixcbiAgICAnQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyc6IChjaGFyKSA9PiBjaGFyID49IDB4RjkwMCAmJiBjaGFyIDw9IDB4RkFGRixcbiAgICAvLyAnQWxwaGFiZXRpYyBQcmVzZW50YXRpb24gRm9ybXMnOiAoY2hhcikgPT4gY2hhciA+PSAweEZCMDAgJiYgY2hhciA8PSAweEZCNEYsXG4gICAgJ0FyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4RkI1MCAmJiBjaGFyIDw9IDB4RkRGRixcbiAgICAvLyAnVmFyaWF0aW9uIFNlbGVjdG9ycyc6IChjaGFyKSA9PiBjaGFyID49IDB4RkUwMCAmJiBjaGFyIDw9IDB4RkUwRixcbiAgICAnVmVydGljYWwgRm9ybXMnOiAoY2hhcikgPT4gY2hhciA+PSAweEZFMTAgJiYgY2hhciA8PSAweEZFMUYsXG4gICAgLy8gJ0NvbWJpbmluZyBIYWxmIE1hcmtzJzogKGNoYXIpID0+IGNoYXIgPj0gMHhGRTIwICYmIGNoYXIgPD0gMHhGRTJGLFxuICAgICdDSksgQ29tcGF0aWJpbGl0eSBGb3Jtcyc6IChjaGFyKSA9PiBjaGFyID49IDB4RkUzMCAmJiBjaGFyIDw9IDB4RkU0RixcbiAgICAnU21hbGwgRm9ybSBWYXJpYW50cyc6IChjaGFyKSA9PiBjaGFyID49IDB4RkU1MCAmJiBjaGFyIDw9IDB4RkU2RixcbiAgICAnQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CJzogKGNoYXIpID0+IGNoYXIgPj0gMHhGRTcwICYmIGNoYXIgPD0gMHhGRUZGLFxuICAgICdIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3Jtcyc6IChjaGFyKSA9PiBjaGFyID49IDB4RkYwMCAmJiBjaGFyIDw9IDB4RkZFRlxuICAgIC8vICdTcGVjaWFscyc6IChjaGFyKSA9PiBjaGFyID49IDB4RkZGMCAmJiBjaGFyIDw9IDB4RkZGRixcbiAgICAvLyAnTGluZWFyIEIgU3lsbGFiYXJ5JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDAwMCAmJiBjaGFyIDw9IDB4MTAwN0YsXG4gICAgLy8gJ0xpbmVhciBCIElkZW9ncmFtcyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTAwODAgJiYgY2hhciA8PSAweDEwMEZGLFxuICAgIC8vICdBZWdlYW4gTnVtYmVycyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTAxMDAgJiYgY2hhciA8PSAweDEwMTNGLFxuICAgIC8vICdBbmNpZW50IEdyZWVrIE51bWJlcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwMTQwICYmIGNoYXIgPD0gMHgxMDE4RixcbiAgICAvLyAnQW5jaWVudCBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDE5MCAmJiBjaGFyIDw9IDB4MTAxQ0YsXG4gICAgLy8gJ1BoYWlzdG9zIERpc2MnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwMUQwICYmIGNoYXIgPD0gMHgxMDFGRixcbiAgICAvLyAnTHljaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDI4MCAmJiBjaGFyIDw9IDB4MTAyOUYsXG4gICAgLy8gJ0Nhcmlhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTAyQTAgJiYgY2hhciA8PSAweDEwMkRGLFxuICAgIC8vICdDb3B0aWMgRXBhY3QgTnVtYmVycyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTAyRTAgJiYgY2hhciA8PSAweDEwMkZGLFxuICAgIC8vICdPbGQgSXRhbGljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDMwMCAmJiBjaGFyIDw9IDB4MTAzMkYsXG4gICAgLy8gJ0dvdGhpYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTAzMzAgJiYgY2hhciA8PSAweDEwMzRGLFxuICAgIC8vICdPbGQgUGVybWljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDM1MCAmJiBjaGFyIDw9IDB4MTAzN0YsXG4gICAgLy8gJ1VnYXJpdGljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDM4MCAmJiBjaGFyIDw9IDB4MTAzOUYsXG4gICAgLy8gJ09sZCBQZXJzaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDNBMCAmJiBjaGFyIDw9IDB4MTAzREYsXG4gICAgLy8gJ0Rlc2VyZXQnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwNDAwICYmIGNoYXIgPD0gMHgxMDQ0RixcbiAgICAvLyAnU2hhdmlhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTA0NTAgJiYgY2hhciA8PSAweDEwNDdGLFxuICAgIC8vICdPc21hbnlhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDQ4MCAmJiBjaGFyIDw9IDB4MTA0QUYsXG4gICAgLy8gJ09zYWdlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDRCMCAmJiBjaGFyIDw9IDB4MTA0RkYsXG4gICAgLy8gJ0VsYmFzYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDEwNTAwICYmIGNoYXIgPD0gMHgxMDUyRixcbiAgICAvLyAnQ2F1Y2FzaWFuIEFsYmFuaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDUzMCAmJiBjaGFyIDw9IDB4MTA1NkYsXG4gICAgLy8gJ0xpbmVhciBBJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDYwMCAmJiBjaGFyIDw9IDB4MTA3N0YsXG4gICAgLy8gJ0N5cHJpb3QgU3lsbGFiYXJ5JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDgwMCAmJiBjaGFyIDw9IDB4MTA4M0YsXG4gICAgLy8gJ0ltcGVyaWFsIEFyYW1haWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwODQwICYmIGNoYXIgPD0gMHgxMDg1RixcbiAgICAvLyAnUGFsbXlyZW5lJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDg2MCAmJiBjaGFyIDw9IDB4MTA4N0YsXG4gICAgLy8gJ05hYmF0YWVhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTA4ODAgJiYgY2hhciA8PSAweDEwOEFGLFxuICAgIC8vICdIYXRyYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDEwOEUwICYmIGNoYXIgPD0gMHgxMDhGRixcbiAgICAvLyAnUGhvZW5pY2lhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTA5MDAgJiYgY2hhciA8PSAweDEwOTFGLFxuICAgIC8vICdMeWRpYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDEwOTIwICYmIGNoYXIgPD0gMHgxMDkzRixcbiAgICAvLyAnTWVyb2l0aWMgSGllcm9nbHlwaHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwOTgwICYmIGNoYXIgPD0gMHgxMDk5RixcbiAgICAvLyAnTWVyb2l0aWMgQ3Vyc2l2ZSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTA5QTAgJiYgY2hhciA8PSAweDEwOUZGLFxuICAgIC8vICdLaGFyb3NodGhpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEEwMCAmJiBjaGFyIDw9IDB4MTBBNUYsXG4gICAgLy8gJ09sZCBTb3V0aCBBcmFiaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEE2MCAmJiBjaGFyIDw9IDB4MTBBN0YsXG4gICAgLy8gJ09sZCBOb3J0aCBBcmFiaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEE4MCAmJiBjaGFyIDw9IDB4MTBBOUYsXG4gICAgLy8gJ01hbmljaGFlYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDEwQUMwICYmIGNoYXIgPD0gMHgxMEFGRixcbiAgICAvLyAnQXZlc3Rhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTBCMDAgJiYgY2hhciA8PSAweDEwQjNGLFxuICAgIC8vICdJbnNjcmlwdGlvbmFsIFBhcnRoaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEI0MCAmJiBjaGFyIDw9IDB4MTBCNUYsXG4gICAgLy8gJ0luc2NyaXB0aW9uYWwgUGFobGF2aSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTBCNjAgJiYgY2hhciA8PSAweDEwQjdGLFxuICAgIC8vICdQc2FsdGVyIFBhaGxhdmknOiAoY2hhcikgPT4gY2hhciA+PSAweDEwQjgwICYmIGNoYXIgPD0gMHgxMEJBRixcbiAgICAvLyAnT2xkIFR1cmtpYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTBDMDAgJiYgY2hhciA8PSAweDEwQzRGLFxuICAgIC8vICdPbGQgSHVuZ2FyaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEM4MCAmJiBjaGFyIDw9IDB4MTBDRkYsXG4gICAgLy8gJ1J1bWkgTnVtZXJhbCBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEU2MCAmJiBjaGFyIDw9IDB4MTBFN0YsXG4gICAgLy8gJ0JyYWhtaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTEwMDAgJiYgY2hhciA8PSAweDExMDdGLFxuICAgIC8vICdLYWl0aGknOiAoY2hhcikgPT4gY2hhciA+PSAweDExMDgwICYmIGNoYXIgPD0gMHgxMTBDRixcbiAgICAvLyAnU29yYSBTb21wZW5nJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTBEMCAmJiBjaGFyIDw9IDB4MTEwRkYsXG4gICAgLy8gJ0NoYWttYSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTExMDAgJiYgY2hhciA8PSAweDExMTRGLFxuICAgIC8vICdNYWhhamFuaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTExNTAgJiYgY2hhciA8PSAweDExMTdGLFxuICAgIC8vICdTaGFyYWRhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTE4MCAmJiBjaGFyIDw9IDB4MTExREYsXG4gICAgLy8gJ1NpbmhhbGEgQXJjaGFpYyBOdW1iZXJzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTFFMCAmJiBjaGFyIDw9IDB4MTExRkYsXG4gICAgLy8gJ0tob2praSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTEyMDAgJiYgY2hhciA8PSAweDExMjRGLFxuICAgIC8vICdNdWx0YW5pJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTI4MCAmJiBjaGFyIDw9IDB4MTEyQUYsXG4gICAgLy8gJ0todWRhd2FkaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTEyQjAgJiYgY2hhciA8PSAweDExMkZGLFxuICAgIC8vICdHcmFudGhhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTMwMCAmJiBjaGFyIDw9IDB4MTEzN0YsXG4gICAgLy8gJ05ld2EnOiAoY2hhcikgPT4gY2hhciA+PSAweDExNDAwICYmIGNoYXIgPD0gMHgxMTQ3RixcbiAgICAvLyAnVGlyaHV0YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE0ODAgJiYgY2hhciA8PSAweDExNERGLFxuICAgIC8vICdTaWRkaGFtJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTU4MCAmJiBjaGFyIDw9IDB4MTE1RkYsXG4gICAgLy8gJ01vZGknOiAoY2hhcikgPT4gY2hhciA+PSAweDExNjAwICYmIGNoYXIgPD0gMHgxMTY1RixcbiAgICAvLyAnTW9uZ29saWFuIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDExNjYwICYmIGNoYXIgPD0gMHgxMTY3RixcbiAgICAvLyAnVGFrcmknOiAoY2hhcikgPT4gY2hhciA+PSAweDExNjgwICYmIGNoYXIgPD0gMHgxMTZDRixcbiAgICAvLyAnQWhvbSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE3MDAgJiYgY2hhciA8PSAweDExNzNGLFxuICAgIC8vICdXYXJhbmcgQ2l0aSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE4QTAgJiYgY2hhciA8PSAweDExOEZGLFxuICAgIC8vICdaYW5hYmF6YXIgU3F1YXJlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMUEwMCAmJiBjaGFyIDw9IDB4MTFBNEYsXG4gICAgLy8gJ1NveW9tYm8nOiAoY2hhcikgPT4gY2hhciA+PSAweDExQTUwICYmIGNoYXIgPD0gMHgxMUFBRixcbiAgICAvLyAnUGF1IENpbiBIYXUnOiAoY2hhcikgPT4gY2hhciA+PSAweDExQUMwICYmIGNoYXIgPD0gMHgxMUFGRixcbiAgICAvLyAnQmhhaWtzdWtpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMUMwMCAmJiBjaGFyIDw9IDB4MTFDNkYsXG4gICAgLy8gJ01hcmNoZW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDExQzcwICYmIGNoYXIgPD0gMHgxMUNCRixcbiAgICAvLyAnTWFzYXJhbSBHb25kaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTFEMDAgJiYgY2hhciA8PSAweDExRDVGLFxuICAgIC8vICdDdW5laWZvcm0nOiAoY2hhcikgPT4gY2hhciA+PSAweDEyMDAwICYmIGNoYXIgPD0gMHgxMjNGRixcbiAgICAvLyAnQ3VuZWlmb3JtIE51bWJlcnMgYW5kIFB1bmN0dWF0aW9uJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMjQwMCAmJiBjaGFyIDw9IDB4MTI0N0YsXG4gICAgLy8gJ0Vhcmx5IER5bmFzdGljIEN1bmVpZm9ybSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTI0ODAgJiYgY2hhciA8PSAweDEyNTRGLFxuICAgIC8vICdFZ3lwdGlhbiBIaWVyb2dseXBocyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTMwMDAgJiYgY2hhciA8PSAweDEzNDJGLFxuICAgIC8vICdBbmF0b2xpYW4gSGllcm9nbHlwaHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDE0NDAwICYmIGNoYXIgPD0gMHgxNDY3RixcbiAgICAvLyAnQmFtdW0gU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MTY4MDAgJiYgY2hhciA8PSAweDE2QTNGLFxuICAgIC8vICdNcm8nOiAoY2hhcikgPT4gY2hhciA+PSAweDE2QTQwICYmIGNoYXIgPD0gMHgxNkE2RixcbiAgICAvLyAnQmFzc2EgVmFoJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNkFEMCAmJiBjaGFyIDw9IDB4MTZBRkYsXG4gICAgLy8gJ1BhaGF3aCBIbW9uZyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTZCMDAgJiYgY2hhciA8PSAweDE2QjhGLFxuICAgIC8vICdNaWFvJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNkYwMCAmJiBjaGFyIDw9IDB4MTZGOUYsXG4gICAgLy8gJ0lkZW9ncmFwaGljIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNkZFMCAmJiBjaGFyIDw9IDB4MTZGRkYsXG4gICAgLy8gJ1Rhbmd1dCc6IChjaGFyKSA9PiBjaGFyID49IDB4MTcwMDAgJiYgY2hhciA8PSAweDE4N0ZGLFxuICAgIC8vICdUYW5ndXQgQ29tcG9uZW50cyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTg4MDAgJiYgY2hhciA8PSAweDE4QUZGLFxuICAgIC8vICdLYW5hIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDFCMDAwICYmIGNoYXIgPD0gMHgxQjBGRixcbiAgICAvLyAnS2FuYSBFeHRlbmRlZC1BJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQjEwMCAmJiBjaGFyIDw9IDB4MUIxMkYsXG4gICAgLy8gJ051c2h1JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQjE3MCAmJiBjaGFyIDw9IDB4MUIyRkYsXG4gICAgLy8gJ0R1cGxveWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQkMwMCAmJiBjaGFyIDw9IDB4MUJDOUYsXG4gICAgLy8gJ1Nob3J0aGFuZCBGb3JtYXQgQ29udHJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFCQ0EwICYmIGNoYXIgPD0gMHgxQkNBRixcbiAgICAvLyAnQnl6YW50aW5lIE11c2ljYWwgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUQwMDAgJiYgY2hhciA8PSAweDFEMEZGLFxuICAgIC8vICdNdXNpY2FsIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFEMTAwICYmIGNoYXIgPD0gMHgxRDFGRixcbiAgICAvLyAnQW5jaWVudCBHcmVlayBNdXNpY2FsIE5vdGF0aW9uJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRDIwMCAmJiBjaGFyIDw9IDB4MUQyNEYsXG4gICAgLy8gJ1RhaSBYdWFuIEppbmcgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUQzMDAgJiYgY2hhciA8PSAweDFEMzVGLFxuICAgIC8vICdDb3VudGluZyBSb2QgTnVtZXJhbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFEMzYwICYmIGNoYXIgPD0gMHgxRDM3RixcbiAgICAvLyAnTWF0aGVtYXRpY2FsIEFscGhhbnVtZXJpYyBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRDQwMCAmJiBjaGFyIDw9IDB4MUQ3RkYsXG4gICAgLy8gJ1N1dHRvbiBTaWduV3JpdGluZyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUQ4MDAgJiYgY2hhciA8PSAweDFEQUFGLFxuICAgIC8vICdHbGFnb2xpdGljIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDFFMDAwICYmIGNoYXIgPD0gMHgxRTAyRixcbiAgICAvLyAnTWVuZGUgS2lrYWt1aSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUU4MDAgJiYgY2hhciA8PSAweDFFOERGLFxuICAgIC8vICdBZGxhbSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUU5MDAgJiYgY2hhciA8PSAweDFFOTVGLFxuICAgIC8vICdBcmFiaWMgTWF0aGVtYXRpY2FsIEFscGhhYmV0aWMgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUVFMDAgJiYgY2hhciA8PSAweDFFRUZGLFxuICAgIC8vICdNYWhqb25nIFRpbGVzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjAwMCAmJiBjaGFyIDw9IDB4MUYwMkYsXG4gICAgLy8gJ0RvbWlubyBUaWxlcyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUYwMzAgJiYgY2hhciA8PSAweDFGMDlGLFxuICAgIC8vICdQbGF5aW5nIENhcmRzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjBBMCAmJiBjaGFyIDw9IDB4MUYwRkYsXG4gICAgLy8gJ0VuY2xvc2VkIEFscGhhbnVtZXJpYyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjEwMCAmJiBjaGFyIDw9IDB4MUYxRkYsXG4gICAgLy8gJ0VuY2xvc2VkIElkZW9ncmFwaGljIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGMjAwICYmIGNoYXIgPD0gMHgxRjJGRixcbiAgICAvLyAnTWlzY2VsbGFuZW91cyBTeW1ib2xzIGFuZCBQaWN0b2dyYXBocyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUYzMDAgJiYgY2hhciA8PSAweDFGNUZGLFxuICAgIC8vICdFbW90aWNvbnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGNjAwICYmIGNoYXIgPD0gMHgxRjY0RixcbiAgICAvLyAnT3JuYW1lbnRhbCBEaW5nYmF0cyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUY2NTAgJiYgY2hhciA8PSAweDFGNjdGLFxuICAgIC8vICdUcmFuc3BvcnQgYW5kIE1hcCBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjY4MCAmJiBjaGFyIDw9IDB4MUY2RkYsXG4gICAgLy8gJ0FsY2hlbWljYWwgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUY3MDAgJiYgY2hhciA8PSAweDFGNzdGLFxuICAgIC8vICdHZW9tZXRyaWMgU2hhcGVzIEV4dGVuZGVkJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjc4MCAmJiBjaGFyIDw9IDB4MUY3RkYsXG4gICAgLy8gJ1N1cHBsZW1lbnRhbCBBcnJvd3MtQyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUY4MDAgJiYgY2hhciA8PSAweDFGOEZGLFxuICAgIC8vICdTdXBwbGVtZW50YWwgU3ltYm9scyBhbmQgUGljdG9ncmFwaHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGOTAwICYmIGNoYXIgPD0gMHgxRjlGRixcbiAgICAvLyAnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQic6IChjaGFyKSA9PiBjaGFyID49IDB4MjAwMDAgJiYgY2hhciA8PSAweDJBNkRGLFxuICAgIC8vICdDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBDJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyQTcwMCAmJiBjaGFyIDw9IDB4MkI3M0YsXG4gICAgLy8gJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEQnOiAoY2hhcikgPT4gY2hhciA+PSAweDJCNzQwICYmIGNoYXIgPD0gMHgyQjgxRixcbiAgICAvLyAnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gRSc6IChjaGFyKSA9PiBjaGFyID49IDB4MkI4MjAgJiYgY2hhciA8PSAweDJDRUFGLFxuICAgIC8vICdDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBGJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyQ0VCMCAmJiBjaGFyIDw9IDB4MkVCRUYsXG4gICAgLy8gJ0NKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MkY4MDAgJiYgY2hhciA8PSAweDJGQTFGLFxuICAgIC8vICdUYWdzJzogKGNoYXIpID0+IGNoYXIgPj0gMHhFMDAwMCAmJiBjaGFyIDw9IDB4RTAwN0YsXG4gICAgLy8gJ1ZhcmlhdGlvbiBTZWxlY3RvcnMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4RTAxMDAgJiYgY2hhciA8PSAweEUwMUVGLFxuICAgIC8vICdTdXBwbGVtZW50YXJ5IFByaXZhdGUgVXNlIEFyZWEtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4RjAwMDAgJiYgY2hhciA8PSAweEZGRkZGLFxuICAgIC8vICdTdXBwbGVtZW50YXJ5IFByaXZhdGUgVXNlIEFyZWEtQic6IChjaGFyKSA9PiBjaGFyID49IDB4MTAwMDAwICYmIGNoYXIgPD0gMHgxMEZGRkYsXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVuaWNvZGVCbG9ja0xvb2t1cDtcbiIsIi8vICAgICAgXG5cbi8qKlxuICogQSBbbGVhc3QtcmVjZW50bHktdXNlZCBjYWNoZV0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYWNoZV9hbGdvcml0aG1zKVxuICogd2l0aCBoYXNoIGxvb2t1cCBtYWRlIHBvc3NpYmxlIGJ5IGtlZXBpbmcgYSBsaXN0IG9mIGtleXMgaW4gcGFyYWxsZWwgdG9cbiAqIGFuIGFycmF5IG9mIGRpY3Rpb25hcnkgb2YgdmFsdWVzXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgTFJVQ2FjaGUgICAge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heCBudW1iZXIgb2YgcGVybWl0dGVkIHZhbHVlc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVtb3ZlIGNhbGxiYWNrIGNhbGxlZCB3aXRoIGl0ZW1zIHdoZW4gdGhleSBleHBpcmVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtYXggICAgICAgICwgb25SZW1vdmUgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMubWF4ID0gbWF4O1xuICAgICAgICB0aGlzLm9uUmVtb3ZlID0gb25SZW1vdmU7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciB0aGUgY2FjaGVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtMUlVDYWNoZX0gdGhpcyBjYWNoZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5vblJlbW92ZSh0aGlzLmRhdGFba2V5XSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5vcmRlciA9IFtdO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGtleSwgdmFsdWUgY29tYmluYXRpb24gdG8gdGhlIGNhY2hlLCB0cmltbWluZyBpdHMgc2l6ZSBpZiB0aGlzIHB1c2hlc1xuICAgICAqIGl0IG92ZXIgbWF4IGxlbmd0aC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgbG9va3VwIGtleSBmb3IgdGhlIGl0ZW1cbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgYW55IHZhbHVlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TFJVQ2FjaGV9IHRoaXMgY2FjaGVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGFkZChrZXkgICAgICAgICwgZGF0YSAgICkge1xuXG4gICAgICAgIGlmICh0aGlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLm9yZGVyLnNwbGljZSh0aGlzLm9yZGVyLmluZGV4T2Yoa2V5KSwgMSk7XG4gICAgICAgICAgICB0aGlzLmRhdGFba2V5XSA9IGRhdGE7XG4gICAgICAgICAgICB0aGlzLm9yZGVyLnB1c2goa2V5KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXRhW2tleV0gPSBkYXRhO1xuICAgICAgICAgICAgdGhpcy5vcmRlci5wdXNoKGtleSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9yZGVyLmxlbmd0aCA+IHRoaXMubWF4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlZERhdGEgPSB0aGlzLmdldEFuZFJlbW92ZSh0aGlzLm9yZGVyWzBdKTtcbiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlZERhdGEpIHRoaXMub25SZW1vdmUocmVtb3ZlZERhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHZhbHVlIGF0dGFjaGVkIHRvIGBrZXlgIGlzIHByZXNlbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdGhlIGtleSB0byBiZSBsb29rZWQtdXBcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGUgY2FjaGUgaGFzIHRoaXMgdmFsdWVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGhhcyhrZXkgICAgICAgICkgICAgICAgICAge1xuICAgICAgICByZXR1cm4ga2V5IGluIHRoaXMuZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBrZXlzIGluIHRoZSBjYWNoZVxuICAgICAqXG4gICAgICogQHJldHVybnMge0FycmF5PHN0cmluZz59IGFuIGFycmF5IG9mIGtleXMgaW4gdGhpcyBjYWNoZS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGtleXMoKSAgICAgICAgICAgICAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgYXR0YWNoZWQgdG8gYSBzcGVjaWZpYyBrZXkgYW5kIHJlbW92ZSBkYXRhIGZyb20gY2FjaGUuXG4gICAgICogSWYgdGhlIGtleSBpcyBub3QgZm91bmQsIHJldHVybnMgYG51bGxgXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRoZSBrZXkgdG8gbG9vayB1cFxuICAgICAqIEByZXR1cm5zIHsqfSB0aGUgZGF0YSwgb3IgbnVsbCBpZiBpdCBpc24ndCBmb3VuZFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0QW5kUmVtb3ZlKGtleSAgICAgICAgKSAgICAge1xuICAgICAgICBpZiAoIXRoaXMuaGFzKGtleSkpIHsgcmV0dXJuIG51bGw7IH1cblxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhW2tleV07XG5cbiAgICAgICAgZGVsZXRlIHRoaXMuZGF0YVtrZXldO1xuICAgICAgICB0aGlzLm9yZGVyLnNwbGljZSh0aGlzLm9yZGVyLmluZGV4T2Yoa2V5KSwgMSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBhdHRhY2hlZCB0byBhIHNwZWNpZmljIGtleSB3aXRob3V0IHJlbW92aW5nIGRhdGFcbiAgICAgKiBmcm9tIHRoZSBjYWNoZS4gSWYgdGhlIGtleSBpcyBub3QgZm91bmQsIHJldHVybnMgYG51bGxgXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRoZSBrZXkgdG8gbG9vayB1cFxuICAgICAqIEByZXR1cm5zIHsqfSB0aGUgZGF0YSwgb3IgbnVsbCBpZiBpdCBpc24ndCBmb3VuZFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0KGtleSAgICAgICAgKSAgICAge1xuICAgICAgICBpZiAoIXRoaXMuaGFzKGtleSkpIHsgcmV0dXJuIG51bGw7IH1cblxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhW2tleV07XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGtleS92YWx1ZSBjb21iaW5hdGlvbiBmcm9tIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdGhlIGtleSBmb3IgdGhlIHBhaXIgdG8gZGVsZXRlXG4gICAgICogQHJldHVybnMge0xSVUNhY2hlfSB0aGlzIGNhY2hlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICByZW1vdmUoa2V5ICAgICAgICApIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhcyhrZXkpKSB7IHJldHVybiB0aGlzOyB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YVtrZXldO1xuICAgICAgICBkZWxldGUgdGhpcy5kYXRhW2tleV07XG4gICAgICAgIHRoaXMub25SZW1vdmUoZGF0YSk7XG4gICAgICAgIHRoaXMub3JkZXIuc3BsaWNlKHRoaXMub3JkZXIuaW5kZXhPZihrZXkpLCAxKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIG1heCBzaXplIG9mIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXggdGhlIG1heCBzaXplIG9mIHRoZSBjYWNoZVxuICAgICAqIEByZXR1cm5zIHtMUlVDYWNoZX0gdGhpcyBjYWNoZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc2V0TWF4U2l6ZShtYXggICAgICAgICkgICAgICAgICAgICAgIHtcbiAgICAgICAgdGhpcy5tYXggPSBtYXg7XG5cbiAgICAgICAgd2hpbGUgKHRoaXMub3JkZXIubGVuZ3RoID4gdGhpcy5tYXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWREYXRhID0gdGhpcy5nZXRBbmRSZW1vdmUodGhpcy5vcmRlclswXSk7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZERhdGEpIHRoaXMub25SZW1vdmUocmVtb3ZlZERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IExSVUNhY2hlO1xuIiwiLy8gICAgICBcblxuY29uc3QgY29uZmlnID0gcmVxdWlyZSgnLi9jb25maWcnKTtcbmNvbnN0IGJyb3dzZXIgPSByZXF1aXJlKCcuL2Jyb3dzZXInKTtcblxuY29uc3QgaGVscCA9ICdTZWUgaHR0cHM6Ly93d3cubWFwYm94LmNvbS9hcGktZG9jdW1lbnRhdGlvbi8jYWNjZXNzLXRva2Vucyc7XG5cbiAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgIFxuXG5mdW5jdGlvbiBtYWtlQVBJVVJMKHVybE9iamVjdCAgICAgICAgICAgLCBhY2Nlc3NUb2tlbiAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAge1xuICAgIGNvbnN0IGFwaVVybE9iamVjdCA9IHBhcnNlVXJsKGNvbmZpZy5BUElfVVJMKTtcbiAgICB1cmxPYmplY3QucHJvdG9jb2wgPSBhcGlVcmxPYmplY3QucHJvdG9jb2w7XG4gICAgdXJsT2JqZWN0LmF1dGhvcml0eSA9IGFwaVVybE9iamVjdC5hdXRob3JpdHk7XG5cbiAgICBpZiAoYXBpVXJsT2JqZWN0LnBhdGggIT09ICcvJykge1xuICAgICAgICB1cmxPYmplY3QucGF0aCA9IGAke2FwaVVybE9iamVjdC5wYXRofSR7dXJsT2JqZWN0LnBhdGh9YDtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5SRVFVSVJFX0FDQ0VTU19UT0tFTikgcmV0dXJuIGZvcm1hdFVybCh1cmxPYmplY3QpO1xuXG4gICAgYWNjZXNzVG9rZW4gPSBhY2Nlc3NUb2tlbiB8fCBjb25maWcuQUNDRVNTX1RPS0VOO1xuICAgIGlmICghYWNjZXNzVG9rZW4pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQW4gQVBJIGFjY2VzcyB0b2tlbiBpcyByZXF1aXJlZCB0byB1c2UgTWFwYm94IEdMLiAke2hlbHB9YCk7XG4gICAgaWYgKGFjY2Vzc1Rva2VuWzBdID09PSAncycpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVXNlIGEgcHVibGljIGFjY2VzcyB0b2tlbiAocGsuKikgd2l0aCBNYXBib3ggR0wsIG5vdCBhIHNlY3JldCBhY2Nlc3MgdG9rZW4gKHNrLiopLiAke2hlbHB9YCk7XG5cbiAgICB1cmxPYmplY3QucGFyYW1zLnB1c2goYGFjY2Vzc190b2tlbj0ke2FjY2Vzc1Rva2VufWApO1xuICAgIHJldHVybiBmb3JtYXRVcmwodXJsT2JqZWN0KTtcbn1cblxuZnVuY3Rpb24gaXNNYXBib3hVUkwodXJsICAgICAgICApIHtcbiAgICByZXR1cm4gdXJsLmluZGV4T2YoJ21hcGJveDonKSA9PT0gMDtcbn1cblxuZXhwb3J0cy5pc01hcGJveFVSTCA9IGlzTWFwYm94VVJMO1xuXG5leHBvcnRzLm5vcm1hbGl6ZVN0eWxlVVJMID0gZnVuY3Rpb24odXJsICAgICAgICAsIGFjY2Vzc1Rva2VuICAgICAgICAgKSAgICAgICAgIHtcbiAgICBpZiAoIWlzTWFwYm94VVJMKHVybCkpIHJldHVybiB1cmw7XG4gICAgY29uc3QgdXJsT2JqZWN0ID0gcGFyc2VVcmwodXJsKTtcbiAgICB1cmxPYmplY3QucGF0aCA9IGAvc3R5bGVzL3YxJHt1cmxPYmplY3QucGF0aH1gO1xuICAgIHJldHVybiBtYWtlQVBJVVJMKHVybE9iamVjdCwgYWNjZXNzVG9rZW4pO1xufTtcblxuZXhwb3J0cy5ub3JtYWxpemVHbHlwaHNVUkwgPSBmdW5jdGlvbih1cmwgICAgICAgICwgYWNjZXNzVG9rZW4gICAgICAgICApICAgICAgICAge1xuICAgIGlmICghaXNNYXBib3hVUkwodXJsKSkgcmV0dXJuIHVybDtcbiAgICBjb25zdCB1cmxPYmplY3QgPSBwYXJzZVVybCh1cmwpO1xuICAgIHVybE9iamVjdC5wYXRoID0gYC9mb250cy92MSR7dXJsT2JqZWN0LnBhdGh9YDtcbiAgICByZXR1cm4gbWFrZUFQSVVSTCh1cmxPYmplY3QsIGFjY2Vzc1Rva2VuKTtcbn07XG5cbmV4cG9ydHMubm9ybWFsaXplU291cmNlVVJMID0gZnVuY3Rpb24odXJsICAgICAgICAsIGFjY2Vzc1Rva2VuICAgICAgICAgKSAgICAgICAgIHtcbiAgICBpZiAoIWlzTWFwYm94VVJMKHVybCkpIHJldHVybiB1cmw7XG4gICAgY29uc3QgdXJsT2JqZWN0ID0gcGFyc2VVcmwodXJsKTtcbiAgICB1cmxPYmplY3QucGF0aCA9IGAvdjQvJHt1cmxPYmplY3QuYXV0aG9yaXR5fS5qc29uYDtcbiAgICAvLyBUaWxlSlNPTiByZXF1ZXN0cyBuZWVkIGEgc2VjdXJlIGZsYWcgYXBwZW5kZWQgdG8gdGhlaXIgVVJMcyBzb1xuICAgIC8vIHRoYXQgdGhlIHNlcnZlciBrbm93cyB0byBzZW5kIFNTTC1pZmllZCByZXNvdXJjZSByZWZlcmVuY2VzLlxuICAgIHVybE9iamVjdC5wYXJhbXMucHVzaCgnc2VjdXJlJyk7XG4gICAgcmV0dXJuIG1ha2VBUElVUkwodXJsT2JqZWN0LCBhY2Nlc3NUb2tlbik7XG59O1xuXG5leHBvcnRzLm5vcm1hbGl6ZVNwcml0ZVVSTCA9IGZ1bmN0aW9uKHVybCAgICAgICAgLCBmb3JtYXQgICAgICAgICwgZXh0ZW5zaW9uICAgICAgICAsIGFjY2Vzc1Rva2VuICAgICAgICAgKSAgICAgICAgIHtcbiAgICBjb25zdCB1cmxPYmplY3QgPSBwYXJzZVVybCh1cmwpO1xuICAgIGlmICghaXNNYXBib3hVUkwodXJsKSkge1xuICAgICAgICB1cmxPYmplY3QucGF0aCArPSBgJHtmb3JtYXR9JHtleHRlbnNpb259YDtcbiAgICAgICAgcmV0dXJuIGZvcm1hdFVybCh1cmxPYmplY3QpO1xuICAgIH1cbiAgICB1cmxPYmplY3QucGF0aCA9IGAvc3R5bGVzL3YxJHt1cmxPYmplY3QucGF0aH0vc3ByaXRlJHtmb3JtYXR9JHtleHRlbnNpb259YDtcbiAgICByZXR1cm4gbWFrZUFQSVVSTCh1cmxPYmplY3QsIGFjY2Vzc1Rva2VuKTtcbn07XG5cbmNvbnN0IGltYWdlRXh0ZW5zaW9uUmUgPSAvKFxcLihwbmd8anBnKVxcZCopKD89JCkvO1xuXG5leHBvcnRzLm5vcm1hbGl6ZVRpbGVVUkwgPSBmdW5jdGlvbih0aWxlVVJMICAgICAgICAsIHNvdXJjZVVSTCAgICAgICAgICAsIHRpbGVTaXplICAgICAgICAgICkgICAgICAgICB7XG4gICAgaWYgKCFzb3VyY2VVUkwgfHwgIWlzTWFwYm94VVJMKHNvdXJjZVVSTCkpIHJldHVybiB0aWxlVVJMO1xuXG4gICAgY29uc3QgdXJsT2JqZWN0ID0gcGFyc2VVcmwodGlsZVVSTCk7XG5cbiAgICAvLyBUaGUgdjQgbWFwYm94IHRpbGUgQVBJIHN1cHBvcnRzIDUxMng1MTIgaW1hZ2UgdGlsZXMgb25seSB3aGVuIEAyeFxuICAgIC8vIGlzIGFwcGVuZGVkIHRvIHRoZSB0aWxlIFVSTC4gSWYgYHRpbGVTaXplOiA1MTJgIGlzIHNwZWNpZmllZCBmb3JcbiAgICAvLyBhIE1hcGJveCByYXN0ZXIgc291cmNlIGZvcmNlIHRoZSBAMnggc3VmZml4IGV2ZW4gaWYgYSBub24gaGlkcGkgZGV2aWNlLlxuICAgIGNvbnN0IHN1ZmZpeCA9IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyA+PSAyIHx8IHRpbGVTaXplID09PSA1MTIgPyAnQDJ4JyA6ICcnO1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IGJyb3dzZXIuc3VwcG9ydHNXZWJwID8gJy53ZWJwJyA6ICckMSc7XG4gICAgdXJsT2JqZWN0LnBhdGggPSB1cmxPYmplY3QucGF0aC5yZXBsYWNlKGltYWdlRXh0ZW5zaW9uUmUsIGAke3N1ZmZpeH0ke2V4dGVuc2lvbn1gKTtcblxuICAgIHJlcGxhY2VUZW1wQWNjZXNzVG9rZW4odXJsT2JqZWN0LnBhcmFtcyk7XG4gICAgcmV0dXJuIGZvcm1hdFVybCh1cmxPYmplY3QpO1xufTtcblxuZnVuY3Rpb24gcmVwbGFjZVRlbXBBY2Nlc3NUb2tlbihwYXJhbXMgICAgICAgICAgICAgICApIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGFyYW1zW2ldLmluZGV4T2YoJ2FjY2Vzc190b2tlbj10ay4nKSA9PT0gMCkge1xuICAgICAgICAgICAgcGFyYW1zW2ldID0gYGFjY2Vzc190b2tlbj0ke2NvbmZpZy5BQ0NFU1NfVE9LRU4gfHwgJyd9YDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3QgdXJsUmUgPSAvXihcXHcrKTpcXC9cXC8oW14vP10qKShcXC9bXj9dKyk/XFw/PyguKyk/LztcblxuZnVuY3Rpb24gcGFyc2VVcmwodXJsICAgICAgICApICAgICAgICAgICAge1xuICAgIGNvbnN0IHBhcnRzID0gdXJsLm1hdGNoKHVybFJlKTtcbiAgICBpZiAoIXBhcnRzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIFVSTCBvYmplY3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJvdG9jb2w6IHBhcnRzWzFdLFxuICAgICAgICBhdXRob3JpdHk6IHBhcnRzWzJdLFxuICAgICAgICBwYXRoOiBwYXJ0c1szXSB8fCAnLycsXG4gICAgICAgIHBhcmFtczogcGFydHNbNF0gPyBwYXJ0c1s0XS5zcGxpdCgnJicpIDogW11cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVcmwob2JqICAgICAgICAgICApICAgICAgICAge1xuICAgIGNvbnN0IHBhcmFtcyA9IG9iai5wYXJhbXMubGVuZ3RoID8gYD8ke29iai5wYXJhbXMuam9pbignJicpfWAgOiAnJztcbiAgICByZXR1cm4gYCR7b2JqLnByb3RvY29sfTovLyR7b2JqLmF1dGhvcml0eX0ke29iai5wYXRofSR7cGFyYW1zfWA7XG59XG4iLCIvLyAgICAgIFxuXG4vLyBXcmFwcyBwZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlOYW1lIHRvIGZhY2lsaXRhdGUgdGVzdGluZ1xuLy8gTm90IGluY29ycG9yYXRlZCBpbnRvIGJyb3dzZXIuanMgYmVjYXVzZSB0aGUgbGF0dGVyIGlzIHBvaXNvbm91cyB3aGVuIHVzZWQgb3V0c2lkZSB0aGUgbWFpbiB0aHJlYWRcbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGdldEVudHJpZXNCeU5hbWU6ICh1cmwgICAgICAgICkgPT4ge1xuICAgICAgICBpZiAocGVyZm9ybWFuY2UgJiYgcGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5TmFtZSlcbiAgICAgICAgICAgIHJldHVybiBwZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlOYW1lKHVybCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuIiwiLy8gICAgICBcblxuLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuXG5jb25zdCBpc0NoYXIgPSByZXF1aXJlKCcuL2lzX2NoYXJfaW5fdW5pY29kZV9ibG9jaycpO1xuXG5tb2R1bGUuZXhwb3J0cy5hbGxvd3NJZGVvZ3JhcGhpY0JyZWFraW5nID0gZnVuY3Rpb24oY2hhcnMgICAgICAgICkge1xuICAgIGZvciAoY29uc3QgY2hhciBvZiBjaGFycykge1xuICAgICAgICBpZiAoIWV4cG9ydHMuY2hhckFsbG93c0lkZW9ncmFwaGljQnJlYWtpbmcoY2hhci5jaGFyQ29kZUF0KDApKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLmFsbG93c1ZlcnRpY2FsV3JpdGluZ01vZGUgPSBmdW5jdGlvbihjaGFycyAgICAgICAgKSB7XG4gICAgZm9yIChjb25zdCBjaGFyIG9mIGNoYXJzKSB7XG4gICAgICAgIGlmIChleHBvcnRzLmNoYXJIYXNVcHJpZ2h0VmVydGljYWxPcmllbnRhdGlvbihjaGFyLmNoYXJDb2RlQXQoMCkpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMuYWxsb3dzTGV0dGVyU3BhY2luZyA9IGZ1bmN0aW9uKGNoYXJzICAgICAgICApIHtcbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgY2hhcnMpIHtcbiAgICAgICAgaWYgKCFleHBvcnRzLmNoYXJBbGxvd3NMZXR0ZXJTcGFjaW5nKGNoYXIuY2hhckNvZGVBdCgwKSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5jaGFyQWxsb3dzTGV0dGVyU3BhY2luZyA9IGZ1bmN0aW9uKGNoYXIgICAgICAgICkge1xuICAgIGlmIChpc0NoYXJbJ0FyYWJpYyddKGNoYXIpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGlzQ2hhclsnQXJhYmljIFN1cHBsZW1lbnQnXShjaGFyKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpc0NoYXJbJ0FyYWJpYyBFeHRlbmRlZC1BJ10oY2hhcikpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaXNDaGFyWydBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUEnXShjaGFyKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpc0NoYXJbJ0FyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQiddKGNoYXIpKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLmNoYXJBbGxvd3NJZGVvZ3JhcGhpY0JyZWFraW5nID0gZnVuY3Rpb24oY2hhciAgICAgICAgKSB7XG4gICAgLy8gUmV0dXJuIGVhcmx5IGZvciBjaGFyYWN0ZXJzIG91dHNpZGUgYWxsIGlkZW9ncmFwaGljIHJhbmdlcy5cbiAgICBpZiAoY2hhciA8IDB4MkU4MCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKGlzQ2hhclsnQm9wb21vZm8gRXh0ZW5kZWQnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQm9wb21vZm8nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgQ29tcGF0aWJpbGl0eSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgUmFkaWNhbHMgU3VwcGxlbWVudCddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgU3Ryb2tlcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgVW5pZmllZCBJZGVvZ3JhcGhzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0VuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGlyYWdhbmEnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVycyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYW5neGkgUmFkaWNhbHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9ucyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYXRha2FuYSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydWZXJ0aWNhbCBGb3JtcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaSBSYWRpY2FscyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaSBTeWxsYWJsZXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vLyBUaGUgZm9sbG93aW5nIGxvZ2ljIGNvbWVzIGZyb21cbi8vIDxodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy92ZXJ0aWNhbC9yZXZpc2lvbi0xNy9WZXJ0aWNhbE9yaWVudGF0aW9uLTE3LnR4dD4uXG4vLyBUaGUgZGF0YSBmaWxlIGRlbm90ZXMgd2l0aCDigJxV4oCdIG9yIOKAnFR14oCdIGFueSBjb2RlcG9pbnQgdGhhdCBtYXkgYmUgZHJhd25cbi8vIHVwcmlnaHQgaW4gdmVydGljYWwgdGV4dCBidXQgZG9lcyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiB1cHJpZ2h0IGFuZFxuLy8g4oCcbmV1dHJhbOKAnSBjaGFyYWN0ZXJzLlxuXG4vLyBCbG9ja3MgaW4gdGhlIFVuaWNvZGUgc3VwcGxlbWVudGFyeSBwbGFuZXMgYXJlIGV4Y2x1ZGVkIGZyb20gdGhpcyBtb2R1bGUgZHVlXG4vLyB0byA8aHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wvaXNzdWVzLzI5Pi5cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIFVuaWNvZGUgY29kZXBvaW50IGlkZW50aWZpZXMgYSBjaGFyYWN0ZXIgd2l0aFxuICogdXByaWdodCBvcmllbnRhdGlvbi5cbiAqXG4gKiBBIGNoYXJhY3RlciBoYXMgdXByaWdodCBvcmllbnRhdGlvbiBpZiBpdCBpcyBkcmF3biB1cHJpZ2h0ICh1bnJvdGF0ZWQpXG4gKiB3aGV0aGVyIHRoZSBsaW5lIGlzIG9yaWVudGVkIGhvcml6b250YWxseSBvciB2ZXJ0aWNhbGx5LCBldmVuIGlmIGJvdGhcbiAqIGFkamFjZW50IGNoYXJhY3RlcnMgY2FuIGJlIHJvdGF0ZWQuIEZvciBleGFtcGxlLCBhIENoaW5lc2UgY2hhcmFjdGVyIGlzXG4gKiBhbHdheXMgZHJhd24gdXByaWdodC4gQW4gdXByaWdodGx5IG9yaWVudGVkIGNoYXJhY3RlciBjYXVzZXMgYW4gYWRqYWNlbnRcbiAqIOKAnG5ldXRyYWzigJ0gY2hhcmFjdGVyIHRvIGJlIGRyYXduIHVwcmlnaHQgYXMgd2VsbC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuY2hhckhhc1VwcmlnaHRWZXJ0aWNhbE9yaWVudGF0aW9uID0gZnVuY3Rpb24oY2hhciAgICAgICAgKSB7XG4gICAgaWYgKGNoYXIgPT09IDB4MDJFQSAvKiBtb2RpZmllciBsZXR0ZXIgeWluIGRlcGFydGluZyB0b25lIG1hcmsgKi8gfHxcbiAgICAgICAgY2hhciA9PT0gMHgwMkVCIC8qIG1vZGlmaWVyIGxldHRlciB5YW5nIGRlcGFydGluZyB0b25lIG1hcmsgKi8pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGVhcmx5IGZvciBjaGFyYWN0ZXJzIG91dHNpZGUgYWxsIHJhbmdlcyB3aG9zZSBjaGFyYWN0ZXJzIHJlbWFpblxuICAgIC8vIHVwcmlnaHQgaW4gdmVydGljYWwgd3JpdGluZyBtb2RlLlxuICAgIGlmIChjaGFyIDwgMHgxMTAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoaXNDaGFyWydCb3BvbW9mbyBFeHRlbmRlZCddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydCb3BvbW9mbyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgQ29tcGF0aWJpbGl0eSBGb3JtcyddKGNoYXIpKSB7XG4gICAgICAgIGlmICghKGNoYXIgPj0gMHhGRTQ5IC8qIGRhc2hlZCBvdmVybGluZSAqLyAmJiBjaGFyIDw9IDB4RkU0RiAvKiB3YXZ5IGxvdyBsaW5lICovKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgQ29tcGF0aWJpbGl0eSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgUmFkaWNhbHMgU3VwcGxlbWVudCddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgU3Ryb2tlcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24nXShjaGFyKSkge1xuICAgICAgICBpZiAoIShjaGFyID49IDB4MzAwOCAvKiBsZWZ0IGFuZ2xlIGJyYWNrZXQgKi8gJiYgY2hhciA8PSAweDMwMTEgLyogcmlnaHQgYmxhY2sgbGVudGljdWxhciBicmFja2V0ICovKSAmJlxuICAgICAgICAgICAgIShjaGFyID49IDB4MzAxNCAvKiBsZWZ0IHRvcnRvaXNlIHNoZWxsIGJyYWNrZXQgKi8gJiYgY2hhciA8PSAweDMwMUYgLyogbG93IGRvdWJsZSBwcmltZSBxdW90YXRpb24gbWFyayAqLykgJiZcbiAgICAgICAgICAgIGNoYXIgIT09IDB4MzAzMCAvKiB3YXZ5IGRhc2ggKi8pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEEnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydFbmNsb3NlZCBDSksgTGV0dGVycyBhbmQgTW9udGhzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0hhbmd1bCBDb21wYXRpYmlsaXR5IEphbW8nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFuZ3VsIEphbW8gRXh0ZW5kZWQtQSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydIYW5ndWwgSmFtbyBFeHRlbmRlZC1CJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0hhbmd1bCBKYW1vJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0hhbmd1bCBTeWxsYWJsZXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGlyYWdhbmEnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVycyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYW5idW4nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnS2FuZ3hpIFJhZGljYWxzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0thdGFrYW5hIFBob25ldGljIEV4dGVuc2lvbnMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnS2F0YWthbmEnXShjaGFyKSkge1xuICAgICAgICBpZiAoY2hhciAhPT0gMHgzMEZDIC8qIGthdGFrYW5hLWhpcmFnYW5hIHByb2xvbmdlZCBzb3VuZCBtYXJrICovKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFyWydIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3JtcyddKGNoYXIpKSB7XG4gICAgICAgIGlmIChjaGFyICE9PSAweEZGMDggLyogZnVsbHdpZHRoIGxlZnQgcGFyZW50aGVzaXMgKi8gJiZcbiAgICAgICAgICAgIGNoYXIgIT09IDB4RkYwOSAvKiBmdWxsd2lkdGggcmlnaHQgcGFyZW50aGVzaXMgKi8gJiZcbiAgICAgICAgICAgIGNoYXIgIT09IDB4RkYwRCAvKiBmdWxsd2lkdGggaHlwaGVuLW1pbnVzICovICYmXG4gICAgICAgICAgICAhKGNoYXIgPj0gMHhGRjFBIC8qIGZ1bGx3aWR0aCBjb2xvbiAqLyAmJiBjaGFyIDw9IDB4RkYxRSAvKiBmdWxsd2lkdGggZ3JlYXRlci10aGFuIHNpZ24gKi8pICYmXG4gICAgICAgICAgICBjaGFyICE9PSAweEZGM0IgLyogZnVsbHdpZHRoIGxlZnQgc3F1YXJlIGJyYWNrZXQgKi8gJiZcbiAgICAgICAgICAgIGNoYXIgIT09IDB4RkYzRCAvKiBmdWxsd2lkdGggcmlnaHQgc3F1YXJlIGJyYWNrZXQgKi8gJiZcbiAgICAgICAgICAgIGNoYXIgIT09IDB4RkYzRiAvKiBmdWxsd2lkdGggbG93IGxpbmUgKi8gJiZcbiAgICAgICAgICAgICEoY2hhciA+PSAweEZGNUIgLyogZnVsbHdpZHRoIGxlZnQgY3VybHkgYnJhY2tldCAqLyAmJiBjaGFyIDw9IDB4RkZERikgJiZcbiAgICAgICAgICAgIGNoYXIgIT09IDB4RkZFMyAvKiBmdWxsd2lkdGggbWFjcm9uICovICYmXG4gICAgICAgICAgICAhKGNoYXIgPj0gMHhGRkU4IC8qIGhhbGZ3aWR0aCBmb3JtcyBsaWdodCB2ZXJ0aWNhbCAqLyAmJiBjaGFyIDw9IDB4RkZFRikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ1NtYWxsIEZvcm0gVmFyaWFudHMnXShjaGFyKSkge1xuICAgICAgICBpZiAoIShjaGFyID49IDB4RkU1OCAvKiBzbWFsbCBlbSBkYXNoICovICYmIGNoYXIgPD0gMHhGRTVFIC8qIHNtYWxsIHJpZ2h0IHRvcnRvaXNlIHNoZWxsIGJyYWNrZXQgKi8pICYmXG4gICAgICAgICAgICAhKGNoYXIgPj0gMHhGRTYzIC8qIHNtYWxsIGh5cGhlbi1taW51cyAqLyAmJiBjaGFyIDw9IDB4RkU2NiAvKiBzbWFsbCBlcXVhbHMgc2lnbiAqLykpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ1VuaWZpZWQgQ2FuYWRpYW4gQWJvcmlnaW5hbCBTeWxsYWJpY3MnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyBFeHRlbmRlZCddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydWZXJ0aWNhbCBGb3JtcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaWppbmcgSGV4YWdyYW0gU3ltYm9scyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaSBTeWxsYWJsZXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnWWkgUmFkaWNhbHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gVW5pY29kZSBjb2RlcG9pbnQgaWRlbnRpZmllcyBhIGNoYXJhY3RlciB3aXRoXG4gKiBuZXV0cmFsIG9yaWVudGF0aW9uLlxuICpcbiAqIEEgY2hhcmFjdGVyIGhhcyBuZXV0cmFsIG9yaWVudGF0aW9uIGlmIGl0IG1heSBiZSBkcmF3biByb3RhdGVkIG9yIHVucm90YXRlZFxuICogd2hlbiB0aGUgbGluZSBpcyBvcmllbnRlZCB2ZXJ0aWNhbGx5LCBkZXBlbmRpbmcgb24gdGhlIG9yaWVudGF0aW9uIG9mIHRoZVxuICogYWRqYWNlbnQgY2hhcmFjdGVycy4gRm9yIGV4YW1wbGUsIGFsb25nIGEgdmVydGljbGx5IG9yaWVudGVkIGxpbmUsIHRoZSB2dWxnYXJcbiAqIGZyYWN0aW9uIMK9IGlzIGRyYXduIHVwcmlnaHQgYW1vbmcgQ2hpbmVzZSBjaGFyYWN0ZXJzIGJ1dCByb3RhdGVkIGFtb25nIExhdGluXG4gKiBsZXR0ZXJzLiBBIG5ldXRyYWxseSBvcmllbnRlZCBjaGFyYWN0ZXIgZG9lcyBub3QgaW5mbHVlbmNlIHdoZXRoZXIgYW5cbiAqIGFkamFjZW50IGNoYXJhY3RlciBpcyBkcmF3biB1cHJpZ2h0IG9yIHJvdGF0ZWQuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLmNoYXJIYXNOZXV0cmFsVmVydGljYWxPcmllbnRhdGlvbiA9IGZ1bmN0aW9uKGNoYXIgICAgICAgICkge1xuICAgIGlmIChpc0NoYXJbJ0xhdGluLTEgU3VwcGxlbWVudCddKGNoYXIpKSB7XG4gICAgICAgIGlmIChjaGFyID09PSAweDAwQTcgLyogc2VjdGlvbiBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwQTkgLyogY29weXJpZ2h0IHNpZ24gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBBRSAvKiByZWdpc3RlcmVkIHNpZ24gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBCMSAvKiBwbHVzLW1pbnVzIHNpZ24gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBCQyAvKiB2dWxnYXIgZnJhY3Rpb24gb25lIHF1YXJ0ZXIgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBCRCAvKiB2dWxnYXIgZnJhY3Rpb24gb25lIGhhbGYgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBCRSAvKiB2dWxnYXIgZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBENyAvKiBtdWx0aXBsaWNhdGlvbiBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwRjcgLyogZGl2aXNpb24gc2lnbiAqLykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnR2VuZXJhbCBQdW5jdHVhdGlvbiddKGNoYXIpKSB7XG4gICAgICAgIGlmIChjaGFyID09PSAweDIwMTYgLyogZG91YmxlIHZlcnRpY2FsIGxpbmUgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjAyMCAvKiBkYWdnZXIgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjAyMSAvKiBkb3VibGUgZGFnZ2VyICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwMzAgLyogcGVyIG1pbGxlIHNpZ24gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjAzMSAvKiBwZXIgdGVuIHRob3VzYW5kIHNpZ24gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjAzQiAvKiByZWZlcmVuY2UgbWFyayAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDNDIC8qIGRvdWJsZSBleGNsYW1hdGlvbiBtYXJrICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwNDIgLyogYXN0ZXJpc20gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjA0NyAvKiBkb3VibGUgcXVlc3Rpb24gbWFyayAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDQ4IC8qIHF1ZXN0aW9uIGV4Y2xhbWF0aW9uIG1hcmsgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjA0OSAvKiBleGNsYW1hdGlvbiBxdWVzdGlvbiBtYXJrICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwNTEgLyogdHdvIGFzdGVyaXNrcyBhbGlnbmVkIHZlcnRpY2FsbHkgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0xldHRlcmxpa2UgU3ltYm9scyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydOdW1iZXIgRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnTWlzY2VsbGFuZW91cyBUZWNobmljYWwnXShjaGFyKSkge1xuICAgICAgICBpZiAoKGNoYXIgPj0gMHgyMzAwIC8qIGRpYW1ldGVyIHNpZ24gKi8gJiYgY2hhciA8PSAweDIzMDcgLyogd2F2eSBsaW5lICovKSB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyMzBDIC8qIGJvdHRvbSByaWdodCBjcm9wICovICYmIGNoYXIgPD0gMHgyMzFGIC8qIGJvdHRvbSByaWdodCBjb3JuZXIgKi8pIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDIzMjQgLyogdXAgYXJyb3doZWFkIGJldHdlZW4gdHdvIGhvcml6b250YWwgYmFycyAqLyAmJiBjaGFyIDw9IDB4MjMyOCAvKiBrZXlib2FyZCAqLykgfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjMyQiAvKiBlcmFzZSB0byB0aGUgbGVmdCAqLyB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyMzdEIC8qIHNob3VsZGVyZWQgb3BlbiBib3ggKi8gJiYgY2hhciA8PSAweDIzOUEgLyogY2xlYXIgc2NyZWVuIHN5bWJvbCAqLykgfHxcbiAgICAgICAgICAgIChjaGFyID49IDB4MjNCRSAvKiBkZW50aXN0cnkgc3ltYm9sIGxpZ2h0IHZlcnRpY2FsIGFuZCB0b3AgcmlnaHQgKi8gJiYgY2hhciA8PSAweDIzQ0QgLyogc3F1YXJlIGZvb3QgKi8pIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIzQ0YgLyogZWplY3Qgc3ltYm9sICovIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDIzRDEgLyogbWV0cmljYWwgYnJldmUgKi8gJiYgY2hhciA8PSAweDIzREIgLyogZnVzZSAqLykgfHxcbiAgICAgICAgICAgIChjaGFyID49IDB4MjNFMiAvKiB3aGl0ZSB0cmFwZXppdW0gKi8gJiYgY2hhciA8PSAweDIzRkYpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFyWydDb250cm9sIFBpY3R1cmVzJ10oY2hhcikgJiYgY2hhciAhPT0gMHgyNDIzIC8qIG9wZW4gYm94ICovKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydPcHRpY2FsIENoYXJhY3RlciBSZWNvZ25pdGlvbiddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydFbmNsb3NlZCBBbHBoYW51bWVyaWNzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0dlb21ldHJpYyBTaGFwZXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnTWlzY2VsbGFuZW91cyBTeW1ib2xzJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKCEoY2hhciA+PSAweDI2MUEgLyogYmxhY2sgbGVmdCBwb2ludGluZyBpbmRleCAqLyAmJiBjaGFyIDw9IDB4MjYxRiAvKiB3aGl0ZSBkb3duIHBvaW50aW5nIGluZGV4ICovKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnTWlzY2VsbGFuZW91cyBTeW1ib2xzIGFuZCBBcnJvd3MnXShjaGFyKSkge1xuICAgICAgICBpZiAoKGNoYXIgPj0gMHgyQjEyIC8qIHNxdWFyZSB3aXRoIHRvcCBoYWxmIGJsYWNrICovICYmIGNoYXIgPD0gMHgyQjJGIC8qIHdoaXRlIHZlcnRpY2FsIGVsbGlwc2UgKi8pIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDJCNTAgLyogd2hpdGUgbWVkaXVtIHN0YXIgKi8gJiYgY2hhciA8PSAweDJCNTkgLyogaGVhdnkgY2lyY2xlZCBzYWx0aXJlICovKSB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyQkI4IC8qIHVwd2FyZHMgd2hpdGUgYXJyb3cgZnJvbSBiYXIgd2l0aCBob3Jpem9udGFsIGJhciAqLyAmJiBjaGFyIDw9IDB4MkJFQikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0NKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvbiddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYXRha2FuYSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydQcml2YXRlIFVzZSBBcmVhJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0NKSyBDb21wYXRpYmlsaXR5IEZvcm1zJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1NtYWxsIEZvcm0gVmFyaWFudHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG5cbiAgICBpZiAoY2hhciA9PT0gMHgyMjFFIC8qIGluZmluaXR5ICovIHx8XG4gICAgICAgIGNoYXIgPT09IDB4MjIzNCAvKiB0aGVyZWZvcmUgKi8gfHxcbiAgICAgICAgY2hhciA9PT0gMHgyMjM1IC8qIGJlY2F1c2UgKi8gfHxcbiAgICAgICAgKGNoYXIgPj0gMHgyNzAwIC8qIGJsYWNrIHNhZmV0eSBzY2lzc29ycyAqLyAmJiBjaGFyIDw9IDB4Mjc2NyAvKiByb3RhdGVkIGZsb3JhbCBoZWFydCBidWxsZXQgKi8pIHx8XG4gICAgICAgIChjaGFyID49IDB4Mjc3NiAvKiBkaW5nYmF0IG5lZ2F0aXZlIGNpcmNsZWQgZGlnaXQgb25lICovICYmIGNoYXIgPD0gMHgyNzkzIC8qIGRpbmdiYXQgbmVnYXRpdmUgY2lyY2xlZCBzYW5zLXNlcmlmIG51bWJlciB0ZW4gKi8pIHx8XG4gICAgICAgIGNoYXIgPT09IDB4RkZGQyAvKiBvYmplY3QgcmVwbGFjZW1lbnQgY2hhcmFjdGVyICovIHx8XG4gICAgICAgIGNoYXIgPT09IDB4RkZGRCAvKiByZXBsYWNlbWVudCBjaGFyYWN0ZXIgKi8pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIFVuaWNvZGUgY29kZXBvaW50IGlkZW50aWZpZXMgYSBjaGFyYWN0ZXIgd2l0aFxuICogcm90YXRlZCBvcmllbnRhdGlvbi5cbiAqXG4gKiBBIGNoYXJhY3RlciBoYXMgcm90YXRlZCBvcmllbnRhdGlvbiBpZiBpdCBpcyBkcmF3biByb3RhdGVkIHdoZW4gdGhlIGxpbmUgaXNcbiAqIG9yaWVudGVkIHZlcnRpY2FsbHksIGV2ZW4gaWYgYm90aCBhZGphY2VudCBjaGFyYWN0ZXJzIGFyZSB1cHJpZ2h0LiBGb3JcbiAqIGV4YW1wbGUsIGEgTGF0aW4gbGV0dGVyIGlzIGRyYXduIHJvdGF0ZWQgYWxvbmcgYSB2ZXJ0aWNhbCBsaW5lLiBBIHJvdGF0ZWRcbiAqIGNoYXJhY3RlciBjYXVzZXMgYW4gYWRqYWNlbnQg4oCcbmV1dHJhbOKAnSBjaGFyYWN0ZXIgdG8gYmUgZHJhd24gcm90YXRlZCBhcyB3ZWxsLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5jaGFySGFzUm90YXRlZFZlcnRpY2FsT3JpZW50YXRpb24gPSBmdW5jdGlvbihjaGFyICAgICAgICApIHtcbiAgICByZXR1cm4gIShleHBvcnRzLmNoYXJIYXNVcHJpZ2h0VmVydGljYWxPcmllbnRhdGlvbihjaGFyKSB8fFxuICAgICAgICAgICAgIGV4cG9ydHMuY2hhckhhc05ldXRyYWxWZXJ0aWNhbE9yaWVudGF0aW9uKGNoYXIpKTtcbn07XG4iLCIvLyAgICAgIFxuXG5jb25zdCBMbmdMYXQgPSByZXF1aXJlKCcuLi9nZW8vbG5nX2xhdCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuLyoqXG4gKiBHaXZlbiBhIExuZ0xhdCwgcHJpb3IgcHJvamVjdGVkIHBvc2l0aW9uLCBhbmQgYSB0cmFuc2Zvcm0sIHJldHVybiBhIG5ldyBMbmdMYXQgc2hpZnRlZFxuICogbiDDlyAzNjDCsCBlYXN0IG9yIHdlc3QgZm9yIHNvbWUgbiDiiaUgMCBzdWNoIHRoYXQ6XG4gKlxuICogKiB0aGUgcHJvamVjdGVkIGxvY2F0aW9uIG9mIHRoZSByZXN1bHQgaXMgb24gc2NyZWVuLCBpZiBwb3NzaWJsZSwgYW5kIHNlY29uZGFyaWx5OlxuICogKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwcm9qZWN0ZWQgbG9jYXRpb24gb2YgdGhlIHJlc3VsdCBhbmQgdGhlIHByaW9yIHBvc2l0aW9uXG4gKiAgIGlzIG1pbmltaXplZC5cbiAqXG4gKiBUaGUgb2JqZWN0IGlzIHRvIHByZXNlcnZlIHBlcmNlaXZlZCBvYmplY3QgY29uc3RhbmN5IGZvciBQb3B1cHMgYW5kIE1hcmtlcnMgYXMgbXVjaCBhc1xuICogcG9zc2libGU7IHRoZXkgc2hvdWxkIGF2b2lkIHNoaWZ0aW5nIGxhcmdlIGRpc3RhbmNlcyBhY3Jvc3MgdGhlIHNjcmVlbiwgZXZlbiB3aGVuIHRoZVxuICogbWFwIGNlbnRlciBjaGFuZ2VzIGJ5IMKxMzYwwrAgZHVlIHRvIGF1dG9tYXRpYyB3cmFwcGluZywgYW5kIHdoZW4gYWJvdXQgdG8gZ28gb2ZmIHNjcmVlbixcbiAqIHNob3VsZCB3cmFwIGp1c3QgZW5vdWdoIHRvIGF2b2lkIGRvaW5nIHNvLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obG5nTGF0ICAgICAgICAsIHByaW9yUG9zICAgICAgICAsIHRyYW5zZm9ybSAgICAgICAgICAgKSAgICAgICAgIHtcbiAgICBsbmdMYXQgPSBuZXcgTG5nTGF0KGxuZ0xhdC5sbmcsIGxuZ0xhdC5sYXQpO1xuXG4gICAgLy8gRmlyc3QsIHRyeSBzaGlmdGluZyBvbmUgd29ybGQgaW4gZWl0aGVyIGRpcmVjdGlvbiwgYW5kIHNlZSBpZiBlaXRoZXIgaXMgY2xvc2VyIHRvIHRoZVxuICAgIC8vIHByaW9yIHBvc2l0aW9uLiBUaGlzIHByZXNlcnZlcyBvYmplY3QgY29uc3RhbmN5IHdoZW4gdGhlIG1hcCBjZW50ZXIgaXMgYXV0by13cmFwcGVkXG4gICAgLy8gZHVyaW5nIGFuaW1hdGlvbnMuXG4gICAgaWYgKHByaW9yUG9zKSB7XG4gICAgICAgIGNvbnN0IGxlZnQgID0gbmV3IExuZ0xhdChsbmdMYXQubG5nIC0gMzYwLCBsbmdMYXQubGF0KTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBuZXcgTG5nTGF0KGxuZ0xhdC5sbmcgKyAzNjAsIGxuZ0xhdC5sYXQpO1xuICAgICAgICBjb25zdCBkZWx0YSA9IHRyYW5zZm9ybS5sb2NhdGlvblBvaW50KGxuZ0xhdCkuZGlzdFNxcihwcmlvclBvcyk7XG4gICAgICAgIGlmICh0cmFuc2Zvcm0ubG9jYXRpb25Qb2ludChsZWZ0KS5kaXN0U3FyKHByaW9yUG9zKSA8IGRlbHRhKSB7XG4gICAgICAgICAgICBsbmdMYXQgPSBsZWZ0O1xuICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybS5sb2NhdGlvblBvaW50KHJpZ2h0KS5kaXN0U3FyKHByaW9yUG9zKSA8IGRlbHRhKSB7XG4gICAgICAgICAgICBsbmdMYXQgPSByaWdodDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNlY29uZCwgd3JhcCB0b3dhcmQgdGhlIGNlbnRlciB1bnRpbCB0aGUgbmV3IHBvc2l0aW9uIGlzIG9uIHNjcmVlbiwgb3Igd2UgY2FuJ3QgZ2V0XG4gICAgLy8gYW55IGNsb3Nlci5cbiAgICB3aGlsZSAoTWF0aC5hYnMobG5nTGF0LmxuZyAtIHRyYW5zZm9ybS5jZW50ZXIubG5nKSA+IDE4MCkge1xuICAgICAgICBjb25zdCBwb3MgPSB0cmFuc2Zvcm0ubG9jYXRpb25Qb2ludChsbmdMYXQpO1xuICAgICAgICBpZiAocG9zLnggPj0gMCAmJiBwb3MueSA+PSAwICYmIHBvcy54IDw9IHRyYW5zZm9ybS53aWR0aCAmJiBwb3MueSA8PSB0cmFuc2Zvcm0uaGVpZ2h0KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAobG5nTGF0LmxuZyA+IHRyYW5zZm9ybS5jZW50ZXIubG5nKSB7XG4gICAgICAgICAgICBsbmdMYXQubG5nIC09IDM2MDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxuZ0xhdC5sbmcgKz0gMzYwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxuZ0xhdDtcbn07XG4iLCIvLyAgICAgIFxuXG4vLyBOb3RlOiBhbGwgXCJzaXplc1wiIGFyZSBtZWFzdXJlZCBpbiBieXRlc1xuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuY29uc3Qgdmlld1R5cGVzID0ge1xuICAgICdJbnQ4JzogSW50OEFycmF5LFxuICAgICdVaW50OCc6IFVpbnQ4QXJyYXksXG4gICAgJ0ludDE2JzogSW50MTZBcnJheSxcbiAgICAnVWludDE2JzogVWludDE2QXJyYXksXG4gICAgJ0ludDMyJzogSW50MzJBcnJheSxcbiAgICAnVWludDMyJzogVWludDMyQXJyYXksXG4gICAgJ0Zsb2F0MzInOiBGbG9hdDMyQXJyYXlcbn07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0IHtcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIG9uIHRoZSBwcm90b3R5cGUgb2Ygc3ViIGNsYXNzZXMuXG4gICAgICAgICAgICAgICAgIFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJ1Y3RBcnJheX0gc3RydWN0QXJyYXkgVGhlIFN0cnVjdEFycmF5IHRoZSBzdHJ1Y3QgaXMgc3RvcmVkIGluXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgc3RydWN0IGluIHRoZSBTdHJ1Y3RBcnJheS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHN0cnVjdEFycmF5ICAgICAgICAgICAgICwgaW5kZXggICAgICAgICkge1xuICAgICAgICAodGhpcyAgICAgKS5fc3RydWN0QXJyYXkgPSBzdHJ1Y3RBcnJheTtcbiAgICAgICAgdGhpcy5fcG9zMSA9IGluZGV4ICogdGhpcy5zaXplO1xuICAgICAgICB0aGlzLl9wb3MyID0gdGhpcy5fcG9zMSAvIDI7XG4gICAgICAgIHRoaXMuX3BvczQgPSB0aGlzLl9wb3MxIC8gNDtcbiAgICAgICAgdGhpcy5fcG9zOCA9IHRoaXMuX3BvczEgLyA4O1xuICAgIH1cbn1cblxuY29uc3QgREVGQVVMVF9DQVBBQ0lUWSA9IDEyODtcbmNvbnN0IFJFU0laRV9NVUxUSVBMSUVSID0gNTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcbiBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBcblxuLyoqXG4gKiBgU3RydWN0QXJyYXlgIHByb3ZpZGVzIGFuIGFic3RyYWN0aW9uIG92ZXIgYEFycmF5QnVmZmVyYCBhbmQgYFR5cGVkQXJyYXlgXG4gKiBtYWtpbmcgaXQgYmVoYXZlIGxpa2UgYW4gYXJyYXkgb2YgdHlwZWQgc3RydWN0cy5cbiAqXG4gKiBDb25jZXB0dWFsbHksIGEgU3RydWN0QXJyYXkgaXMgY29tcHJpc2VkIG9mIGVsZW1lbnRzLCBpLmUuLCBpbnN0YW5jZXMgb2YgaXRzXG4gKiBhc3NvY2lhdGVkIHN0cnVjdCB0eXBlLiBFYWNoIHBhcnRpY3VsYXIgc3RydWN0IHR5cGUsIHRvZ2V0aGVyIHdpdGggYW5cbiAqIGFsaWdubWVudCBzaXplLCBkZXRlcm1pbmVzIHRoZSBtZW1vcnkgbGF5b3V0IG9mIGEgU3RydWN0QXJyYXkgd2hvc2UgZWxlbWVudHNcbiAqIGFyZSBvZiB0aGF0IHR5cGUuICBUaHVzLCBmb3IgZWFjaCBzdWNoIGxheW91dCB0aGF0IHdlIG5lZWQsIHdlIGhhdmVcbiAqIGEgY29ycnNlcG9uZGluZyBTdHJ1Y3RBcnJheUxheW91dCBjbGFzcywgaW5oZXJpdGluZyBmcm9tIFN0cnVjdEFycmF5IGFuZFxuICogaW1wbGVtZW50aW5nIGBlbXBsYWNlQmFjaygpYCBhbmQgYF9yZWZyZXNoVmlld3MoKWAuXG4gKlxuICogSW4gc29tZSBjYXNlcywgd2hlcmUgd2UgbmVlZCB0byBhY2Nlc3MgcGFydGljdWxhciBlbGVtZW50cyBvZiBhIFN0cnVjdEFycmF5LFxuICogd2UgaW1wbGVtZW50IGEgbW9yZSBzcGVjaWZpYyBzdWJjbGFzcyB0aGF0IGluaGVyaXRzIGZyb20gb25lIG9mIHRoZVxuICogU3RydWN0QXJyYXlMYXlvdXRzIGFuZCBhZGRzIGEgYGdldChpKTogVGAgYWNjZXNzb3IgdGhhdCByZXR1cm5zIGEgc3RydWN0dXJlZFxuICogb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIHByb3hpZXMgaW50byB0aGUgdW5kZXJseWluZyBtZW1vcnkgc3BhY2UgZm9yIHRoZVxuICogaS10aCBlbGVtZW50LiAgVGhpcyBhZmZvcmRzIHRoZSBjb252aWVuY2Ugb2Ygd29ya2luZyB3aXRoIChzZWVtaW5nbHkpIHBsYWluXG4gKiBKYXZhc2NyaXB0IG9iamVjdHMgd2l0aG91dCB0aGUgb3ZlcmhlYWQgb2Ygc2VyaWFsaXppbmcvZGVzZXJpYWxpemluZyB0aGVtXG4gKiBpbnRvIEFycmF5QnVmZmVycyBmb3IgZWZmaWNpZW50IHdlYiB3b3JrZXIgdHJhbnNmZXIuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXkge1xuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAvLyBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgb24gdGhlIHByb3RvdHlwZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmlzVHJhbnNmZXJyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYXBhY2l0eSA9IC0xO1xuICAgICAgICB0aGlzLnJlc2l6ZSgwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemUgYSBTdHJ1Y3RBcnJheSBpbnN0YW5jZS4gIFNlcmlhbGl6ZXMgYm90aCB0aGUgcmF3IGRhdGEgYW5kIHRoZVxuICAgICAqIG1ldGFkYXRhIG5lZWRlZCB0byByZWNvbnN0cnVjdCB0aGUgU3RydWN0QXJyYXkgYmFzZSBjbGFzcyBkdXJpbmdcbiAgICAgKiBkZXNlcmlhbGl6YXRpb24uXG4gICAgICovXG4gICAgc3RhdGljIHNlcmlhbGl6ZShhcnJheSAgICAgICAgICAgICAsIHRyYW5zZmVyYWJsZXMgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgYXNzZXJ0KCFhcnJheS5pc1RyYW5zZmVycmVkKTtcblxuICAgICAgICBhcnJheS5fdHJpbSgpO1xuXG4gICAgICAgIGlmICh0cmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICBhcnJheS5pc1RyYW5zZmVycmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMucHVzaChhcnJheS5hcnJheUJ1ZmZlcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGVuZ3RoOiBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgICBhcnJheUJ1ZmZlcjogYXJyYXkuYXJyYXlCdWZmZXIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc3RhdGljIGRlc2VyaWFsaXplKGlucHV0ICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgY29uc3Qgc3RydWN0QXJyYXkgPSBPYmplY3QuY3JlYXRlKHRoaXMucHJvdG90eXBlKTtcbiAgICAgICAgc3RydWN0QXJyYXkuYXJyYXlCdWZmZXIgPSBpbnB1dC5hcnJheUJ1ZmZlcjtcbiAgICAgICAgc3RydWN0QXJyYXkubGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuICAgICAgICBzdHJ1Y3RBcnJheS5jYXBhY2l0eSA9IGlucHV0LmFycmF5QnVmZmVyLmJ5dGVMZW5ndGggLyBzdHJ1Y3RBcnJheS5ieXRlc1BlckVsZW1lbnQ7XG4gICAgICAgIHN0cnVjdEFycmF5Ll9yZWZyZXNoVmlld3MoKTtcbiAgICAgICAgcmV0dXJuIHN0cnVjdEFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2l6ZSB0aGUgYXJyYXkgdG8gZGlzY2FyZCB1bnVzZWQgY2FwYWNpdHkuXG4gICAgICovXG4gICAgX3RyaW0oKSB7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCAhPT0gdGhpcy5jYXBhY2l0eSkge1xuICAgICAgICAgICAgdGhpcy5jYXBhY2l0eSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5hcnJheUJ1ZmZlciA9IHRoaXMuYXJyYXlCdWZmZXIuc2xpY2UoMCwgdGhpcy5sZW5ndGggKiB0aGlzLmJ5dGVzUGVyRWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLl9yZWZyZXNoVmlld3MoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgdG8gMCB3aXRob3V0IGRlLWFsbG9jYXRpbmcgY2FwY2FjaXR5LlxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzaXplIHRoZSBhcnJheS5cbiAgICAgKiBJZiBgbmAgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGxlbmd0aCB0aGVuIGFkZGl0aW9uYWwgZWxlbWVudHMgd2l0aCB1bmRlZmluZWQgdmFsdWVzIGFyZSBhZGRlZC5cbiAgICAgKiBJZiBgbmAgaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50IGxlbmd0aCB0aGVuIHRoZSBhcnJheSB3aWxsIGJlIHJlZHVjZWQgdG8gdGhlIGZpcnN0IGBuYCBlbGVtZW50cy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbmV3IHNpemUgb2YgdGhlIGFycmF5LlxuICAgICAqL1xuICAgIHJlc2l6ZShuICAgICAgICApIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLmlzVHJhbnNmZXJyZWQpO1xuICAgICAgICB0aGlzLnJlc2VydmUobik7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZSBhIHBsYW5uZWQgaW5jcmVhc2UgaW4gc2l6ZSwgc28gdGhhdCBhbnkgbmVjZXNzYXJ5IGFsbG9jYXRpb24gbWF5XG4gICAgICogYmUgZG9uZSBvbmNlLCBhaGVhZCBvZiB0aW1lLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBleHBlY3RlZCBzaXplIG9mIHRoZSBhcnJheS5cbiAgICAgKi9cbiAgICByZXNlcnZlKG4gICAgICAgICkge1xuICAgICAgICBpZiAobiA+IHRoaXMuY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuY2FwYWNpdHkgPSBNYXRoLm1heChuLCBNYXRoLmZsb29yKHRoaXMuY2FwYWNpdHkgKiBSRVNJWkVfTVVMVElQTElFUiksIERFRkFVTFRfQ0FQQUNJVFkpO1xuICAgICAgICAgICAgdGhpcy5hcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcih0aGlzLmNhcGFjaXR5ICogdGhpcy5ieXRlc1BlckVsZW1lbnQpO1xuXG4gICAgICAgICAgICBjb25zdCBvbGRVaW50OEFycmF5ID0gdGhpcy51aW50ODtcbiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hWaWV3cygpO1xuICAgICAgICAgICAgaWYgKG9sZFVpbnQ4QXJyYXkpIHRoaXMudWludDguc2V0KG9sZFVpbnQ4QXJyYXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIFR5cGVkQXJyYXkgdmlld3MgZm9yIHRoZSBjdXJyZW50IEFycmF5QnVmZmVyLlxuICAgICAqL1xuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignX3JlZnJlc2hWaWV3cygpIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZWFjaCBjb25jcmV0ZSBTdHJ1Y3RBcnJheSBsYXlvdXQnKTtcbiAgICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYSBsaXN0IG9mIG1lbWJlciBmaWVsZHMsIGNyZWF0ZSBhIGZ1bGwgU3RydWN0QXJyYXlMYXlvdXQsIGluXG4gKiBwYXJ0aWN1bGFyIGNhbGN1bGF0aW5nIHRoZSBjb3JyZWN0IGJ5dGUgb2Zmc2V0IGZvciBlYWNoIGZpZWxkLiAgVGhpcyBkYXRhXG4gKiBpcyB1c2VkIGF0IGJ1aWxkIHRpbWUgdG8gZ2VuZXJhdGUgU3RydWN0QXJyYXlMYXlvdXRfKiNlbXBsYWNlQmFjaygpIGFuZFxuICogb3RoZXIgYWNjZXNzb3JzLCBhbmQgYXQgcnVudGltZSBmb3IgYmluZGluZyB2ZXJ0ZXggYnVmZmVyIGF0dHJpYnV0ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlTGF5b3V0KFxuICAgIG1lbWJlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgIGFsaWdubWVudCAgICAgICAgID0gMVxuKSAgICAgICAgICAgICAgICAgICAge1xuXG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgbGV0IG1heFNpemUgPSAwO1xuICAgIGNvbnN0IGxheW91dE1lbWJlcnMgPSBtZW1iZXJzLm1hcCgobWVtYmVyKSA9PiB7XG4gICAgICAgIGFzc2VydChtZW1iZXIubmFtZS5sZW5ndGgpO1xuICAgICAgICBjb25zdCB0eXBlU2l6ZSA9IHNpemVPZihtZW1iZXIudHlwZSk7XG4gICAgICAgIGNvbnN0IG1lbWJlck9mZnNldCA9IG9mZnNldCA9IGFsaWduKG9mZnNldCwgTWF0aC5tYXgoYWxpZ25tZW50LCB0eXBlU2l6ZSkpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gbWVtYmVyLmNvbXBvbmVudHMgfHwgMTtcblxuICAgICAgICBtYXhTaXplID0gTWF0aC5tYXgobWF4U2l6ZSwgdHlwZVNpemUpO1xuICAgICAgICBvZmZzZXQgKz0gdHlwZVNpemUgKiBjb21wb25lbnRzO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBtZW1iZXIubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IG1lbWJlci50eXBlLFxuICAgICAgICAgICAgY29tcG9uZW50czogY29tcG9uZW50cyxcbiAgICAgICAgICAgIG9mZnNldDogbWVtYmVyT2Zmc2V0LFxuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2l6ZSA9IGFsaWduKG9mZnNldCwgTWF0aC5tYXgobWF4U2l6ZSwgYWxpZ25tZW50KSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBtZW1iZXJzOiBsYXlvdXRNZW1iZXJzLFxuICAgICAgICBzaXplLFxuICAgICAgICBhbGlnbm1lbnRcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBzaXplT2YodHlwZSAgICAgICAgICApICAgICAgICAge1xuICAgIHJldHVybiB2aWV3VHlwZXNbdHlwZV0uQllURVNfUEVSX0VMRU1FTlQ7XG59XG5cbmZ1bmN0aW9uIGFsaWduKG9mZnNldCAgICAgICAgLCBzaXplICAgICAgICApICAgICAgICAge1xuICAgIHJldHVybiBNYXRoLmNlaWwob2Zmc2V0IC8gc2l6ZSkgKiBzaXplO1xufVxuXG5tb2R1bGUuZXhwb3J0cy5TdHJ1Y3RBcnJheSA9IFN0cnVjdEFycmF5O1xubW9kdWxlLmV4cG9ydHMuU3RydWN0ID0gU3RydWN0O1xubW9kdWxlLmV4cG9ydHMudmlld1R5cGVzID0gdmlld1R5cGVzO1xubW9kdWxlLmV4cG9ydHMuY3JlYXRlTGF5b3V0ID0gY3JlYXRlTGF5b3V0O1xuIiwiLy8gICAgICBcblxuLyoqXG4gKiBUaHJvdHRsZSB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG8gcnVuIGF0IG1vc3QgZXZlcnkgYHBlcmlvZGAgbWlsbGlzZWNvbmRzLlxuIFRocm90dGxlIHRoZSBnaXZlbiBmdW5jdGlvbiB0byBydW4gYXQgbW9zdCBldmVyeSBwZXJpb2QgbWlsbGlzZWNvbmRzLlxuICogQHByaXZhdGVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0aHJvdHRsZShmbiAgICAgICAgICAgICwgdGltZSAgICAgICAgKSAgICAgICAgICAgICAgIHtcbiAgICBsZXQgcGVuZGluZyA9IGZhbHNlO1xuICAgIGxldCB0aW1lcklkID0gMDtcblxuICAgIGNvbnN0IGxhdGVyID0gKCkgPT4ge1xuICAgICAgICB0aW1lcklkID0gMDtcbiAgICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgICAgIGZuKCk7XG4gICAgICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dChsYXRlciwgdGltZSk7XG4gICAgICAgICAgICBwZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgcGVuZGluZyA9IHRydWU7XG4gICAgICAgIGlmICghdGltZXJJZCkge1xuICAgICAgICAgICAgbGF0ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGltZXJJZDtcbiAgICB9O1xufTtcbiIsIi8vICAgICAgXG5cbmNvbnN0IENvb3JkaW5hdGUgPSByZXF1aXJlKCcuLi9nZW8vY29vcmRpbmF0ZScpO1xuY29uc3Qge092ZXJzY2FsZWRUaWxlSUR9ID0gcmVxdWlyZSgnLi4vc291cmNlL3RpbGVfaWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB0aWxlQ292ZXI7XG5cbmZ1bmN0aW9uIHRpbGVDb3Zlcih6ICAgICAgICAsIGJvdW5kcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgICAgICBhY3R1YWxaICAgICAgICAsIHJlbmRlcldvcmxkQ29waWVzICAgICAgICAgICAgICAgICkge1xuICAgIGlmIChyZW5kZXJXb3JsZENvcGllcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlbmRlcldvcmxkQ29waWVzID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgdGlsZXMgPSAxIDw8IHo7XG4gICAgY29uc3QgdCA9IHt9O1xuXG4gICAgZnVuY3Rpb24gc2NhbkxpbmUoeDAsIHgxLCB5KSB7XG4gICAgICAgIGxldCB4LCB3LCB3eCwgY29vcmQ7XG4gICAgICAgIGlmICh5ID49IDAgJiYgeSA8PSB0aWxlcykge1xuICAgICAgICAgICAgZm9yICh4ID0geDA7IHggPCB4MTsgeCsrKSB7XG4gICAgICAgICAgICAgICAgdyA9IE1hdGguZmxvb3IoeCAvIHRpbGVzKTtcbiAgICAgICAgICAgICAgICB3eCA9ICh4ICUgdGlsZXMgKyB0aWxlcykgJSB0aWxlcztcbiAgICAgICAgICAgICAgICBpZiAodyA9PT0gMCB8fCByZW5kZXJXb3JsZENvcGllcyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb29yZCA9IG5ldyBPdmVyc2NhbGVkVGlsZUlEKGFjdHVhbFosIHcsIHosIHd4LCB5KTtcbiAgICAgICAgICAgICAgICAgICAgdFtjb29yZC5rZXldID0gY29vcmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGl2aWRlIHRoZSBzY3JlZW4gdXAgaW4gdHdvIHRyaWFuZ2xlcyBhbmQgc2NhbiBlYWNoIG9mIHRoZW06XG4gICAgLy8gKy0tLS9cbiAgICAvLyB8IC8gfFxuICAgIC8vIC8tLS0rXG4gICAgc2NhblRyaWFuZ2xlKGJvdW5kc1swXSwgYm91bmRzWzFdLCBib3VuZHNbMl0sIDAsIHRpbGVzLCBzY2FuTGluZSk7XG4gICAgc2NhblRyaWFuZ2xlKGJvdW5kc1syXSwgYm91bmRzWzNdLCBib3VuZHNbMF0sIDAsIHRpbGVzLCBzY2FuTGluZSk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXModCkubWFwKChpZCkgPT4ge1xuICAgICAgICByZXR1cm4gdFtpZF07XG4gICAgfSk7XG59XG5cblxuLy8gVGFrZW4gZnJvbSBwb2x5bWFwcyBzcmMvTGF5ZXIuanNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW1wbGVnZW8vcG9seW1hcHMvYmxvYi9tYXN0ZXIvc3JjL0xheWVyLmpzI0wzMzMtTDM4M1xuXG5mdW5jdGlvbiBlZGdlKGEgICAgICAgICAgICAsIGIgICAgICAgICAgICApIHtcbiAgICBpZiAoYS5yb3cgPiBiLnJvdykgeyBjb25zdCB0ID0gYTsgYSA9IGI7IGIgPSB0OyB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDA6IGEuY29sdW1uLFxuICAgICAgICB5MDogYS5yb3csXG4gICAgICAgIHgxOiBiLmNvbHVtbixcbiAgICAgICAgeTE6IGIucm93LFxuICAgICAgICBkeDogYi5jb2x1bW4gLSBhLmNvbHVtbixcbiAgICAgICAgZHk6IGIucm93IC0gYS5yb3dcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBzY2FuU3BhbnMoZTAsIGUxLCB5bWluLCB5bWF4LCBzY2FuTGluZSkge1xuICAgIGNvbnN0IHkwID0gTWF0aC5tYXgoeW1pbiwgTWF0aC5mbG9vcihlMS55MCkpO1xuICAgIGNvbnN0IHkxID0gTWF0aC5taW4oeW1heCwgTWF0aC5jZWlsKGUxLnkxKSk7XG5cbiAgICAvLyBzb3J0IGVkZ2VzIGJ5IHgtY29vcmRpbmF0ZVxuICAgIGlmICgoZTAueDAgPT09IGUxLngwICYmIGUwLnkwID09PSBlMS55MCkgP1xuICAgICAgICAoZTAueDAgKyBlMS5keSAvIGUwLmR5ICogZTAuZHggPCBlMS54MSkgOlxuICAgICAgICAoZTAueDEgLSBlMS5keSAvIGUwLmR5ICogZTAuZHggPCBlMS54MCkpIHtcbiAgICAgICAgY29uc3QgdCA9IGUwOyBlMCA9IGUxOyBlMSA9IHQ7XG4gICAgfVxuXG4gICAgLy8gc2NhbiBsaW5lcyFcbiAgICBjb25zdCBtMCA9IGUwLmR4IC8gZTAuZHk7XG4gICAgY29uc3QgbTEgPSBlMS5keCAvIGUxLmR5O1xuICAgIGNvbnN0IGQwID0gZTAuZHggPiAwOyAvLyB1c2UgeSArIDEgdG8gY29tcHV0ZSB4MFxuICAgIGNvbnN0IGQxID0gZTEuZHggPCAwOyAvLyB1c2UgeSArIDEgdG8gY29tcHV0ZSB4MVxuICAgIGZvciAobGV0IHkgPSB5MDsgeSA8IHkxOyB5KyspIHtcbiAgICAgICAgY29uc3QgeDAgPSBtMCAqIE1hdGgubWF4KDAsIE1hdGgubWluKGUwLmR5LCB5ICsgZDAgLSBlMC55MCkpICsgZTAueDA7XG4gICAgICAgIGNvbnN0IHgxID0gbTEgKiBNYXRoLm1heCgwLCBNYXRoLm1pbihlMS5keSwgeSArIGQxIC0gZTEueTApKSArIGUxLngwO1xuICAgICAgICBzY2FuTGluZShNYXRoLmZsb29yKHgxKSwgTWF0aC5jZWlsKHgwKSwgeSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzY2FuVHJpYW5nbGUoYSAgICAgICAgICAgICwgYiAgICAgICAgICAgICwgYyAgICAgICAgICAgICwgeW1pbiwgeW1heCwgc2NhbkxpbmUpIHtcbiAgICBsZXQgYWIgPSBlZGdlKGEsIGIpLFxuICAgICAgICBiYyA9IGVkZ2UoYiwgYyksXG4gICAgICAgIGNhID0gZWRnZShjLCBhKTtcblxuICAgIGxldCB0O1xuXG4gICAgLy8gc29ydCBlZGdlcyBieSB5LWxlbmd0aFxuICAgIGlmIChhYi5keSA+IGJjLmR5KSB7IHQgPSBhYjsgYWIgPSBiYzsgYmMgPSB0OyB9XG4gICAgaWYgKGFiLmR5ID4gY2EuZHkpIHsgdCA9IGFiOyBhYiA9IGNhOyBjYSA9IHQ7IH1cbiAgICBpZiAoYmMuZHkgPiBjYS5keSkgeyB0ID0gYmM7IGJjID0gY2E7IGNhID0gdDsgfVxuXG4gICAgLy8gc2NhbiBzcGFuISBzY2FuIHNwYW4hXG4gICAgaWYgKGFiLmR5KSBzY2FuU3BhbnMoY2EsIGFiLCB5bWluLCB5bWF4LCBzY2FuTGluZSk7XG4gICAgaWYgKGJjLmR5KSBzY2FuU3BhbnMoY2EsIGJjLCB5bWluLCB5bWF4LCBzY2FuTGluZSk7XG59XG5cbiIsIi8vICAgICAgXG5cbm1vZHVsZS5leHBvcnRzID0gcmVzb2x2ZVRva2VucztcblxuLyoqXG4gKiBSZXBsYWNlIHRva2VucyBpbiBhIHN0cmluZyB0ZW1wbGF0ZSB3aXRoIHZhbHVlcyBpbiBhbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0gcHJvcGVydGllcyBhIGtleS92YWx1ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0b2tlbnMgYW5kIHJlcGxhY2VtZW50c1xuICogQHBhcmFtIHRleHQgdGhlIHRlbXBsYXRlIHN0cmluZ1xuICogQHJldHVybnMgdGhlIHRlbXBsYXRlIHdpdGggdG9rZW5zIHJlcGxhY2VkXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiByZXNvbHZlVG9rZW5zKHByb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICwgdGV4dCAgICAgICAgKSAgICAgICAgIHtcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC97KFtee31dKyl9L2csIChtYXRjaCwga2V5ICAgICAgICApID0+IHtcbiAgICAgICAgcmV0dXJuIGtleSBpbiBwcm9wZXJ0aWVzID8gU3RyaW5nKHByb3BlcnRpZXNba2V5XSkgOiAnJztcbiAgICB9KTtcbn1cbiIsIi8vICAgICAgXG5cbmNvbnN0IFVuaXRCZXppZXIgPSByZXF1aXJlKCdAbWFwYm94L3VuaXRiZXppZXInKTtcbmNvbnN0IENvb3JkaW5hdGUgPSByZXF1aXJlKCcuLi9nZW8vY29vcmRpbmF0ZScpO1xuY29uc3QgUG9pbnQgPSByZXF1aXJlKCdAbWFwYm94L3BvaW50LWdlb21ldHJ5Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4vKipcbiAqIEBtb2R1bGUgdXRpbFxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIEdpdmVuIGEgdmFsdWUgYHRgIHRoYXQgdmFyaWVzIGJldHdlZW4gMCBhbmQgMSwgcmV0dXJuXG4gKiBhbiBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uIHRoYXQgZWFzZXMgYmV0d2VlbiAwIGFuZCAxIGluIGEgcGxlYXNpbmdcbiAqIGN1YmljIGluLW91dCBmYXNoaW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuZWFzZUN1YmljSW5PdXQgPSBmdW5jdGlvbih0ICAgICAgICApICAgICAgICAge1xuICAgIGlmICh0IDw9IDApIHJldHVybiAwO1xuICAgIGlmICh0ID49IDEpIHJldHVybiAxO1xuICAgIGNvbnN0IHQyID0gdCAqIHQsXG4gICAgICAgIHQzID0gdDIgKiB0O1xuICAgIHJldHVybiA0ICogKHQgPCAwLjUgPyB0MyA6IDMgKiAodCAtIHQyKSArIHQzIC0gMC43NSk7XG59O1xuXG4vKipcbiAqIEdpdmVuIGdpdmVuICh4LCB5KSwgKHgxLCB5MSkgY29udHJvbCBwb2ludHMgZm9yIGEgYmV6aWVyIGN1cnZlLFxuICogcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBpbnRlcnBvbGF0ZXMgYWxvbmcgdGhhdCBjdXJ2ZS5cbiAqXG4gKiBAcGFyYW0gcDF4IGNvbnRyb2wgcG9pbnQgMSB4IGNvb3JkaW5hdGVcbiAqIEBwYXJhbSBwMXkgY29udHJvbCBwb2ludCAxIHkgY29vcmRpbmF0ZVxuICogQHBhcmFtIHAyeCBjb250cm9sIHBvaW50IDIgeCBjb29yZGluYXRlXG4gKiBAcGFyYW0gcDJ5IGNvbnRyb2wgcG9pbnQgMiB5IGNvb3JkaW5hdGVcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuYmV6aWVyID0gZnVuY3Rpb24ocDF4ICAgICAgICAsIHAxeSAgICAgICAgLCBwMnggICAgICAgICwgcDJ5ICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgIGNvbnN0IGJlemllciA9IG5ldyBVbml0QmV6aWVyKHAxeCwgcDF5LCBwMngsIHAyeSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQgICAgICAgICkge1xuICAgICAgICByZXR1cm4gYmV6aWVyLnNvbHZlKHQpO1xuICAgIH07XG59O1xuXG4vKipcbiAqIEEgZGVmYXVsdCBiZXppZXItY3VydmUgcG93ZXJlZCBlYXNpbmcgZnVuY3Rpb24gd2l0aFxuICogY29udHJvbCBwb2ludHMgKDAuMjUsIDAuMSkgYW5kICgwLjI1LCAxKVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuZWFzZSA9IGV4cG9ydHMuYmV6aWVyKDAuMjUsIDAuMSwgMC4yNSwgMSk7XG5cbi8qKlxuICogY29uc3RyYWluIG4gdG8gdGhlIGdpdmVuIHJhbmdlIHZpYSBtaW4gKyBtYXhcbiAqXG4gKiBAcGFyYW0gbiB2YWx1ZVxuICogQHBhcmFtIG1pbiB0aGUgbWluaW11bSB2YWx1ZSB0byBiZSByZXR1cm5lZFxuICogQHBhcmFtIG1heCB0aGUgbWF4aW11bSB2YWx1ZSB0byBiZSByZXR1cm5lZFxuICogQHJldHVybnMgdGhlIGNsYW1wZWQgdmFsdWVcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuY2xhbXAgPSBmdW5jdGlvbiAobiAgICAgICAgLCBtaW4gICAgICAgICwgbWF4ICAgICAgICApICAgICAgICAge1xuICAgIHJldHVybiBNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgbikpO1xufTtcblxuLyoqXG4gKiBjb25zdHJhaW4gbiB0byB0aGUgZ2l2ZW4gcmFuZ2UsIGV4Y2x1ZGluZyB0aGUgbWluaW11bSwgdmlhIG1vZHVsYXIgYXJpdGhtZXRpY1xuICpcbiAqIEBwYXJhbSBuIHZhbHVlXG4gKiBAcGFyYW0gbWluIHRoZSBtaW5pbXVtIHZhbHVlIHRvIGJlIHJldHVybmVkLCBleGNsdXNpdmVcbiAqIEBwYXJhbSBtYXggdGhlIG1heGltdW0gdmFsdWUgdG8gYmUgcmV0dXJuZWQsIGluY2x1c2l2ZVxuICogQHJldHVybnMgY29uc3RyYWluZWQgbnVtYmVyXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLndyYXAgPSBmdW5jdGlvbiAobiAgICAgICAgLCBtaW4gICAgICAgICwgbWF4ICAgICAgICApICAgICAgICAge1xuICAgIGNvbnN0IGQgPSBtYXggLSBtaW47XG4gICAgY29uc3QgdyA9ICgobiAtIG1pbikgJSBkICsgZCkgJSBkICsgbWluO1xuICAgIHJldHVybiAodyA9PT0gbWluKSA/IG1heCA6IHc7XG59O1xuXG4vKlxuICogQ2FsbCBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gb24gYW4gYXJyYXkgb2YgYXJndW1lbnRzLFxuICogY2FsbGluZyBgY2FsbGJhY2tgIHdpdGggdGhlIGNvbXBsZXRlZCByZXN1bHRzIG9mIGFsbCBjYWxscy5cbiAqXG4gKiBAcGFyYW0gYXJyYXkgaW5wdXQgdG8gZWFjaCBjYWxsIG9mIHRoZSBhc3luYyBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmbiBhbiBhc3luYyBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSAoZGF0YSwgY2FsbGJhY2spXG4gKiBAcGFyYW0gY2FsbGJhY2sgYSBjYWxsYmFjayBydW4gYWZ0ZXIgYWxsIGFzeW5jIHdvcmsgaXMgZG9uZS5cbiAqIGNhbGxlZCB3aXRoIGFuIGFycmF5LCBjb250YWluaW5nIHRoZSByZXN1bHRzIG9mIGVhY2ggYXN5bmMgY2FsbC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuYXN5bmNBbGwgPSBmdW5jdGlvbiAgICAgICAgICAgICAgIChcbiAgICBhcnJheSAgICAgICAgICAgICAsXG4gICAgZm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLFxuICAgIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgIFxuKSB7XG4gICAgaWYgKCFhcnJheS5sZW5ndGgpIHsgcmV0dXJuIGNhbGxiYWNrKG51bGwsIFtdKTsgfVxuICAgIGxldCByZW1haW5pbmcgPSBhcnJheS5sZW5ndGg7XG4gICAgY29uc3QgcmVzdWx0cyA9IG5ldyBBcnJheShhcnJheS5sZW5ndGgpO1xuICAgIGxldCBlcnJvciA9IG51bGw7XG4gICAgYXJyYXkuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICBmbihpdGVtLCAoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgcmVzdWx0c1tpXSA9ICgocmVzdWx0ICAgICApICAgICAgICApOyAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMjEyM1xuICAgICAgICAgICAgaWYgKC0tcmVtYWluaW5nID09PSAwKSBjYWxsYmFjayhlcnJvciwgcmVzdWx0cyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuLypcbiAqIFBvbHlmaWxsIGZvciBPYmplY3QudmFsdWVzLiBOb3QgZnVsbHkgc3BlYyBjb21wbGlhbnQsIGJ1dCB3ZSBkb24ndFxuICogbmVlZCBpdCB0byBiZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLnZhbHVlcyA9IGZ1bmN0aW9uICAgKG9iaiAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAoY29uc3QgayBpbiBvYmopIHtcbiAgICAgICAgcmVzdWx0LnB1c2gob2JqW2tdKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qXG4gKiBDb21wdXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGtleXMgaW4gb25lIG9iamVjdCBhbmQgdGhlIGtleXNcbiAqIGluIGFub3RoZXIgb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIGtleXMgZGlmZmVyZW5jZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5rZXlzRGlmZmVyZW5jZSA9IGZ1bmN0aW9uICAgICAgKG9iaiAgICAgICAgICAgICAgICAgICAgLCBvdGhlciAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICB7XG4gICAgY29uc3QgZGlmZmVyZW5jZSA9IFtdO1xuICAgIGZvciAoY29uc3QgaSBpbiBvYmopIHtcbiAgICAgICAgaWYgKCEoaSBpbiBvdGhlcikpIHtcbiAgICAgICAgICAgIGRpZmZlcmVuY2UucHVzaChpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlmZmVyZW5jZTtcbn07XG5cbi8qKlxuICogR2l2ZW4gYSBkZXN0aW5hdGlvbiBvYmplY3QgYW5kIG9wdGlvbmFsbHkgbWFueSBzb3VyY2Ugb2JqZWN0cyxcbiAqIGNvcHkgYWxsIHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlIG9iamVjdHMgaW50byB0aGUgZGVzdGluYXRpb24uXG4gKiBUaGUgbGFzdCBzb3VyY2Ugb2JqZWN0IGdpdmVuIG92ZXJyaWRlcyBwcm9wZXJ0aWVzIGZyb20gcHJldmlvdXNcbiAqIHNvdXJjZSBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSBkZXN0IGRlc3RpbmF0aW9uIG9iamVjdFxuICogQHBhcmFtIHNvdXJjZXMgc291cmNlcyBmcm9tIHdoaWNoIHByb3BlcnRpZXMgYXJlIHB1bGxlZFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5leHRlbmQgPSBmdW5jdGlvbiAoZGVzdCAgICAgICAgLCAuLi5zb3VyY2VzICAgICAgICAgICAgICAgICkgICAgICAgICB7XG4gICAgZm9yIChjb25zdCBzcmMgb2Ygc291cmNlcykge1xuICAgICAgICBmb3IgKGNvbnN0IGsgaW4gc3JjKSB7XG4gICAgICAgICAgICBkZXN0W2tdID0gc3JjW2tdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZXN0O1xufTtcblxuLyoqXG4gKiBHaXZlbiBhbiBvYmplY3QgYW5kIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMgYXMgc3RyaW5ncywgcmV0dXJuIHZlcnNpb25cbiAqIG9mIHRoYXQgb2JqZWN0IHdpdGggb25seSB0aG9zZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSBzcmMgdGhlIG9iamVjdFxuICogQHBhcmFtIHByb3BlcnRpZXMgYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgY2hvc2VuXG4gKiB0byBhcHBlYXIgb24gdGhlIHJlc3VsdGluZyBvYmplY3QuXG4gKiBAcmV0dXJucyBvYmplY3Qgd2l0aCBsaW1pdGVkIHByb3BlcnRpZXMuXG4gKiBAZXhhbXBsZVxuICogdmFyIGZvbyA9IHsgbmFtZTogJ0NoYXJsaWUnLCBhZ2U6IDEwIH07XG4gKiB2YXIganVzdE5hbWUgPSBwaWNrKGZvbywgWyduYW1lJ10pO1xuICogLy8ganVzdE5hbWUgPSB7IG5hbWU6ICdDaGFybGllJyB9XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLnBpY2sgPSBmdW5jdGlvbiAoc3JjICAgICAgICAsIHByb3BlcnRpZXMgICAgICAgICAgICAgICApICAgICAgICAge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrID0gcHJvcGVydGllc1tpXTtcbiAgICAgICAgaWYgKGsgaW4gc3JjKSB7XG4gICAgICAgICAgICByZXN1bHRba10gPSBzcmNba107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmxldCBpZCA9IDE7XG5cbi8qKlxuICogUmV0dXJuIGEgdW5pcXVlIG51bWVyaWMgaWQsIHN0YXJ0aW5nIGF0IDEgYW5kIGluY3JlbWVudGluZyB3aXRoXG4gKiBlYWNoIGNhbGwuXG4gKlxuICogQHJldHVybnMgdW5pcXVlIG51bWVyaWMgaWQuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLnVuaXF1ZUlkID0gZnVuY3Rpb24gKCkgICAgICAgICB7XG4gICAgcmV0dXJuIGlkKys7XG59O1xuXG4vKipcbiAqIEdpdmVuIGFuIGFycmF5IG9mIG1lbWJlciBmdW5jdGlvbiBuYW1lcyBhcyBzdHJpbmdzLCByZXBsYWNlIGFsbCBvZiB0aGVtXG4gKiB3aXRoIGJvdW5kIHZlcnNpb25zIHRoYXQgd2lsbCBhbHdheXMgcmVmZXIgdG8gYGNvbnRleHRgIGFzIGB0aGlzYC4gVGhpc1xuICogaXMgdXNlZnVsIGZvciBjbGFzc2VzIHdoZXJlIG90aGVyd2lzZSBldmVudCBiaW5kaW5ncyB3b3VsZCByZWFzc2lnblxuICogYHRoaXNgIHRvIHRoZSBldmVudGVkIG9iamVjdCBvciBzb21lIG90aGVyIHZhbHVlOiB0aGlzIGxldHMgeW91IGVuc3VyZVxuICogdGhlIGB0aGlzYCB2YWx1ZSBhbHdheXMuXG4gKlxuICogQHBhcmFtIGZucyBsaXN0IG9mIG1lbWJlciBmdW5jdGlvbiBuYW1lc1xuICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgdmFsdWVcbiAqIEBleGFtcGxlXG4gKiBmdW5jdGlvbiBNeUNsYXNzKCkge1xuICogICBiaW5kQWxsKFsnb250aW1lciddLCB0aGlzKTtcbiAqICAgdGhpcy5uYW1lID0gJ1RvbSc7XG4gKiB9XG4gKiBNeUNsYXNzLnByb3RvdHlwZS5vbnRpbWVyID0gZnVuY3Rpb24oKSB7XG4gKiAgIGFsZXJ0KHRoaXMubmFtZSk7XG4gKiB9O1xuICogdmFyIG15Q2xhc3MgPSBuZXcgTXlDbGFzcygpO1xuICogc2V0VGltZW91dChteUNsYXNzLm9udGltZXIsIDEwMCk7XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLmJpbmRBbGwgPSBmdW5jdGlvbihmbnMgICAgICAgICAgICAgICAsIGNvbnRleHQgICAgICAgICkgICAgICAge1xuICAgIGZucy5mb3JFYWNoKChmbikgPT4ge1xuICAgICAgICBpZiAoIWNvbnRleHRbZm5dKSB7IHJldHVybjsgfVxuICAgICAgICBjb250ZXh0W2ZuXSA9IGNvbnRleHRbZm5dLmJpbmQoY29udGV4dCk7XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIEdpdmVuIGEgbGlzdCBvZiBjb29yZGluYXRlcywgZ2V0IHRoZWlyIGNlbnRlciBhcyBhIGNvb3JkaW5hdGUuXG4gKlxuICogQHJldHVybnMgY2VudGVycG9pbnRcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuZ2V0Q29vcmRpbmF0ZXNDZW50ZXIgPSBmdW5jdGlvbihjb29yZHMgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICB7XG4gICAgbGV0IG1pblggPSBJbmZpbml0eTtcbiAgICBsZXQgbWluWSA9IEluZmluaXR5O1xuICAgIGxldCBtYXhYID0gLUluZmluaXR5O1xuICAgIGxldCBtYXhZID0gLUluZmluaXR5O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIGNvb3Jkc1tpXS5jb2x1bW4pO1xuICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgY29vcmRzW2ldLnJvdyk7XG4gICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBjb29yZHNbaV0uY29sdW1uKTtcbiAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIGNvb3Jkc1tpXS5yb3cpO1xuICAgIH1cblxuICAgIGNvbnN0IGR4ID0gbWF4WCAtIG1pblg7XG4gICAgY29uc3QgZHkgPSBtYXhZIC0gbWluWTtcbiAgICBjb25zdCBkTWF4ID0gTWF0aC5tYXgoZHgsIGR5KTtcbiAgICBjb25zdCB6b29tID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigtTWF0aC5sb2coZE1heCkgLyBNYXRoLkxOMikpO1xuICAgIHJldHVybiBuZXcgQ29vcmRpbmF0ZSgobWluWCArIG1heFgpIC8gMiwgKG1pblkgKyBtYXhZKSAvIDIsIDApXG4gICAgICAgIC56b29tVG8oem9vbSk7XG59O1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHN0cmluZyBlbmRzIHdpdGggYSBwYXJ0aWN1bGFyIHN1YnN0cmluZ1xuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuZW5kc1dpdGggPSBmdW5jdGlvbihzdHJpbmcgICAgICAgICwgc3VmZml4ICAgICAgICApICAgICAgICAgIHtcbiAgICByZXR1cm4gc3RyaW5nLmluZGV4T2Yoc3VmZml4LCBzdHJpbmcubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gb2JqZWN0IGJ5IG1hcHBpbmcgYWxsIHRoZSB2YWx1ZXMgb2YgYW4gZXhpc3Rpbmcgb2JqZWN0IHdoaWxlXG4gKiBwcmVzZXJ2aW5nIHRoZWlyIGtleXMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5tYXBPYmplY3QgPSBmdW5jdGlvbihpbnB1dCAgICAgICAgLCBpdGVyYXRvciAgICAgICAgICAsIGNvbnRleHQgICAgICAgICApICAgICAgICAge1xuICAgIGNvbnN0IG91dHB1dCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIGlucHV0KSB7XG4gICAgICAgIG91dHB1dFtrZXldID0gaXRlcmF0b3IuY2FsbChjb250ZXh0IHx8IHRoaXMsIGlucHV0W2tleV0sIGtleSwgaW5wdXQpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gb2JqZWN0IGJ5IGZpbHRlcmluZyBvdXQgdmFsdWVzIG9mIGFuIGV4aXN0aW5nIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLmZpbHRlck9iamVjdCA9IGZ1bmN0aW9uKGlucHV0ICAgICAgICAsIGl0ZXJhdG9yICAgICAgICAgICwgY29udGV4dCAgICAgICAgICkgICAgICAgICB7XG4gICAgY29uc3Qgb3V0cHV0ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gaW5wdXQpIHtcbiAgICAgICAgaWYgKGl0ZXJhdG9yLmNhbGwoY29udGV4dCB8fCB0aGlzLCBpbnB1dFtrZXldLCBrZXksIGlucHV0KSkge1xuICAgICAgICAgICAgb3V0cHV0W2tleV0gPSBpbnB1dFtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG59O1xuXG5leHBvcnRzLmRlZXBFcXVhbCA9IHJlcXVpcmUoJy4uL3N0eWxlLXNwZWMvdXRpbC9kZWVwX2VxdWFsJyk7XG5cbi8qKlxuICogRGVlcGx5IGNsb25lcyB0d28gb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLmNsb25lID0gZnVuY3Rpb24gICAoaW5wdXQgICApICAgIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0Lm1hcChleHBvcnRzLmNsb25lKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJiYgaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuICgoZXhwb3J0cy5tYXBPYmplY3QoaW5wdXQsIGV4cG9ydHMuY2xvbmUpICAgICApICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxufTtcblxuLyoqXG4gKiBDaGVjayBpZiB0d28gYXJyYXlzIGhhdmUgYXQgbGVhc3Qgb25lIGNvbW1vbiBlbGVtZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuYXJyYXlzSW50ZXJzZWN0ID0gZnVuY3Rpb24gICAoYSAgICAgICAgICAsIGIgICAgICAgICAgKSAgICAgICAgICB7XG4gICAgZm9yIChsZXQgbCA9IDA7IGwgPCBhLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIGlmIChiLmluZGV4T2YoYVtsXSkgPj0gMCkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUHJpbnQgYSB3YXJuaW5nIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUgYW5kIGVuc3VyZSBkdXBsaWNhdGUgd2FybmluZyBtZXNzYWdlc1xuICogYXJlIG5vdCBwcmludGVkLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IHdhcm5PbmNlSGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgID0ge307XG5leHBvcnRzLndhcm5PbmNlID0gZnVuY3Rpb24obWVzc2FnZSAgICAgICAgKSAgICAgICB7XG4gICAgaWYgKCF3YXJuT25jZUhpc3RvcnlbbWVzc2FnZV0pIHtcbiAgICAgICAgLy8gY29uc29sZSBpc24ndCBkZWZpbmVkIGluIHNvbWUgV2ViV29ya2Vycywgc2VlICMyNTU4XG4gICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIikgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICAgICAgICB3YXJuT25jZUhpc3RvcnlbbWVzc2FnZV0gPSB0cnVlO1xuICAgIH1cbn07XG5cbi8qKlxuICogSW5kaWNhdGVzIGlmIHRoZSBwcm92aWRlZCBQb2ludHMgYXJlIGluIGEgY291bnRlciBjbG9ja3dpc2UgKHRydWUpIG9yIGNsb2Nrd2lzZSAoZmFsc2UpIG9yZGVyXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHRydWUgZm9yIGEgY291bnRlciBjbG9ja3dpc2Ugc2V0IG9mIHBvaW50c1xuICovXG4vLyBodHRwOi8vYnJ5Y2Vib2UuY29tLzIwMDYvMTAvMjMvbGluZS1zZWdtZW50LWludGVyc2VjdGlvbi1hbGdvcml0aG0vXG5leHBvcnRzLmlzQ291bnRlckNsb2Nrd2lzZSA9IGZ1bmN0aW9uKGEgICAgICAgLCBiICAgICAgICwgYyAgICAgICApICAgICAgICAgIHtcbiAgICByZXR1cm4gKGMueSAtIGEueSkgKiAoYi54IC0gYS54KSA+IChiLnkgLSBhLnkpICogKGMueCAtIGEueCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHNpZ25lZCBhcmVhIGZvciB0aGUgcG9seWdvbiByaW5nLiAgUG9zdGl2ZSBhcmVhcyBhcmUgZXh0ZXJpb3IgcmluZ3MgYW5kXG4gKiBoYXZlIGEgY2xvY2t3aXNlIHdpbmRpbmcuICBOZWdhdGl2ZSBhcmVhcyBhcmUgaW50ZXJpb3IgcmluZ3MgYW5kIGhhdmUgYSBjb3VudGVyIGNsb2Nrd2lzZVxuICogb3JkZXJpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSByaW5nIEV4dGVyaW9yIG9yIGludGVyaW9yIHJpbmdcbiAqL1xuZXhwb3J0cy5jYWxjdWxhdGVTaWduZWRBcmVhID0gZnVuY3Rpb24ocmluZyAgICAgICAgICAgICAgKSAgICAgICAgIHtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcmluZy5sZW5ndGgsIGogPSBsZW4gLSAxLCBwMSwgcDI7IGkgPCBsZW47IGogPSBpKyspIHtcbiAgICAgICAgcDEgPSByaW5nW2ldO1xuICAgICAgICBwMiA9IHJpbmdbal07XG4gICAgICAgIHN1bSArPSAocDIueCAtIHAxLngpICogKHAxLnkgKyBwMi55KTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bTtcbn07XG5cbi8qKlxuICogRGV0ZWN0cyBjbG9zZWQgcG9seWdvbnMsIGZpcnN0ICsgbGFzdCBwb2ludCBhcmUgZXF1YWxcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHBvaW50cyBhcnJheSBvZiBwb2ludHNcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcG9pbnRzIGFyZSBhIGNsb3NlZCBwb2x5Z29uXG4gKi9cbmV4cG9ydHMuaXNDbG9zZWRQb2x5Z29uID0gZnVuY3Rpb24ocG9pbnRzICAgICAgICAgICAgICApICAgICAgICAgIHtcbiAgICAvLyBJZiBpdCBpcyAyIHBvaW50cyB0aGF0IGFyZSB0aGUgc2FtZSB0aGVuIGl0IGlzIGEgcG9pbnRcbiAgICAvLyBJZiBpdCBpcyAzIHBvaW50cyB3aXRoIHN0YXJ0IGFuZCBlbmQgdGhlIHNhbWUgdGhlbiBpdCBpcyBhIGxpbmVcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IHAxID0gcG9pbnRzWzBdO1xuICAgIGNvbnN0IHAyID0gcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXTtcblxuICAgIGlmIChNYXRoLmFicyhwMS54IC0gcDIueCkgPiAwIHx8XG4gICAgICAgIE1hdGguYWJzKHAxLnkgLSBwMi55KSA+IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIHBvbHlnb24gc2ltcGxpZmljYXRpb24gY2FuIHByb2R1Y2UgcG9seWdvbnMgd2l0aCB6ZXJvIGFyZWEgYW5kIG1vcmUgdGhhbiAzIHBvaW50c1xuICAgIHJldHVybiAoTWF0aC5hYnMoZXhwb3J0cy5jYWxjdWxhdGVTaWduZWRBcmVhKHBvaW50cykpID4gMC4wMSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHNwaGVyaWNhbCBjb29yZGluYXRlcyB0byBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBzcGhlcmljYWwgU3BoZXJpY2FsIGNvb3JkaW5hdGVzLCBpbiBbcmFkaWFsLCBhemltdXRoYWwsIHBvbGFyXVxuICogQHJldHVybiBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMgaW4gW3gsIHksIHpdXG4gKi9cblxuZXhwb3J0cy5zcGhlcmljYWxUb0NhcnRlc2lhbiA9IGZ1bmN0aW9uKFtyLCBhemltdXRoYWwsIHBvbGFyXSAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAvLyBXZSBhYnN0cmFjdCBcIm5vcnRoXCIvXCJ1cFwiIChjb21wYXNzLXdpc2UpIHRvIGJlIDDCsCB3aGVuIHJlYWxseSB0aGlzIGlzIDkwwrAgKM+ALzIpOlxuICAgIC8vIGNvcnJlY3QgZm9yIHRoYXQgaGVyZVxuICAgIGF6aW11dGhhbCArPSA5MDtcblxuICAgIC8vIENvbnZlcnQgYXppbXV0aGFsIGFuZCBwb2xhciBhbmdsZXMgdG8gcmFkaWFuc1xuICAgIGF6aW11dGhhbCAqPSBNYXRoLlBJIC8gMTgwO1xuICAgIHBvbGFyICo9IE1hdGguUEkgLyAxODA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB4OiByICogTWF0aC5jb3MoYXppbXV0aGFsKSAqIE1hdGguc2luKHBvbGFyKSxcbiAgICAgICAgeTogciAqIE1hdGguc2luKGF6aW11dGhhbCkgKiBNYXRoLnNpbihwb2xhciksXG4gICAgICAgIHo6IHIgKiBNYXRoLmNvcyhwb2xhcilcbiAgICB9O1xufTtcblxuLyoqXG4gKiBQYXJzZXMgZGF0YSBmcm9tICdDYWNoZS1Db250cm9sJyBoZWFkZXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gY2FjaGVDb250cm9sIFZhbHVlIG9mICdDYWNoZS1Db250cm9sJyBoZWFkZXJcbiAqIEByZXR1cm4gb2JqZWN0IGNvbnRhaW5pbmcgcGFyc2VkIGhlYWRlciBpbmZvLlxuICovXG5cbmV4cG9ydHMucGFyc2VDYWNoZUNvbnRyb2wgPSBmdW5jdGlvbihjYWNoZUNvbnRyb2wgICAgICAgICkgICAgICAgICB7XG4gICAgLy8gVGFrZW4gZnJvbSBbV3JlY2tdKGh0dHBzOi8vZ2l0aHViLmNvbS9oYXBpanMvd3JlY2spXG4gICAgY29uc3QgcmUgPSAvKD86XnwoPzpcXHMqXFwsXFxzKikpKFteXFx4MDAtXFx4MjBcXChcXCk8PkBcXCw7XFw6XFxcXFwiXFwvXFxbXFxdXFw/XFw9XFx7XFx9XFx4N0ZdKykoPzpcXD0oPzooW15cXHgwMC1cXHgyMFxcKFxcKTw+QFxcLDtcXDpcXFxcXCJcXC9cXFtcXF1cXD9cXD1cXHtcXH1cXHg3Rl0rKXwoPzpcXFwiKCg/OlteXCJcXFxcXXxcXFxcLikqKVxcXCIpKSk/L2c7XG5cbiAgICBjb25zdCBoZWFkZXIgPSB7fTtcbiAgICBjYWNoZUNvbnRyb2wucmVwbGFjZShyZSwgKCQwLCAkMSwgJDIsICQzKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gJDIgfHwgJDM7XG4gICAgICAgIGhlYWRlclskMV0gPSB2YWx1ZSA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiB0cnVlO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSk7XG5cbiAgICBpZiAoaGVhZGVyWydtYXgtYWdlJ10pIHtcbiAgICAgICAgY29uc3QgbWF4QWdlID0gcGFyc2VJbnQoaGVhZGVyWydtYXgtYWdlJ10sIDEwKTtcbiAgICAgICAgaWYgKGlzTmFOKG1heEFnZSkpIGRlbGV0ZSBoZWFkZXJbJ21heC1hZ2UnXTtcbiAgICAgICAgZWxzZSBoZWFkZXJbJ21heC1hZ2UnXSA9IG1heEFnZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVyO1xufTtcbiIsIi8vICAgICAgXG5cbmNsYXNzIEZlYXR1cmUge1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IodmVjdG9yVGlsZUZlYXR1cmUgICAgICAgICAgICAgICAgICAgLCB6ICAgICAgICAsIHggICAgICAgICwgeSAgICAgICAgKSB7XG4gICAgICAgIHRoaXMudHlwZSA9ICdGZWF0dXJlJztcblxuICAgICAgICB0aGlzLl92ZWN0b3JUaWxlRmVhdHVyZSA9IHZlY3RvclRpbGVGZWF0dXJlO1xuICAgICAgICAodmVjdG9yVGlsZUZlYXR1cmUgICAgICkuX3ogPSB6O1xuICAgICAgICAodmVjdG9yVGlsZUZlYXR1cmUgICAgICkuX3ggPSB4O1xuICAgICAgICAodmVjdG9yVGlsZUZlYXR1cmUgICAgICkuX3kgPSB5O1xuXG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHZlY3RvclRpbGVGZWF0dXJlLnByb3BlcnRpZXM7XG5cbiAgICAgICAgaWYgKHZlY3RvclRpbGVGZWF0dXJlLmlkICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaWQgPSB2ZWN0b3JUaWxlRmVhdHVyZS5pZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBnZW9tZXRyeSgpICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgaWYgKHRoaXMuX2dlb21ldHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2dlb21ldHJ5ID0gdGhpcy5fdmVjdG9yVGlsZUZlYXR1cmUudG9HZW9KU09OKFxuICAgICAgICAgICAgICAgICh0aGlzLl92ZWN0b3JUaWxlRmVhdHVyZSAgICAgKS5feCxcbiAgICAgICAgICAgICAgICAodGhpcy5fdmVjdG9yVGlsZUZlYXR1cmUgICAgICkuX3ksXG4gICAgICAgICAgICAgICAgKHRoaXMuX3ZlY3RvclRpbGVGZWF0dXJlICAgICApLl96KS5nZW9tZXRyeTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZ2VvbWV0cnk7XG4gICAgfVxuXG4gICAgc2V0IGdlb21ldHJ5KGcgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5fZ2VvbWV0cnkgPSBnO1xuICAgIH1cblxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QganNvbiA9IHtcbiAgICAgICAgICAgIGdlb21ldHJ5OiB0aGlzLmdlb21ldHJ5XG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3QgaSBpbiB0aGlzKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gJ19nZW9tZXRyeScgfHwgaSA9PT0gJ192ZWN0b3JUaWxlRmVhdHVyZScpIGNvbnRpbnVlO1xuICAgICAgICAgICAganNvbltpXSA9ICh0aGlzICAgICApW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBGZWF0dXJlO1xuIiwiLy8gICAgICBcblxuY29uc3Qgc2NyaXB0RGV0ZWN0aW9uID0gcmVxdWlyZSgnLi9zY3JpcHRfZGV0ZWN0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdmVydGljYWxpemVQdW5jdHVhdGlvbihpbnB1dCAgICAgICAgKSB7XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBuZXh0Q2hhckNvZGUgPSBpbnB1dC5jaGFyQ29kZUF0KGkgKyAxKSB8fCBudWxsO1xuICAgICAgICBjb25zdCBwcmV2Q2hhckNvZGUgPSBpbnB1dC5jaGFyQ29kZUF0KGkgLSAxKSB8fCBudWxsO1xuXG4gICAgICAgIGNvbnN0IGNhblJlcGxhY2VQdW5jdHVhdGlvbiA9IChcbiAgICAgICAgICAgICghbmV4dENoYXJDb2RlIHx8ICFzY3JpcHREZXRlY3Rpb24uY2hhckhhc1JvdGF0ZWRWZXJ0aWNhbE9yaWVudGF0aW9uKG5leHRDaGFyQ29kZSkgfHwgbW9kdWxlLmV4cG9ydHMubG9va3VwW2lucHV0W2kgKyAxXV0pICYmXG4gICAgICAgICAgICAoIXByZXZDaGFyQ29kZSB8fCAhc2NyaXB0RGV0ZWN0aW9uLmNoYXJIYXNSb3RhdGVkVmVydGljYWxPcmllbnRhdGlvbihwcmV2Q2hhckNvZGUpIHx8IG1vZHVsZS5leHBvcnRzLmxvb2t1cFtpbnB1dFtpIC0gMV1dKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChjYW5SZXBsYWNlUHVuY3R1YXRpb24gJiYgbW9kdWxlLmV4cG9ydHMubG9va3VwW2lucHV0W2ldXSkge1xuICAgICAgICAgICAgb3V0cHV0ICs9IG1vZHVsZS5leHBvcnRzLmxvb2t1cFtpbnB1dFtpXV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQgKz0gaW5wdXRbaV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xufTtcblxubW9kdWxlLmV4cG9ydHMubG9va3VwID0ge1xuICAgICchJzogJ++4lScsXG4gICAgJyMnOiAn77yDJyxcbiAgICAnJCc6ICfvvIQnLFxuICAgICclJzogJ++8hScsXG4gICAgJyYnOiAn77yGJyxcbiAgICAnKCc6ICfvuLUnLFxuICAgICcpJzogJ++4ticsXG4gICAgJyonOiAn77yKJyxcbiAgICAnKyc6ICfvvIsnLFxuICAgICcsJzogJ++4kCcsXG4gICAgJy0nOiAn77iyJyxcbiAgICAnLic6ICfjg7snLFxuICAgICcvJzogJ++8jycsXG4gICAgJzonOiAn77iTJyxcbiAgICAnOyc6ICfvuJQnLFxuICAgICc8JzogJ++4vycsXG4gICAgJz0nOiAn77ydJyxcbiAgICAnPic6ICfvuYAnLFxuICAgICc/JzogJ++4licsXG4gICAgJ0AnOiAn77ygJyxcbiAgICAnWyc6ICfvuYcnLFxuICAgICdcXFxcJzogJ++8vCcsXG4gICAgJ10nOiAn77mIJyxcbiAgICAnXic6ICfvvL4nLFxuICAgICdfJzogJ++4sycsXG4gICAgJ2AnOiAn772AJyxcbiAgICAneyc6ICfvuLcnLFxuICAgICd8JzogJ+KAlScsXG4gICAgJ30nOiAn77i4JyxcbiAgICAnfic6ICfvvZ4nLFxuICAgICfCoic6ICfvv6AnLFxuICAgICfCoyc6ICfvv6EnLFxuICAgICfCpSc6ICfvv6UnLFxuICAgICfCpic6ICfvv6QnLFxuICAgICfCrCc6ICfvv6InLFxuICAgICfCryc6ICfvv6MnLFxuICAgICfigJMnOiAn77iyJyxcbiAgICAn4oCUJzogJ++4sScsXG4gICAgJ+KAmCc6ICfvuYMnLFxuICAgICfigJknOiAn77mEJyxcbiAgICAn4oCcJzogJ++5gScsXG4gICAgJ+KAnSc6ICfvuYInLFxuICAgICfigKYnOiAn77iZJyxcbiAgICAn4oCnJzogJ+ODuycsXG4gICAgJ+KCqSc6ICfvv6YnLFxuICAgICfjgIEnOiAn77iRJyxcbiAgICAn44CCJzogJ++4kicsXG4gICAgJ+OAiCc6ICfvuL8nLFxuICAgICfjgIknOiAn77mAJyxcbiAgICAn44CKJzogJ++4vScsXG4gICAgJ+OAiyc6ICfvuL4nLFxuICAgICfjgIwnOiAn77mBJyxcbiAgICAn44CNJzogJ++5gicsXG4gICAgJ+OAjic6ICfvuYMnLFxuICAgICfjgI8nOiAn77mEJyxcbiAgICAn44CQJzogJ++4uycsXG4gICAgJ+OAkSc6ICfvuLwnLFxuICAgICfjgJQnOiAn77i5JyxcbiAgICAn44CVJzogJ++4uicsXG4gICAgJ+OAlic6ICfvuJcnLFxuICAgICfjgJcnOiAn77iYJyxcbiAgICAn77yBJzogJ++4lScsXG4gICAgJ++8iCc6ICfvuLUnLFxuICAgICfvvIknOiAn77i2JyxcbiAgICAn77yMJzogJ++4kCcsXG4gICAgJ++8jSc6ICfvuLInLFxuICAgICfvvI4nOiAn44O7JyxcbiAgICAn77yaJzogJ++4kycsXG4gICAgJ++8myc6ICfvuJQnLFxuICAgICfvvJwnOiAn77i/JyxcbiAgICAn77yeJzogJ++5gCcsXG4gICAgJ++8nyc6ICfvuJYnLFxuICAgICfvvLsnOiAn77mHJyxcbiAgICAn77y9JzogJ++5iCcsXG4gICAgJ++8vyc6ICfvuLMnLFxuICAgICfvvZsnOiAn77i3JyxcbiAgICAn772cJzogJ+KAlScsXG4gICAgJ++9nSc6ICfvuLgnLFxuICAgICfvvZ8nOiAn77i1JyxcbiAgICAn772gJzogJ++4ticsXG4gICAgJ++9oSc6ICfvuJInLFxuICAgICfvvaInOiAn77mBJyxcbiAgICAn772jJzogJ++5gidcbn07XG4iLCIvLyAgICAgIFxuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcblxuY29uc3QgR3JpZCA9IHJlcXVpcmUoJ2dyaWQtaW5kZXgnKTtcbmNvbnN0IENvbG9yID0gcmVxdWlyZSgnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yJyk7XG5jb25zdCB7XG4gICAgU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uLFxuICAgIFN0eWxlRXhwcmVzc2lvbixcbiAgICBTdHlsZUV4cHJlc3Npb25XaXRoRXJyb3JIYW5kbGluZyxcbiAgICBab29tRGVwZW5kZW50RXhwcmVzc2lvbixcbiAgICBab29tQ29uc3RhbnRFeHByZXNzaW9uXG59ID0gcmVxdWlyZSgnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uJyk7XG5jb25zdCB7Q29tcG91bmRFeHByZXNzaW9ufSA9IHJlcXVpcmUoJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9jb21wb3VuZF9leHByZXNzaW9uJyk7XG5jb25zdCBleHByZXNzaW9ucyA9IHJlcXVpcmUoJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucycpO1xuY29uc3Qge0ltYWdlRGF0YX0gPSByZXF1aXJlKCcuL3dpbmRvdycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICBcbiAgICAgICAgICBcbiAgICAgICAgICAgICBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIFxuICAgICAgICAgIFxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICBcbiAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIFxuXG5jb25zdCByZWdpc3RyeSAgICAgICAgICAgPSB7fTtcblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgZ2l2ZW4gY2xhc3MgYXMgc2VyaWFsaXphYmxlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gb3B0aW9ucy5vbWl0IExpc3Qgb2YgcHJvcGVydGllcyB0byBvbWl0IGZyb20gc2VyaWFsaXphdGlvbiAoZS5nLiwgY2FjaGVkL2NvbXB1dGVkIHByb3BlcnRpZXMpXG4gKiBAcGFyYW0gb3B0aW9ucy5zaGFsbG93IExpc3Qgb2YgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSBzZXJpYWxpemVkIGJ5IGEgc2ltcGxlIHNoYWxsb3cgY29weSwgcmF0aGVyIHRoYW4gYnkgYSByZWN1cnNpdmUgY2FsbCB0byBzZXJpYWxpemUoKS5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiByZWdpc3RlciAgICAgICAgKG5hbWUgICAgICAgICwga2xhc3MgICAgICAgICAgLCBvcHRpb25zICAgICAgICAgICAgICAgICAgICAgPSB7fSkge1xuICAgIGFzc2VydCghcmVnaXN0cnlbbmFtZV0sIGAke25hbWV9IGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5gKTtcbiAgICAoT2JqZWN0LmRlZmluZVByb3BlcnR5ICAgICApKGtsYXNzLCAnX2NsYXNzUmVnaXN0cnlLZXknLCB7XG4gICAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgICB3cml0ZWFibGU6IGZhbHNlXG4gICAgfSk7XG4gICAgcmVnaXN0cnlbbmFtZV0gPSB7XG4gICAgICAgIGtsYXNzLFxuICAgICAgICBvbWl0OiBvcHRpb25zLm9taXQgfHwgW10sXG4gICAgICAgIHNoYWxsb3c6IG9wdGlvbnMuc2hhbGxvdyB8fCBbXVxuICAgIH07XG59XG5cbnJlZ2lzdGVyKCdPYmplY3QnLCBPYmplY3QpO1xuXG5HcmlkLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uIHNlcmlhbGl6ZUdyaWQoZ3JpZCAgICAgICwgdHJhbnNmZXJhYmxlcyAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgIHtcbiAgICBjb25zdCBhYiA9IGdyaWQudG9BcnJheUJ1ZmZlcigpO1xuICAgIGlmICh0cmFuc2ZlcmFibGVzKSB7XG4gICAgICAgIHRyYW5zZmVyYWJsZXMucHVzaChhYik7XG4gICAgfVxuICAgIHJldHVybiBhYjtcbn07XG5cbkdyaWQuZGVzZXJpYWxpemUgPSBmdW5jdGlvbiBkZXNlcmlhbGl6ZUdyaWQoc2VyaWFsaXplZCAgICAgICAgICAgICApICAgICAgIHtcbiAgICByZXR1cm4gbmV3IEdyaWQoc2VyaWFsaXplZCk7XG59O1xucmVnaXN0ZXIoJ0dyaWQnLCBHcmlkKTtcblxucmVnaXN0ZXIoJ0NvbG9yJywgQ29sb3IpO1xuXG5yZWdpc3RlcignU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uJywgU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uKTtcbnJlZ2lzdGVyKCdTdHlsZUV4cHJlc3Npb24nLCBTdHlsZUV4cHJlc3Npb24sIHtvbWl0OiBbJ19ldmFsdWF0b3InXX0pO1xucmVnaXN0ZXIoXG4gICAgJ1N0eWxlRXhwcmVzc2lvbldpdGhFcnJvckhhbmRsaW5nJyxcbiAgICBTdHlsZUV4cHJlc3Npb25XaXRoRXJyb3JIYW5kbGluZyxcbiAgICB7b21pdDogWydfZXZhbHVhdG9yJ119XG4pO1xucmVnaXN0ZXIoJ1pvb21EZXBlbmRlbnRFeHByZXNzaW9uJywgWm9vbURlcGVuZGVudEV4cHJlc3Npb24pO1xucmVnaXN0ZXIoJ1pvb21Db25zdGFudEV4cHJlc3Npb24nLCBab29tQ29uc3RhbnRFeHByZXNzaW9uKTtcbnJlZ2lzdGVyKCdDb21wb3VuZEV4cHJlc3Npb24nLCBDb21wb3VuZEV4cHJlc3Npb24sIHtvbWl0OiBbJ19ldmFsdWF0ZSddfSk7XG5mb3IgKGNvbnN0IG5hbWUgaW4gZXhwcmVzc2lvbnMpIHtcbiAgICBpZiAoKGV4cHJlc3Npb25zW25hbWVdICAgICApLl9jbGFzc1JlZ2lzdHJ5S2V5KSBjb250aW51ZTtcbiAgICByZWdpc3RlcihgRXhwcmVzc2lvbl8ke25hbWV9YCwgZXhwcmVzc2lvbnNbbmFtZV0pO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSB0aGUgZ2l2ZW4gb2JqZWN0IGZvciB0cmFuc2ZlciB0byBvciBmcm9tIGEgd2ViIHdvcmtlci5cbiAqXG4gKiBGb3Igbm9uLWJ1aWx0aW4gdHlwZXMsIHJlY3Vyc2l2ZWx5IHNlcmlhbGl6ZSBlYWNoIHByb3BlcnR5IChwb3NzaWJseVxuICogb21pdHRpbmcgY2VydGFpbiBwcm9wZXJ0aWVzIC0gc2VlIHJlZ2lzdGVyKCkpLCBhbmQgcGFja2FnZSB0aGUgcmVzdWx0IGFsb25nXG4gKiB3aXRoIHRoZSBjb25zdHJ1Y3RvcidzIGBuYW1lYCBzbyB0aGF0IHRoZSBhcHByb3ByaWF0ZSBjb25zdHJ1Y3RvciBjYW4gYmVcbiAqIGxvb2tlZCB1cCBpbiBgZGVzZXJpYWxpemUoKWAuXG4gKlxuICogSWYgYSBgdHJhbnNmZXJhYmxlc2AgYXJyYXkgaXMgcHJvdmlkZWQsIGFkZCBhbnkgdHJhbnNmZXJhYmxlIG9iamVjdHMgKGkuZS4sXG4gKiBhbnkgQXJyYXlCdWZmZXJzIG9yIEFycmF5QnVmZmVyIHZpZXdzKSB0byB0aGUgbGlzdC4gKElmIGEgY29weSBpcyBuZWVkZWQsXG4gKiB0aGlzIHNob3VsZCBoYXBwZW4gaW4gdGhlIGNsaWVudCBjb2RlLCBiZWZvcmUgdXNpbmcgc2VyaWFsaXplKCkuKVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNlcmlhbGl6ZShpbnB1dCAgICAgICAsIHRyYW5zZmVyYWJsZXMgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICB7XG4gICAgaWYgKGlucHV0ID09PSBudWxsIHx8XG4gICAgICAgIGlucHV0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJyB8fFxuICAgICAgICB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgQm9vbGVhbiB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIE51bWJlciB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIFN0cmluZyB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cblxuICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgIGlmICh0cmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICB0cmFuc2ZlcmFibGVzLnB1c2goaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGlucHV0KSkge1xuICAgICAgICBjb25zdCB2aWV3ICAgICAgICAgICAgICAgICAgID0gKGlucHV0ICAgICApO1xuICAgICAgICBpZiAodHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgdHJhbnNmZXJhYmxlcy5wdXNoKHZpZXcuYnVmZmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlldztcbiAgICB9XG5cbiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcbiAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMucHVzaChpbnB1dC5kYXRhLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpbnB1dCkge1xuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKHNlcmlhbGl6ZShpdGVtLCB0cmFuc2ZlcmFibGVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3Qga2xhc3MgPSAoaW5wdXQuY29uc3RydWN0b3IgICAgICk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBrbGFzcy5fY2xhc3NSZWdpc3RyeUtleTtcbiAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbid0IHNlcmlhbGl6ZSBvYmplY3Qgb2YgdW5yZWdpc3RlcmVkIGNsYXNzYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KHJlZ2lzdHJ5W25hbWVdKTtcblxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgID0ge307XG5cbiAgICAgICAgaWYgKGtsYXNzLnNlcmlhbGl6ZSkge1xuICAgICAgICAgICAgLy8gKFRlbXBvcmFyeSB3b3JrYXJvdW5kKSBhbGxvdyBhIGNsYXNzIHRvIHByb3ZpZGUgc3RhdGljXG4gICAgICAgICAgICAvLyBgc2VyaWFsaXplKClgIGFuZCBgZGVzZXJpYWxpemUoKWAgbWV0aG9kcyB0byBieXBhc3MgdGhlIGdlbmVyaWNcbiAgICAgICAgICAgIC8vIGFwcHJvYWNoLlxuICAgICAgICAgICAgLy8gVGhpcyB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBsZXRzIHVzIHVzZSB0aGUgZ2VuZXJpYyBzZXJpYWxpemF0aW9uXG4gICAgICAgICAgICAvLyBhcHByb2FjaCBmb3Igb2JqZWN0cyB3aG9zZSBtZW1iZXJzIGluY2x1ZGUgaW5zdGFuY2VzIG9mIGR5bmFtaWNcbiAgICAgICAgICAgIC8vIFN0cnVjdEFycmF5IHR5cGVzLiBPbmNlIHdlIHJlZmFjdG9yIFN0cnVjdEFycmF5IHRvIGJlIHN0YXRpYyxcbiAgICAgICAgICAgIC8vIHdlIGNhbiByZW1vdmUgdGhpcyBjb21wbGV4aXR5LlxuICAgICAgICAgICAgcHJvcGVydGllcy5fc2VyaWFsaXplZCA9IChrbGFzcy5zZXJpYWxpemUgICAgICAgICAgICAgICAgICApKGlucHV0LCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGlucHV0KSB7XG4gICAgICAgICAgICAgICAgLy8gYW55IGNhc3QgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy81MzkzXG4gICAgICAgICAgICAgICAgaWYgKCEoaW5wdXQgICAgICkuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlZ2lzdHJ5W25hbWVdLm9taXQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gKGlucHV0ICAgICApW2tleV07XG4gICAgICAgICAgICAgICAgcHJvcGVydGllc1trZXldID0gcmVnaXN0cnlbbmFtZV0uc2hhbGxvdy5pbmRleE9mKGtleSkgPj0gMCA/XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5IDpcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHByb3BlcnR5LCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7bmFtZSwgcHJvcGVydGllc307XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBzZXJpYWxpemUgb2JqZWN0IG9mIHR5cGUgJHt0eXBlb2YgaW5wdXR9YCk7XG59XG5cbmZ1bmN0aW9uIGRlc2VyaWFsaXplKGlucHV0ICAgICAgICAgICAgKSAgICAgICAge1xuICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fFxuICAgICAgICBpbnB1dCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIEJvb2xlYW4gfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBOdW1iZXIgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmcgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgUmVnRXhwIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHxcbiAgICAgICAgQXJyYXlCdWZmZXIuaXNWaWV3KGlucHV0KSB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIEltYWdlRGF0YSkge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBpbnB1dC5tYXAoKGkpID0+IGRlc2VyaWFsaXplKGkpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCB7bmFtZSwgcHJvcGVydGllc30gPSAoaW5wdXQgICAgICk7XG4gICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBkZXNlcmlhbGl6ZSBvYmplY3Qgb2YgYW5vbnltb3VzIGNsYXNzYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7a2xhc3N9ID0gcmVnaXN0cnlbbmFtZV07XG4gICAgICAgIGlmICgha2xhc3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgY2FuJ3QgZGVzZXJpYWxpemUgdW5yZWdpc3RlcmVkIGNsYXNzICR7bmFtZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrbGFzcy5kZXNlcmlhbGl6ZSkge1xuICAgICAgICAgICAgcmV0dXJuIChrbGFzcy5kZXNlcmlhbGl6ZSAgICAgICAgICAgICAgICAgICAgKShwcm9wZXJ0aWVzLl9zZXJpYWxpemVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUoa2xhc3MucHJvdG90eXBlKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKSkge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSByZWdpc3RyeVtuYW1lXS5zaGFsbG93LmluZGV4T2Yoa2V5KSA+PSAwID9cbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzW2tleV0gOiBkZXNlcmlhbGl6ZShwcm9wZXJ0aWVzW2tleV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbid0IGRlc2VyaWFsaXplIG9iamVjdCBvZiB0eXBlICR7dHlwZW9mIGlucHV0fWApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICByZWdpc3RlcixcbiAgICBzZXJpYWxpemUsXG4gICAgZGVzZXJpYWxpemVcbn07XG4iLCIvLyAgICAgIFxuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcbmNvbnN0IFdlYldvcmtlciA9IHJlcXVpcmUoJy4vd2ViX3dvcmtlcicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4vKipcbiAqIENvbnN0cnVjdHMgYSB3b3JrZXIgcG9vbC5cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFdvcmtlclBvb2wge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlID0ge307XG4gICAgfVxuXG4gICAgYWNxdWlyZShtYXBJZCAgICAgICAgKSB7XG4gICAgICAgIGlmICghdGhpcy53b3JrZXJzKSB7XG4gICAgICAgICAgICAvLyBMYXppbHkgbG9vayB1cCB0aGUgdmFsdWUgb2YgbWFwYm94Z2wud29ya2VyQ291bnQuICBUaGlzIGFsbG93c1xuICAgICAgICAgICAgLy8gY2xpZW50IGNvZGUgYSBjaGFuY2UgdG8gc2V0IGl0IHdoaWxlIGNpcmN1bXZlbnRpbmcgY3ljbGljXG4gICAgICAgICAgICAvLyBkZXBlbmRlbmN5IHByb2JsZW1zXG4gICAgICAgICAgICBjb25zdCB3b3JrZXJDb3VudCA9IHJlcXVpcmUoJy4uLycpLndvcmtlckNvdW50O1xuICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiB3b3JrZXJDb3VudCA9PT0gJ251bWJlcicgJiYgd29ya2VyQ291bnQgPCBJbmZpbml0eSk7XG5cbiAgICAgICAgICAgIHRoaXMud29ya2VycyA9IFtdO1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMud29ya2Vycy5sZW5ndGggPCB3b3JrZXJDb3VudCkge1xuICAgICAgICAgICAgICAgIHRoaXMud29ya2Vycy5wdXNoKG5ldyBXZWJXb3JrZXIoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFjdGl2ZVttYXBJZF0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy53b3JrZXJzLnNsaWNlKCk7XG4gICAgfVxuXG4gICAgcmVsZWFzZShtYXBJZCAgICAgICAgKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmFjdGl2ZVttYXBJZF07XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmFjdGl2ZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLndvcmtlcnMuZm9yRWFjaCgodykgPT4ge1xuICAgICAgICAgICAgICAgIHcudGVybWluYXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMud29ya2VycyA9IChudWxsICAgICApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFdvcmtlclBvb2w7XG4iXX0=